blob: 624ad1b225148eeb509ebde60416fa604ae1ed6f [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)
218 variables.Platform_version_active_codenames = []string{"Q"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900219 variables.Platform_vndk_version = proptools.StringPtr("29")
Paul Duffin37aad602021-03-08 09:47:16 +0000220 }),
221)
222
Paul Duffin52bfaa42021-03-23 23:40:12 +0000223var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
224 "system/sepolicy/apex/myapex-file_contexts": nil,
225})
226
Jooyung Han643adc42020-02-27 13:50:06 +0900227// ensure that 'result' equals 'expected'
228func ensureEquals(t *testing.T, result string, expected string) {
229 t.Helper()
230 if result != expected {
231 t.Errorf("%q != %q", expected, result)
232 }
233}
234
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235// ensure that 'result' contains 'expected'
236func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900237 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900238 if !strings.Contains(result, expected) {
239 t.Errorf("%q is not found in %q", expected, result)
240 }
241}
242
Liz Kammer5bd365f2020-05-27 15:15:11 -0700243// ensure that 'result' contains 'expected' exactly one time
244func ensureContainsOnce(t *testing.T, result string, expected string) {
245 t.Helper()
246 count := strings.Count(result, expected)
247 if count != 1 {
248 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
249 }
250}
251
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252// ensures that 'result' does not contain 'notExpected'
253func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900254 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255 if strings.Contains(result, notExpected) {
256 t.Errorf("%q is found in %q", notExpected, result)
257 }
258}
259
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700260func ensureMatches(t *testing.T, result string, expectedRex string) {
261 ok, err := regexp.MatchString(expectedRex, result)
262 if err != nil {
263 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
264 return
265 }
266 if !ok {
267 t.Errorf("%s does not match regular expession %s", result, expectedRex)
268 }
269}
270
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900272 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273 if !android.InList(expected, result) {
274 t.Errorf("%q is not found in %v", expected, result)
275 }
276}
277
278func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if android.InList(notExpected, result) {
281 t.Errorf("%q is found in %v", notExpected, result)
282 }
283}
284
Jooyung Hane1633032019-08-01 17:41:43 +0900285func ensureListEmpty(t *testing.T, result []string) {
286 t.Helper()
287 if len(result) > 0 {
288 t.Errorf("%q is expected to be empty", result)
289 }
290}
291
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000292func ensureListNotEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) == 0 {
295 t.Errorf("%q is expected to be not empty", result)
296 }
297}
298
Jiyong Park25fc6a92018-11-18 18:02:45 +0900299// Minimal test
300func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800301 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900302 apex_defaults {
303 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900304 manifest: ":myapex.manifest",
305 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900307 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900308 native_shared_libs: [
309 "mylib",
310 "libfoo.ffi",
311 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900312 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800313 multilib: {
314 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800316 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900317 },
Jiyong Park77acec62020-06-01 21:39:15 +0900318 java_libs: [
319 "myjar",
320 "myjar_dex",
321 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000322 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 }
324
Jiyong Park30ca9372019-02-07 16:27:23 +0900325 apex {
326 name: "myapex",
327 defaults: ["myapex-defaults"],
328 }
329
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 apex_key {
331 name: "myapex.key",
332 public_key: "testkey.avbpubkey",
333 private_key: "testkey.pem",
334 }
335
Jiyong Park809bb722019-02-13 21:33:49 +0900336 filegroup {
337 name: "myapex.manifest",
338 srcs: ["apex_manifest.json"],
339 }
340
341 filegroup {
342 name: "myapex.androidmanifest",
343 srcs: ["AndroidManifest.xml"],
344 }
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346 cc_library {
347 name: "mylib",
348 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900349 shared_libs: [
350 "mylib2",
351 "libbar.ffi",
352 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 system_shared_libs: [],
354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000355 // TODO: remove //apex_available:platform
356 apex_available: [
357 "//apex_available:platform",
358 "myapex",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 }
361
Alex Light3d673592019-01-18 14:37:31 -0800362 cc_binary {
363 name: "foo",
364 srcs: ["mylib.cpp"],
365 compile_multilib: "both",
366 multilib: {
367 lib32: {
368 suffix: "32",
369 },
370 lib64: {
371 suffix: "64",
372 },
373 },
374 symlinks: ["foo_link_"],
375 symlink_preferred_arch: true,
376 system_shared_libs: [],
377 static_executable: true,
378 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700379 apex_available: [ "myapex", "com.android.gki.*" ],
380 }
381
Jiyong Park99644e92020-11-17 22:21:02 +0900382 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000383 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900384 srcs: ["foo.rs"],
385 rlibs: ["libfoo.rlib.rust"],
386 dylibs: ["libfoo.dylib.rust"],
387 apex_available: ["myapex"],
388 }
389
390 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000391 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900392 srcs: ["foo.rs"],
393 crate_name: "foo",
394 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900395 shared_libs: ["libfoo.shared_from_rust"],
396 }
397
398 cc_library_shared {
399 name: "libfoo.shared_from_rust",
400 srcs: ["mylib.cpp"],
401 system_shared_libs: [],
402 stl: "none",
403 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900404 }
405
406 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000407 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900408 srcs: ["foo.rs"],
409 crate_name: "foo",
410 apex_available: ["myapex"],
411 }
412
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900413 rust_ffi_shared {
414 name: "libfoo.ffi",
415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
420 rust_ffi_shared {
421 name: "libbar.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "bar",
424 apex_available: ["myapex"],
425 }
426
Yifan Hongd22a84a2020-07-28 17:37:46 -0700427 apex {
428 name: "com.android.gki.fake",
429 binaries: ["foo"],
430 key: "myapex.key",
431 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000432 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800433 }
434
Paul Duffindddd5462020-04-07 15:25:44 +0100435 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900436 name: "mylib2",
437 srcs: ["mylib.cpp"],
438 system_shared_libs: [],
439 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900440 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900441 static_libs: ["libstatic"],
442 // TODO: remove //apex_available:platform
443 apex_available: [
444 "//apex_available:platform",
445 "myapex",
446 ],
447 }
448
Paul Duffindddd5462020-04-07 15:25:44 +0100449 cc_prebuilt_library_shared {
450 name: "mylib2",
451 srcs: ["prebuilt.so"],
452 // TODO: remove //apex_available:platform
453 apex_available: [
454 "//apex_available:platform",
455 "myapex",
456 ],
457 }
458
Jiyong Park9918e1a2020-03-17 19:16:40 +0900459 cc_library_static {
460 name: "libstatic",
461 srcs: ["mylib.cpp"],
462 system_shared_libs: [],
463 stl: "none",
464 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000465 // TODO: remove //apex_available:platform
466 apex_available: [
467 "//apex_available:platform",
468 "myapex",
469 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900470 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471
472 java_library {
473 name: "myjar",
474 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900475 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 sdk_version: "none",
477 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900479 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000480 // TODO: remove //apex_available:platform
481 apex_available: [
482 "//apex_available:platform",
483 "myapex",
484 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 }
486
Jiyong Park77acec62020-06-01 21:39:15 +0900487 dex_import {
488 name: "myjar_dex",
489 jars: ["prebuilt.jar"],
490 apex_available: [
491 "//apex_available:platform",
492 "myapex",
493 ],
494 }
495
Jiyong Park7f7766d2019-07-25 22:02:35 +0900496 java_library {
497 name: "myotherjar",
498 srcs: ["foo/bar/MyClass.java"],
499 sdk_version: "none",
500 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900501 // TODO: remove //apex_available:platform
502 apex_available: [
503 "//apex_available:platform",
504 "myapex",
505 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900506 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900507
508 java_library {
509 name: "mysharedjar",
510 srcs: ["foo/bar/MyClass.java"],
511 sdk_version: "none",
512 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900513 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900514 `)
515
Paul Duffina71a67a2021-03-29 00:42:57 +0100516 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900517
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900518 // Make sure that Android.mk is created
519 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700520 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900521 var builder strings.Builder
522 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
523
524 androidMk := builder.String()
525 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
526 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
527
Jiyong Park42cca6c2019-04-01 11:15:50 +0900528 optFlags := apexRule.Args["opt_flags"]
529 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700530 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100531 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532
Jiyong Park25fc6a92018-11-18 18:02:45 +0900533 copyCmds := apexRule.Args["copy_commands"]
534
535 // Ensure that main rule creates an output
536 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
537
538 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700539 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
540 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900544
545 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800554 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
555 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900556 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900557 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900558 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900561 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900562 // .. but not for java libs
563 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900564 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800565
Colin Cross7113d202019-11-20 16:39:12 -0800566 // Ensure that the platform variant ends with _shared or _common
567 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
570 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
572
573 // Ensure that dynamic dependency to java libs are not included
574 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800575
576 // Ensure that all symlinks are present.
577 found_foo_link_64 := false
578 found_foo := false
579 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900580 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800581 if strings.HasSuffix(cmd, "bin/foo") {
582 found_foo = true
583 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
584 found_foo_link_64 = true
585 }
586 }
587 }
588 good := found_foo && found_foo_link_64
589 if !good {
590 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
591 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900592
Sundong Ahnabb64432019-10-22 13:58:29 +0900593 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700594 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900595 if len(noticeInputs) != 3 {
596 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900597 }
598 ensureListContains(t, noticeInputs, "NOTICE")
599 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900600 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900601
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
605 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
606 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100607
608 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800613}
614
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800616 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 apex_defaults {
618 name: "myapex-defaults",
619 key: "myapex.key",
620 prebuilts: ["myetc"],
621 native_shared_libs: ["mylib"],
622 java_libs: ["myjar"],
623 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900624 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800625 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000626 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 }
628
629 prebuilt_etc {
630 name: "myetc",
631 src: "myprebuilt",
632 }
633
634 apex {
635 name: "myapex",
636 defaults: ["myapex-defaults"],
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
645 cc_library {
646 name: "mylib",
647 system_shared_libs: [],
648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 java_library {
653 name: "myjar",
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 }
659
660 android_app {
661 name: "AppFoo",
662 srcs: ["foo/bar/MyClass.java"],
663 sdk_version: "none",
664 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000665 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900667
668 runtime_resource_overlay {
669 name: "rro",
670 theme: "blue",
671 }
672
markchien2f59ec92020-09-02 16:23:38 +0800673 bpf {
674 name: "bpf",
675 srcs: ["bpf.c", "bpf2.c"],
676 }
677
Jooyung Hanf21c7972019-12-16 22:32:06 +0900678 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000679 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 "etc/myetc",
681 "javalib/myjar.jar",
682 "lib64/mylib.so",
683 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900684 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800685 "etc/bpf/bpf.o",
686 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 })
688}
689
Jooyung Han01a3ee22019-11-02 02:52:25 +0900690func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800691 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692 apex {
693 name: "myapex",
694 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000695 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696 }
697
698 apex_key {
699 name: "myapex.key",
700 public_key: "testkey.avbpubkey",
701 private_key: "testkey.pem",
702 }
703 `)
704
705 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900706 args := module.Rule("apexRule").Args
707 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
708 t.Error("manifest should be apex_manifest.pb, but " + manifest)
709 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900710}
711
Liz Kammer4854a7d2021-05-27 14:28:27 -0400712func TestApexManifestMinSdkVersion(t *testing.T) {
713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Alex Light5098a612018-11-29 17:12:15 -0800785func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800786 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800787 apex {
788 name: "myapex",
789 key: "myapex.key",
790 payload_type: "zip",
791 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000792 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800793 }
794
795 apex_key {
796 name: "myapex.key",
797 public_key: "testkey.avbpubkey",
798 private_key: "testkey.pem",
799 }
800
801 cc_library {
802 name: "mylib",
803 srcs: ["mylib.cpp"],
804 shared_libs: ["mylib2"],
805 system_shared_libs: [],
806 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000807 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800808 }
809
810 cc_library {
811 name: "mylib2",
812 srcs: ["mylib.cpp"],
813 system_shared_libs: [],
814 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000815 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800816 }
817 `)
818
Sundong Ahnabb64432019-10-22 13:58:29 +0900819 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800820 copyCmds := zipApexRule.Args["copy_commands"]
821
822 // Ensure that main rule creates an output
823 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
824
825 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700826 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800827
828 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800830
831 // Ensure that both direct and indirect deps are copied into apex
832 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
833 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834}
835
836func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800837 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838 apex {
839 name: "myapex",
840 key: "myapex.key",
841 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park7d55b612021-06-11 17:22:09 +0900842 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000843 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844 }
845
846 apex_key {
847 name: "myapex.key",
848 public_key: "testkey.avbpubkey",
849 private_key: "testkey.pem",
850 }
851
852 cc_library {
853 name: "mylib",
854 srcs: ["mylib.cpp"],
855 shared_libs: ["mylib2", "mylib3"],
856 system_shared_libs: [],
857 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000858 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900859 }
860
861 cc_library {
862 name: "mylib2",
863 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900864 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865 system_shared_libs: [],
866 stl: "none",
867 stubs: {
868 versions: ["1", "2", "3"],
869 },
870 }
871
872 cc_library {
873 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900874 srcs: ["mylib.cpp"],
875 shared_libs: ["mylib4"],
876 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 stl: "none",
878 stubs: {
879 versions: ["10", "11", "12"],
880 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000881 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900883
884 cc_library {
885 name: "mylib4",
886 srcs: ["mylib.cpp"],
887 system_shared_libs: [],
888 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000889 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900890 }
Jiyong Park7d55b612021-06-11 17:22:09 +0900891
892 rust_binary {
893 name: "foo.rust",
894 srcs: ["foo.rs"],
895 shared_libs: ["libfoo.shared_from_rust"],
896 prefer_rlib: true,
897 apex_available: ["myapex"],
898 }
899
900 cc_library_shared {
901 name: "libfoo.shared_from_rust",
902 srcs: ["mylib.cpp"],
903 system_shared_libs: [],
904 stl: "none",
905 stubs: {
906 versions: ["10", "11", "12"],
907 },
908 }
909
Jiyong Park25fc6a92018-11-18 18:02:45 +0900910 `)
911
Sundong Ahnabb64432019-10-22 13:58:29 +0900912 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 copyCmds := apexRule.Args["copy_commands"]
914
915 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800916 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917
918 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800919 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
Colin Crossaede88c2020-08-11 12:17:01 -0700924 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
926 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900927 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900929 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930
931 // 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 -0700932 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700934 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900935
936 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900937 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900938 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900939
940 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700941 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942
Jooyung Hana57af4a2020-01-23 05:36:59 +0000943 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900944 "lib64/mylib.so",
945 "lib64/mylib3.so",
946 "lib64/mylib4.so",
Jiyong Park7d55b612021-06-11 17:22:09 +0900947 "bin/foo.rust",
948 "lib64/libc++.so", // by the implicit dependency from foo.rust
949 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900950 })
Jiyong Park7d55b612021-06-11 17:22:09 +0900951
952 // Ensure that stub dependency from a rust module is not included
953 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
954 // The rust module is linked to the stub cc library
955 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
956 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
957 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958}
959
Colin Cross7812fd32020-09-25 12:35:10 -0700960func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
961 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800962 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700963 apex {
964 name: "myapex",
965 key: "myapex.key",
966 native_shared_libs: ["mylib", "mylib3"],
967 min_sdk_version: "29",
968 }
969
970 apex_key {
971 name: "myapex.key",
972 public_key: "testkey.avbpubkey",
973 private_key: "testkey.pem",
974 }
975
976 cc_library {
977 name: "mylib",
978 srcs: ["mylib.cpp"],
979 shared_libs: ["mylib2", "mylib3"],
980 system_shared_libs: [],
981 stl: "none",
982 apex_available: [ "myapex" ],
983 min_sdk_version: "28",
984 }
985
986 cc_library {
987 name: "mylib2",
988 srcs: ["mylib.cpp"],
989 cflags: ["-include mylib.h"],
990 system_shared_libs: [],
991 stl: "none",
992 stubs: {
993 versions: ["28", "29", "30", "current"],
994 },
995 min_sdk_version: "28",
996 }
997
998 cc_library {
999 name: "mylib3",
1000 srcs: ["mylib.cpp"],
1001 shared_libs: ["mylib4"],
1002 system_shared_libs: [],
1003 stl: "none",
1004 stubs: {
1005 versions: ["28", "29", "30", "current"],
1006 },
1007 apex_available: [ "myapex" ],
1008 min_sdk_version: "28",
1009 }
1010
1011 cc_library {
1012 name: "mylib4",
1013 srcs: ["mylib.cpp"],
1014 system_shared_libs: [],
1015 stl: "none",
1016 apex_available: [ "myapex" ],
1017 min_sdk_version: "28",
1018 }
1019 `)
1020
1021 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1022 copyCmds := apexRule.Args["copy_commands"]
1023
1024 // Ensure that direct non-stubs dep is always included
1025 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1026
1027 // Ensure that indirect stubs dep is not included
1028 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1029
1030 // Ensure that direct stubs dep is included
1031 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1032
1033 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1034
Jiyong Park55549df2021-02-26 23:57:23 +09001035 // Ensure that mylib is linking with the latest version of stub for mylib2
1036 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001037 // ... and not linking to the non-stub (impl) variant of mylib2
1038 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1039
1040 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1041 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1042 // .. and not linking to the stubs variant of mylib3
1043 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1044
1045 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001046 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001047 ensureNotContains(t, mylib2Cflags, "-include ")
1048
1049 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001050 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001051
1052 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1053 "lib64/mylib.so",
1054 "lib64/mylib3.so",
1055 "lib64/mylib4.so",
1056 })
1057}
1058
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001059func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1060 t.Parallel()
1061 // myapex (Z)
1062 // mylib -----------------.
1063 // |
1064 // otherapex (29) |
1065 // libstub's versions: 29 Z current
1066 // |
1067 // <platform> |
1068 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001069 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001070 apex {
1071 name: "myapex",
1072 key: "myapex.key",
1073 native_shared_libs: ["mylib"],
1074 min_sdk_version: "Z", // non-final
1075 }
1076
1077 cc_library {
1078 name: "mylib",
1079 srcs: ["mylib.cpp"],
1080 shared_libs: ["libstub"],
1081 apex_available: ["myapex"],
1082 min_sdk_version: "Z",
1083 }
1084
1085 apex_key {
1086 name: "myapex.key",
1087 public_key: "testkey.avbpubkey",
1088 private_key: "testkey.pem",
1089 }
1090
1091 apex {
1092 name: "otherapex",
1093 key: "myapex.key",
1094 native_shared_libs: ["libstub"],
1095 min_sdk_version: "29",
1096 }
1097
1098 cc_library {
1099 name: "libstub",
1100 srcs: ["mylib.cpp"],
1101 stubs: {
1102 versions: ["29", "Z", "current"],
1103 },
1104 apex_available: ["otherapex"],
1105 min_sdk_version: "29",
1106 }
1107
1108 // platform module depending on libstub from otherapex should use the latest stub("current")
1109 cc_library {
1110 name: "libplatform",
1111 srcs: ["mylib.cpp"],
1112 shared_libs: ["libstub"],
1113 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001114 `,
1115 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1116 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1117 variables.Platform_sdk_final = proptools.BoolPtr(false)
1118 variables.Platform_version_active_codenames = []string{"Z"}
1119 }),
1120 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001121
Jiyong Park55549df2021-02-26 23:57:23 +09001122 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001123 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001124 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001125 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001126 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001127
1128 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1129 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1130 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1131 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1132 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1133}
1134
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001135func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001136 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001137 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001138 name: "myapex2",
1139 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001140 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001141 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001142 }
1143
1144 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001145 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001146 public_key: "testkey.avbpubkey",
1147 private_key: "testkey.pem",
1148 }
1149
1150 cc_library {
1151 name: "mylib",
1152 srcs: ["mylib.cpp"],
1153 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001154 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001155 system_shared_libs: [],
1156 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001157 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001158 }
1159
1160 cc_library {
1161 name: "libfoo",
1162 srcs: ["mylib.cpp"],
1163 shared_libs: ["libbar"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 stubs: {
1167 versions: ["10", "20", "30"],
1168 },
1169 }
1170
1171 cc_library {
1172 name: "libbar",
1173 srcs: ["mylib.cpp"],
1174 system_shared_libs: [],
1175 stl: "none",
1176 }
1177
Jiyong Park678c8812020-02-07 17:25:49 +09001178 cc_library_static {
1179 name: "libbaz",
1180 srcs: ["mylib.cpp"],
1181 system_shared_libs: [],
1182 stl: "none",
1183 apex_available: [ "myapex2" ],
1184 }
1185
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001186 `)
1187
Jiyong Park83dc74b2020-01-14 18:38:44 +09001188 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001189 copyCmds := apexRule.Args["copy_commands"]
1190
1191 // Ensure that direct non-stubs dep is always included
1192 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1193
1194 // Ensure that indirect stubs dep is not included
1195 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1196
1197 // Ensure that dependency of stubs is not included
1198 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1199
Colin Crossaede88c2020-08-11 12:17:01 -07001200 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001201
1202 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001203 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001204 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001205 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001206
Jiyong Park3ff16992019-12-27 14:11:47 +09001207 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001208
1209 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1210 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001211
Artur Satayeva8bd1132020-04-27 18:07:06 +01001212 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001213 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001214
Artur Satayeva8bd1132020-04-27 18:07:06 +01001215 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001216 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001217}
1218
Jooyung Hand3639552019-08-09 12:57:43 +09001219func TestApexWithRuntimeLibsDependency(t *testing.T) {
1220 /*
1221 myapex
1222 |
1223 v (runtime_libs)
1224 mylib ------+------> libfoo [provides stub]
1225 |
1226 `------> libbar
1227 */
Colin Cross1c460562021-02-16 17:55:47 -08001228 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001229 apex {
1230 name: "myapex",
1231 key: "myapex.key",
1232 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001233 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001234 }
1235
1236 apex_key {
1237 name: "myapex.key",
1238 public_key: "testkey.avbpubkey",
1239 private_key: "testkey.pem",
1240 }
1241
1242 cc_library {
1243 name: "mylib",
1244 srcs: ["mylib.cpp"],
1245 runtime_libs: ["libfoo", "libbar"],
1246 system_shared_libs: [],
1247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001248 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001249 }
1250
1251 cc_library {
1252 name: "libfoo",
1253 srcs: ["mylib.cpp"],
1254 system_shared_libs: [],
1255 stl: "none",
1256 stubs: {
1257 versions: ["10", "20", "30"],
1258 },
1259 }
1260
1261 cc_library {
1262 name: "libbar",
1263 srcs: ["mylib.cpp"],
1264 system_shared_libs: [],
1265 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001266 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001267 }
1268
1269 `)
1270
Sundong Ahnabb64432019-10-22 13:58:29 +09001271 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +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 runtime_libs dep in included
1281 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1282
Sundong Ahnabb64432019-10-22 13:58:29 +09001283 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001284 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1285 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001286
1287}
1288
Paul Duffina02cae32021-03-09 01:44:06 +00001289var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1290 cc.PrepareForTestWithCcBuildComponents,
1291 PrepareForTestWithApexBuildComponents,
1292 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001293 apex {
1294 name: "com.android.runtime",
1295 key: "com.android.runtime.key",
1296 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001297 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001298 }
1299
1300 apex_key {
1301 name: "com.android.runtime.key",
1302 public_key: "testkey.avbpubkey",
1303 private_key: "testkey.pem",
1304 }
Paul Duffina02cae32021-03-09 01:44:06 +00001305 `),
1306 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1307)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001308
Paul Duffina02cae32021-03-09 01:44:06 +00001309func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001310 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001311 cc_library {
1312 name: "libc",
1313 no_libcrt: true,
1314 nocrt: true,
1315 stl: "none",
1316 system_shared_libs: [],
1317 stubs: { versions: ["1"] },
1318 apex_available: ["com.android.runtime"],
1319
1320 sanitize: {
1321 hwaddress: true,
1322 }
1323 }
1324
1325 cc_prebuilt_library_shared {
1326 name: "libclang_rt.hwasan-aarch64-android",
1327 no_libcrt: true,
1328 nocrt: true,
1329 stl: "none",
1330 system_shared_libs: [],
1331 srcs: [""],
1332 stubs: { versions: ["1"] },
1333
1334 sanitize: {
1335 never: true,
1336 },
Paul Duffina02cae32021-03-09 01:44:06 +00001337 } `)
1338 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001339
1340 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1341 "lib64/bionic/libc.so",
1342 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1343 })
1344
1345 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1346
1347 installed := hwasan.Description("install libclang_rt.hwasan")
1348 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1349
1350 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1351 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1352 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1353}
1354
1355func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001356 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001357 prepareForTestOfRuntimeApexWithHwasan,
1358 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1359 variables.SanitizeDevice = []string{"hwaddress"}
1360 }),
1361 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001362 cc_library {
1363 name: "libc",
1364 no_libcrt: true,
1365 nocrt: true,
1366 stl: "none",
1367 system_shared_libs: [],
1368 stubs: { versions: ["1"] },
1369 apex_available: ["com.android.runtime"],
1370 }
1371
1372 cc_prebuilt_library_shared {
1373 name: "libclang_rt.hwasan-aarch64-android",
1374 no_libcrt: true,
1375 nocrt: true,
1376 stl: "none",
1377 system_shared_libs: [],
1378 srcs: [""],
1379 stubs: { versions: ["1"] },
1380
1381 sanitize: {
1382 never: true,
1383 },
1384 }
Paul Duffina02cae32021-03-09 01:44:06 +00001385 `)
1386 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001387
1388 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1389 "lib64/bionic/libc.so",
1390 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1391 })
1392
1393 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1394
1395 installed := hwasan.Description("install libclang_rt.hwasan")
1396 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1397
1398 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1399 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1400 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1401}
1402
Jooyung Han61b66e92020-03-21 14:21:46 +00001403func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1404 testcases := []struct {
1405 name string
1406 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001407 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001408 shouldLink string
1409 shouldNotLink []string
1410 }{
1411 {
Jiyong Park55549df2021-02-26 23:57:23 +09001412 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001413 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001414 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001415 shouldLink: "current",
1416 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001417 },
1418 {
Jiyong Park55549df2021-02-26 23:57:23 +09001419 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001420 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001421 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001422 shouldLink: "current",
1423 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001424 },
1425 }
1426 for _, tc := range testcases {
1427 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001428 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001429 apex {
1430 name: "myapex",
1431 key: "myapex.key",
1432 use_vendor: true,
1433 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001434 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001435 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001436 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001437
Jooyung Han61b66e92020-03-21 14:21:46 +00001438 apex_key {
1439 name: "myapex.key",
1440 public_key: "testkey.avbpubkey",
1441 private_key: "testkey.pem",
1442 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001443
Jooyung Han61b66e92020-03-21 14:21:46 +00001444 cc_library {
1445 name: "mylib",
1446 srcs: ["mylib.cpp"],
1447 vendor_available: true,
1448 shared_libs: ["libbar"],
1449 system_shared_libs: [],
1450 stl: "none",
1451 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001452 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001453 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001454
Jooyung Han61b66e92020-03-21 14:21:46 +00001455 cc_library {
1456 name: "libbar",
1457 srcs: ["mylib.cpp"],
1458 system_shared_libs: [],
1459 stl: "none",
1460 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001461 llndk: {
1462 symbol_file: "libbar.map.txt",
1463 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001464 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001465 `,
1466 setUseVendorAllowListForTest([]string{"myapex"}),
1467 withUnbundledBuild,
1468 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001469
Jooyung Han61b66e92020-03-21 14:21:46 +00001470 // Ensure that LLNDK dep is not included
1471 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1472 "lib64/mylib.so",
1473 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001474
Jooyung Han61b66e92020-03-21 14:21:46 +00001475 // Ensure that LLNDK dep is required
1476 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1477 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1478 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001479
Jiyong Parkf58c46e2021-04-01 21:35:20 +09001480 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.29_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1481 ensureContains(t, mylibLdFlags, "libbar/android_vendor.29_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001482 for _, ver := range tc.shouldNotLink {
Jiyong Parkf58c46e2021-04-01 21:35:20 +09001483 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.29_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001484 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001485
Jiyong Parkf58c46e2021-04-01 21:35:20 +09001486 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.29_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001487 ver := tc.shouldLink
1488 if tc.shouldLink == "current" {
1489 ver = strconv.Itoa(android.FutureApiLevelInt)
1490 }
1491 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001492 })
1493 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001494}
1495
Jiyong Park25fc6a92018-11-18 18:02:45 +09001496func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001497 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001498 apex {
1499 name: "myapex",
1500 key: "myapex.key",
1501 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001502 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001503 }
1504
1505 apex_key {
1506 name: "myapex.key",
1507 public_key: "testkey.avbpubkey",
1508 private_key: "testkey.pem",
1509 }
1510
1511 cc_library {
1512 name: "mylib",
1513 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001514 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001515 shared_libs: ["libdl#27"],
1516 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001517 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001518 }
1519
1520 cc_library_shared {
1521 name: "mylib_shared",
1522 srcs: ["mylib.cpp"],
1523 shared_libs: ["libdl#27"],
1524 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001525 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001526 }
1527
1528 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001529 name: "libBootstrap",
1530 srcs: ["mylib.cpp"],
1531 stl: "none",
1532 bootstrap: true,
1533 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001534 `)
1535
Sundong Ahnabb64432019-10-22 13:58:29 +09001536 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001537 copyCmds := apexRule.Args["copy_commands"]
1538
1539 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001541 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1542 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001543
1544 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001545 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001546
Colin Crossaede88c2020-08-11 12:17:01 -07001547 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1548 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1549 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001550
1551 // For dependency to libc
1552 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001553 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001554 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001555 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001556 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001557 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1558 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001559
1560 // For dependency to libm
1561 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001562 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001563 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001564 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001565 // ... and is not compiling with the stub
1566 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1567 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1568
1569 // For dependency to libdl
1570 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001571 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001572 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001573 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1574 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001575 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001576 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001577 // ... Cflags from stub is correctly exported to mylib
1578 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1579 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001580
1581 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001582 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1583 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1584 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1585 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001587
Jooyung Han749dc692020-04-15 11:03:39 +09001588func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001589 // there are three links between liba --> libz.
1590 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001591 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001592 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001593 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001594 apex {
1595 name: "myapex",
1596 key: "myapex.key",
1597 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001598 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001599 }
1600
1601 apex {
1602 name: "otherapex",
1603 key: "myapex.key",
1604 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001605 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001606 }
1607
1608 apex_key {
1609 name: "myapex.key",
1610 public_key: "testkey.avbpubkey",
1611 private_key: "testkey.pem",
1612 }
1613
1614 cc_library {
1615 name: "libx",
1616 shared_libs: ["liba"],
1617 system_shared_libs: [],
1618 stl: "none",
1619 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001620 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001621 }
1622
1623 cc_library {
1624 name: "liby",
1625 shared_libs: ["liba"],
1626 system_shared_libs: [],
1627 stl: "none",
1628 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001629 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001630 }
1631
1632 cc_library {
1633 name: "liba",
1634 shared_libs: ["libz"],
1635 system_shared_libs: [],
1636 stl: "none",
1637 apex_available: [
1638 "//apex_available:anyapex",
1639 "//apex_available:platform",
1640 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001641 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001642 }
1643
1644 cc_library {
1645 name: "libz",
1646 system_shared_libs: [],
1647 stl: "none",
1648 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001649 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001650 },
1651 }
Jooyung Han749dc692020-04-15 11:03:39 +09001652 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001653
1654 expectLink := func(from, from_variant, to, to_variant string) {
1655 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1656 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1657 }
1658 expectNoLink := func(from, from_variant, to, to_variant string) {
1659 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1660 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1661 }
1662 // platform liba is linked to non-stub version
1663 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001664 // liba in myapex is linked to current
1665 expectLink("liba", "shared_apex29", "libz", "shared_current")
1666 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001667 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001668 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001669 // liba in otherapex is linked to current
1670 expectLink("liba", "shared_apex30", "libz", "shared_current")
1671 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001672 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1673 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001674}
1675
Jooyung Hanaed150d2020-04-02 01:41:41 +09001676func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001677 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001678 apex {
1679 name: "myapex",
1680 key: "myapex.key",
1681 native_shared_libs: ["libx"],
1682 min_sdk_version: "R",
1683 }
1684
1685 apex_key {
1686 name: "myapex.key",
1687 public_key: "testkey.avbpubkey",
1688 private_key: "testkey.pem",
1689 }
1690
1691 cc_library {
1692 name: "libx",
1693 shared_libs: ["libz"],
1694 system_shared_libs: [],
1695 stl: "none",
1696 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001697 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001698 }
1699
1700 cc_library {
1701 name: "libz",
1702 system_shared_libs: [],
1703 stl: "none",
1704 stubs: {
1705 versions: ["29", "R"],
1706 },
1707 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001708 `,
1709 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1710 variables.Platform_version_active_codenames = []string{"R"}
1711 }),
1712 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001713
1714 expectLink := func(from, from_variant, to, to_variant string) {
1715 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1716 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1717 }
1718 expectNoLink := func(from, from_variant, to, to_variant string) {
1719 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1720 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1721 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001722 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1723 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001724 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1725 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001726}
1727
Jooyung Han4c4da062021-06-23 10:23:16 +09001728func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1729 testApex(t, `
1730 apex {
1731 name: "myapex",
1732 key: "myapex.key",
1733 java_libs: ["libx"],
1734 min_sdk_version: "S",
1735 }
1736
1737 apex_key {
1738 name: "myapex.key",
1739 public_key: "testkey.avbpubkey",
1740 private_key: "testkey.pem",
1741 }
1742
1743 java_library {
1744 name: "libx",
1745 srcs: ["a.java"],
1746 apex_available: [ "myapex" ],
1747 sdk_version: "current",
1748 min_sdk_version: "S", // should be okay
1749 }
1750 `,
1751 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1752 variables.Platform_version_active_codenames = []string{"S"}
1753 variables.Platform_sdk_codename = proptools.StringPtr("S")
1754 }),
1755 )
1756}
1757
Jooyung Han749dc692020-04-15 11:03:39 +09001758func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001759 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001760 apex {
1761 name: "myapex",
1762 key: "myapex.key",
1763 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001764 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001765 }
1766
1767 apex_key {
1768 name: "myapex.key",
1769 public_key: "testkey.avbpubkey",
1770 private_key: "testkey.pem",
1771 }
1772
1773 cc_library {
1774 name: "libx",
1775 shared_libs: ["libz"],
1776 system_shared_libs: [],
1777 stl: "none",
1778 apex_available: [ "myapex" ],
1779 }
1780
1781 cc_library {
1782 name: "libz",
1783 system_shared_libs: [],
1784 stl: "none",
1785 stubs: {
1786 versions: ["1", "2"],
1787 },
1788 }
1789 `)
1790
1791 expectLink := func(from, from_variant, to, to_variant string) {
1792 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1793 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1794 }
1795 expectNoLink := func(from, from_variant, to, to_variant string) {
1796 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1797 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1798 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001799 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001800 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001801 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001802 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001803}
1804
1805func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001806 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001807 apex {
1808 name: "myapex",
1809 key: "myapex.key",
1810 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001811 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001812 }
1813
1814 apex_key {
1815 name: "myapex.key",
1816 public_key: "testkey.avbpubkey",
1817 private_key: "testkey.pem",
1818 }
1819
1820 cc_library {
1821 name: "libx",
1822 system_shared_libs: [],
1823 stl: "none",
1824 apex_available: [ "myapex" ],
1825 stubs: {
1826 versions: ["1", "2"],
1827 },
1828 }
1829
1830 cc_library {
1831 name: "libz",
1832 shared_libs: ["libx"],
1833 system_shared_libs: [],
1834 stl: "none",
1835 }
1836 `)
1837
1838 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001839 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001840 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1841 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1842 }
1843 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001844 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001845 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1846 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1847 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001848 expectLink("libz", "shared", "libx", "shared_current")
1849 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001850 expectNoLink("libz", "shared", "libz", "shared_1")
1851 expectNoLink("libz", "shared", "libz", "shared")
1852}
1853
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001854var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1855 func(variables android.FixtureProductVariables) {
1856 variables.SanitizeDevice = []string{"hwaddress"}
1857 },
1858)
1859
Jooyung Han75568392020-03-20 04:29:24 +09001860func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001861 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001862 apex {
1863 name: "myapex",
1864 key: "myapex.key",
1865 native_shared_libs: ["libx"],
1866 min_sdk_version: "29",
1867 }
1868
1869 apex_key {
1870 name: "myapex.key",
1871 public_key: "testkey.avbpubkey",
1872 private_key: "testkey.pem",
1873 }
1874
1875 cc_library {
1876 name: "libx",
1877 shared_libs: ["libbar"],
1878 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001879 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001880 }
1881
1882 cc_library {
1883 name: "libbar",
1884 stubs: {
1885 versions: ["29", "30"],
1886 },
1887 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001888 `,
1889 prepareForTestWithSantitizeHwaddress,
1890 )
Jooyung Han03b51852020-02-26 22:45:42 +09001891 expectLink := func(from, from_variant, to, to_variant string) {
1892 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1893 libFlags := ld.Args["libFlags"]
1894 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1895 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001896 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09001897}
1898
Jooyung Han75568392020-03-20 04:29:24 +09001899func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001900 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001901 apex {
1902 name: "myapex",
1903 key: "myapex.key",
1904 native_shared_libs: ["libx"],
1905 min_sdk_version: "29",
1906 }
1907
1908 apex_key {
1909 name: "myapex.key",
1910 public_key: "testkey.avbpubkey",
1911 private_key: "testkey.pem",
1912 }
1913
1914 cc_library {
1915 name: "libx",
1916 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001917 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001918 }
Jooyung Han75568392020-03-20 04:29:24 +09001919 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001920
1921 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001922 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001923 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001924 // note that platform variant is not.
1925 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001926 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001927}
1928
Jooyung Han749dc692020-04-15 11:03:39 +09001929func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1930 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001931 apex {
1932 name: "myapex",
1933 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001934 native_shared_libs: ["mylib"],
1935 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001936 }
1937
1938 apex_key {
1939 name: "myapex.key",
1940 public_key: "testkey.avbpubkey",
1941 private_key: "testkey.pem",
1942 }
Jooyung Han749dc692020-04-15 11:03:39 +09001943
1944 cc_library {
1945 name: "mylib",
1946 srcs: ["mylib.cpp"],
1947 system_shared_libs: [],
1948 stl: "none",
1949 apex_available: [
1950 "myapex",
1951 ],
1952 min_sdk_version: "30",
1953 }
1954 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001955
1956 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1957 apex {
1958 name: "myapex",
1959 key: "myapex.key",
1960 native_shared_libs: ["libfoo.ffi"],
1961 min_sdk_version: "29",
1962 }
1963
1964 apex_key {
1965 name: "myapex.key",
1966 public_key: "testkey.avbpubkey",
1967 private_key: "testkey.pem",
1968 }
1969
1970 rust_ffi_shared {
1971 name: "libfoo.ffi",
1972 srcs: ["foo.rs"],
1973 crate_name: "foo",
1974 apex_available: [
1975 "myapex",
1976 ],
1977 min_sdk_version: "30",
1978 }
1979 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00001980
1981 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
1982 apex {
1983 name: "myapex",
1984 key: "myapex.key",
1985 java_libs: ["libfoo"],
1986 min_sdk_version: "29",
1987 }
1988
1989 apex_key {
1990 name: "myapex.key",
1991 public_key: "testkey.avbpubkey",
1992 private_key: "testkey.pem",
1993 }
1994
1995 java_import {
1996 name: "libfoo",
1997 jars: ["libfoo.jar"],
1998 apex_available: [
1999 "myapex",
2000 ],
2001 min_sdk_version: "30",
2002 }
2003 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002004}
2005
2006func TestApexMinSdkVersion_Okay(t *testing.T) {
2007 testApex(t, `
2008 apex {
2009 name: "myapex",
2010 key: "myapex.key",
2011 native_shared_libs: ["libfoo"],
2012 java_libs: ["libbar"],
2013 min_sdk_version: "29",
2014 }
2015
2016 apex_key {
2017 name: "myapex.key",
2018 public_key: "testkey.avbpubkey",
2019 private_key: "testkey.pem",
2020 }
2021
2022 cc_library {
2023 name: "libfoo",
2024 srcs: ["mylib.cpp"],
2025 shared_libs: ["libfoo_dep"],
2026 apex_available: ["myapex"],
2027 min_sdk_version: "29",
2028 }
2029
2030 cc_library {
2031 name: "libfoo_dep",
2032 srcs: ["mylib.cpp"],
2033 apex_available: ["myapex"],
2034 min_sdk_version: "29",
2035 }
2036
2037 java_library {
2038 name: "libbar",
2039 sdk_version: "current",
2040 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002041 static_libs: [
2042 "libbar_dep",
2043 "libbar_import_dep",
2044 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002045 apex_available: ["myapex"],
2046 min_sdk_version: "29",
2047 }
2048
2049 java_library {
2050 name: "libbar_dep",
2051 sdk_version: "current",
2052 srcs: ["a.java"],
2053 apex_available: ["myapex"],
2054 min_sdk_version: "29",
2055 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002056
2057 java_import {
2058 name: "libbar_import_dep",
2059 jars: ["libbar.jar"],
2060 apex_available: ["myapex"],
2061 min_sdk_version: "29",
2062 }
Jooyung Han03b51852020-02-26 22:45:42 +09002063 `)
2064}
2065
Artur Satayev8cf899a2020-04-15 17:29:42 +01002066func TestJavaStableSdkVersion(t *testing.T) {
2067 testCases := []struct {
2068 name string
2069 expectedError string
2070 bp string
2071 }{
2072 {
2073 name: "Non-updatable apex with non-stable dep",
2074 bp: `
2075 apex {
2076 name: "myapex",
2077 java_libs: ["myjar"],
2078 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002079 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002080 }
2081 apex_key {
2082 name: "myapex.key",
2083 public_key: "testkey.avbpubkey",
2084 private_key: "testkey.pem",
2085 }
2086 java_library {
2087 name: "myjar",
2088 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002089 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002090 apex_available: ["myapex"],
2091 }
2092 `,
2093 },
2094 {
2095 name: "Updatable apex with stable dep",
2096 bp: `
2097 apex {
2098 name: "myapex",
2099 java_libs: ["myjar"],
2100 key: "myapex.key",
2101 updatable: true,
2102 min_sdk_version: "29",
2103 }
2104 apex_key {
2105 name: "myapex.key",
2106 public_key: "testkey.avbpubkey",
2107 private_key: "testkey.pem",
2108 }
2109 java_library {
2110 name: "myjar",
2111 srcs: ["foo/bar/MyClass.java"],
2112 sdk_version: "current",
2113 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002114 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002115 }
2116 `,
2117 },
2118 {
2119 name: "Updatable apex with non-stable dep",
2120 expectedError: "cannot depend on \"myjar\"",
2121 bp: `
2122 apex {
2123 name: "myapex",
2124 java_libs: ["myjar"],
2125 key: "myapex.key",
2126 updatable: true,
2127 }
2128 apex_key {
2129 name: "myapex.key",
2130 public_key: "testkey.avbpubkey",
2131 private_key: "testkey.pem",
2132 }
2133 java_library {
2134 name: "myjar",
2135 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002136 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002137 apex_available: ["myapex"],
2138 }
2139 `,
2140 },
2141 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002142 name: "Updatable apex with non-stable transitive dep",
2143 // This is not actually detecting that the transitive dependency is unstable, rather it is
2144 // detecting that the transitive dependency is building against a wider API surface than the
2145 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002146 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002147 bp: `
2148 apex {
2149 name: "myapex",
2150 java_libs: ["myjar"],
2151 key: "myapex.key",
2152 updatable: true,
2153 }
2154 apex_key {
2155 name: "myapex.key",
2156 public_key: "testkey.avbpubkey",
2157 private_key: "testkey.pem",
2158 }
2159 java_library {
2160 name: "myjar",
2161 srcs: ["foo/bar/MyClass.java"],
2162 sdk_version: "current",
2163 apex_available: ["myapex"],
2164 static_libs: ["transitive-jar"],
2165 }
2166 java_library {
2167 name: "transitive-jar",
2168 srcs: ["foo/bar/MyClass.java"],
2169 sdk_version: "core_platform",
2170 apex_available: ["myapex"],
2171 }
2172 `,
2173 },
2174 }
2175
2176 for _, test := range testCases {
2177 t.Run(test.name, func(t *testing.T) {
2178 if test.expectedError == "" {
2179 testApex(t, test.bp)
2180 } else {
2181 testApexError(t, test.expectedError, test.bp)
2182 }
2183 })
2184 }
2185}
2186
Jooyung Han749dc692020-04-15 11:03:39 +09002187func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2188 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
2192 native_shared_libs: ["mylib"],
2193 min_sdk_version: "29",
2194 }
2195
2196 apex_key {
2197 name: "myapex.key",
2198 public_key: "testkey.avbpubkey",
2199 private_key: "testkey.pem",
2200 }
2201
2202 cc_library {
2203 name: "mylib",
2204 srcs: ["mylib.cpp"],
2205 shared_libs: ["mylib2"],
2206 system_shared_libs: [],
2207 stl: "none",
2208 apex_available: [
2209 "myapex",
2210 ],
2211 min_sdk_version: "29",
2212 }
2213
2214 // indirect part of the apex
2215 cc_library {
2216 name: "mylib2",
2217 srcs: ["mylib.cpp"],
2218 system_shared_libs: [],
2219 stl: "none",
2220 apex_available: [
2221 "myapex",
2222 ],
2223 min_sdk_version: "30",
2224 }
2225 `)
2226}
2227
2228func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2229 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2230 apex {
2231 name: "myapex",
2232 key: "myapex.key",
2233 apps: ["AppFoo"],
2234 min_sdk_version: "29",
2235 }
2236
2237 apex_key {
2238 name: "myapex.key",
2239 public_key: "testkey.avbpubkey",
2240 private_key: "testkey.pem",
2241 }
2242
2243 android_app {
2244 name: "AppFoo",
2245 srcs: ["foo/bar/MyClass.java"],
2246 sdk_version: "current",
2247 min_sdk_version: "29",
2248 system_modules: "none",
2249 stl: "none",
2250 static_libs: ["bar"],
2251 apex_available: [ "myapex" ],
2252 }
2253
2254 java_library {
2255 name: "bar",
2256 sdk_version: "current",
2257 srcs: ["a.java"],
2258 apex_available: [ "myapex" ],
2259 }
2260 `)
2261}
2262
2263func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002264 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
2268 native_shared_libs: ["mylib"],
2269 min_sdk_version: "29",
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002278 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002279 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2280 cc_library {
2281 name: "mylib",
2282 srcs: ["mylib.cpp"],
2283 shared_libs: ["mylib2"],
2284 system_shared_libs: [],
2285 stl: "none",
2286 apex_available: ["myapex", "otherapex"],
2287 min_sdk_version: "29",
2288 }
2289
2290 cc_library {
2291 name: "mylib2",
2292 srcs: ["mylib.cpp"],
2293 system_shared_libs: [],
2294 stl: "none",
2295 apex_available: ["otherapex"],
2296 stubs: { versions: ["29", "30"] },
2297 min_sdk_version: "30",
2298 }
2299
2300 apex {
2301 name: "otherapex",
2302 key: "myapex.key",
2303 native_shared_libs: ["mylib", "mylib2"],
2304 min_sdk_version: "30",
2305 }
2306 `)
2307 expectLink := func(from, from_variant, to, to_variant string) {
2308 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2309 libFlags := ld.Args["libFlags"]
2310 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2311 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002312 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002313 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002314}
2315
Jooyung Haned124c32021-01-26 11:43:46 +09002316func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002317 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2318 func(variables android.FixtureProductVariables) {
2319 variables.Platform_sdk_codename = proptools.StringPtr("S")
2320 variables.Platform_version_active_codenames = []string{"S"}
2321 },
2322 )
Jooyung Haned124c32021-01-26 11:43:46 +09002323 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2324 apex {
2325 name: "myapex",
2326 key: "myapex.key",
2327 native_shared_libs: ["libfoo"],
2328 min_sdk_version: "S",
2329 }
2330 apex_key {
2331 name: "myapex.key",
2332 public_key: "testkey.avbpubkey",
2333 private_key: "testkey.pem",
2334 }
2335 cc_library {
2336 name: "libfoo",
2337 shared_libs: ["libbar"],
2338 apex_available: ["myapex"],
2339 min_sdk_version: "29",
2340 }
2341 cc_library {
2342 name: "libbar",
2343 apex_available: ["myapex"],
2344 }
2345 `, withSAsActiveCodeNames)
2346}
2347
2348func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002349 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2350 variables.Platform_sdk_codename = proptools.StringPtr("S")
2351 variables.Platform_version_active_codenames = []string{"S", "T"}
2352 })
Colin Cross1c460562021-02-16 17:55:47 -08002353 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002354 apex {
2355 name: "myapex",
2356 key: "myapex.key",
2357 native_shared_libs: ["libfoo"],
2358 min_sdk_version: "S",
2359 }
2360 apex_key {
2361 name: "myapex.key",
2362 public_key: "testkey.avbpubkey",
2363 private_key: "testkey.pem",
2364 }
2365 cc_library {
2366 name: "libfoo",
2367 shared_libs: ["libbar"],
2368 apex_available: ["myapex"],
2369 min_sdk_version: "S",
2370 }
2371 cc_library {
2372 name: "libbar",
2373 stubs: {
2374 symbol_file: "libbar.map.txt",
2375 versions: ["30", "S", "T"],
2376 },
2377 }
2378 `, withSAsActiveCodeNames)
2379
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002380 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002381 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2382 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002383 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002384}
2385
Jiyong Park7c2ee712018-12-07 00:42:25 +09002386func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002387 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002388 apex {
2389 name: "myapex",
2390 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002391 native_shared_libs: ["mylib"],
2392 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002393 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002394 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002395 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002396 }
2397
2398 apex_key {
2399 name: "myapex.key",
2400 public_key: "testkey.avbpubkey",
2401 private_key: "testkey.pem",
2402 }
2403
2404 prebuilt_etc {
2405 name: "myetc",
2406 src: "myprebuilt",
2407 sub_dir: "foo/bar",
2408 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002409
2410 cc_library {
2411 name: "mylib",
2412 srcs: ["mylib.cpp"],
2413 relative_install_path: "foo/bar",
2414 system_shared_libs: [],
2415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002416 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002417 }
2418
2419 cc_binary {
2420 name: "mybin",
2421 srcs: ["mylib.cpp"],
2422 relative_install_path: "foo/bar",
2423 system_shared_libs: [],
2424 static_executable: true,
2425 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002426 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002427 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002428 `)
2429
Sundong Ahnabb64432019-10-22 13:58:29 +09002430 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002431 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2432
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002433 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002434 ensureListContains(t, dirs, "etc")
2435 ensureListContains(t, dirs, "etc/foo")
2436 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002437 ensureListContains(t, dirs, "lib64")
2438 ensureListContains(t, dirs, "lib64/foo")
2439 ensureListContains(t, dirs, "lib64/foo/bar")
2440 ensureListContains(t, dirs, "lib")
2441 ensureListContains(t, dirs, "lib/foo")
2442 ensureListContains(t, dirs, "lib/foo/bar")
2443
Jiyong Parkbd13e442019-03-15 18:10:35 +09002444 ensureListContains(t, dirs, "bin")
2445 ensureListContains(t, dirs, "bin/foo")
2446 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002447}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002448
Jooyung Han35155c42020-02-06 17:33:20 +09002449func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002450 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002451 apex {
2452 name: "myapex",
2453 key: "myapex.key",
2454 multilib: {
2455 both: {
2456 native_shared_libs: ["mylib"],
2457 binaries: ["mybin"],
2458 },
2459 },
2460 compile_multilib: "both",
2461 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002462 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002463 }
2464
2465 apex_key {
2466 name: "myapex.key",
2467 public_key: "testkey.avbpubkey",
2468 private_key: "testkey.pem",
2469 }
2470
2471 cc_library {
2472 name: "mylib",
2473 relative_install_path: "foo/bar",
2474 system_shared_libs: [],
2475 stl: "none",
2476 apex_available: [ "myapex" ],
2477 native_bridge_supported: true,
2478 }
2479
2480 cc_binary {
2481 name: "mybin",
2482 relative_install_path: "foo/bar",
2483 system_shared_libs: [],
2484 static_executable: true,
2485 stl: "none",
2486 apex_available: [ "myapex" ],
2487 native_bridge_supported: true,
2488 compile_multilib: "both", // default is "first" for binary
2489 multilib: {
2490 lib64: {
2491 suffix: "64",
2492 },
2493 },
2494 }
2495 `, withNativeBridgeEnabled)
2496 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2497 "bin/foo/bar/mybin",
2498 "bin/foo/bar/mybin64",
2499 "bin/arm/foo/bar/mybin",
2500 "bin/arm64/foo/bar/mybin64",
2501 "lib/foo/bar/mylib.so",
2502 "lib/arm/foo/bar/mylib.so",
2503 "lib64/foo/bar/mylib.so",
2504 "lib64/arm64/foo/bar/mylib.so",
2505 })
2506}
2507
Jiyong Parkda6eb592018-12-19 17:12:36 +09002508func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002509 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002510 apex {
2511 name: "myapex",
2512 key: "myapex.key",
2513 native_shared_libs: ["mylib"],
2514 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002515 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002516 }
2517
2518 apex_key {
2519 name: "myapex.key",
2520 public_key: "testkey.avbpubkey",
2521 private_key: "testkey.pem",
2522 }
2523
2524 cc_library {
2525 name: "mylib",
2526 srcs: ["mylib.cpp"],
2527 shared_libs: ["mylib2"],
2528 system_shared_libs: [],
2529 vendor_available: true,
2530 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002531 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002532 }
2533
2534 cc_library {
2535 name: "mylib2",
2536 srcs: ["mylib.cpp"],
2537 system_shared_libs: [],
2538 vendor_available: true,
2539 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002540 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002541 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002542 `,
2543 setUseVendorAllowListForTest([]string{"myapex"}),
2544 )
Jiyong Parkda6eb592018-12-19 17:12:36 +09002545
2546 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002547 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002548 for _, implicit := range i.Implicits {
2549 inputsList = append(inputsList, implicit.String())
2550 }
2551 }
2552 inputsString := strings.Join(inputsList, " ")
2553
2554 // ensure that the apex includes vendor variants of the direct and indirect deps
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002555 ensureContains(t, inputsString, "android_vendor.29_arm64_armv8-a_shared_apex10000/mylib.so")
2556 ensureContains(t, inputsString, "android_vendor.29_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002557
2558 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002559 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2560 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002561}
Jiyong Park16e91a02018-12-20 18:18:08 +09002562
Jooyung Han85d61762020-06-24 23:50:26 +09002563func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002564 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2565 apex {
2566 name: "myapex",
2567 key: "myapex.key",
2568 use_vendor: true,
2569 }
2570 apex_key {
2571 name: "myapex.key",
2572 public_key: "testkey.avbpubkey",
2573 private_key: "testkey.pem",
2574 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002575 `,
2576 setUseVendorAllowListForTest([]string{""}),
2577 )
Colin Cross440e0d02020-06-11 11:32:11 -07002578 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002579 testApex(t, `
2580 apex {
2581 name: "myapex",
2582 key: "myapex.key",
2583 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002584 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002585 }
2586 apex_key {
2587 name: "myapex.key",
2588 public_key: "testkey.avbpubkey",
2589 private_key: "testkey.pem",
2590 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002591 `,
2592 setUseVendorAllowListForTest([]string{"myapex"}),
2593 )
Jooyung Handc782442019-11-01 03:14:38 +09002594}
2595
Jooyung Han5c998b92019-06-27 11:30:33 +09002596func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2597 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2598 apex {
2599 name: "myapex",
2600 key: "myapex.key",
2601 native_shared_libs: ["mylib"],
2602 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002603 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002604 }
2605
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611
2612 cc_library {
2613 name: "mylib",
2614 srcs: ["mylib.cpp"],
2615 system_shared_libs: [],
2616 stl: "none",
2617 }
2618 `)
2619}
2620
Jooyung Han85d61762020-06-24 23:50:26 +09002621func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002622 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002623 apex {
2624 name: "myapex",
2625 key: "myapex.key",
2626 binaries: ["mybin"],
2627 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002628 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002629 }
2630 apex_key {
2631 name: "myapex.key",
2632 public_key: "testkey.avbpubkey",
2633 private_key: "testkey.pem",
2634 }
2635 cc_binary {
2636 name: "mybin",
2637 vendor: true,
2638 shared_libs: ["libfoo"],
2639 }
2640 cc_library {
2641 name: "libfoo",
2642 proprietary: true,
2643 }
2644 `)
2645
2646 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2647 "bin/mybin",
2648 "lib64/libfoo.so",
2649 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2650 "lib64/libc++.so",
2651 })
2652
2653 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002654 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002655 name := apexBundle.BaseModuleName()
2656 prefix := "TARGET_"
2657 var builder strings.Builder
2658 data.Custom(&builder, name, prefix, "", data)
Paul Duffin37ba3442021-03-29 00:21:08 +01002659 androidMk := android.StringRelativeToTop(ctx.Config(), builder.String())
2660 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002661 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002662
2663 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2664 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2665 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002666}
2667
Jooyung Handf78e212020-07-22 15:54:47 +09002668func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002669 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002670 apex {
2671 name: "myapex",
2672 key: "myapex.key",
2673 binaries: ["mybin"],
2674 vendor: true,
2675 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002676 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002677 }
2678 apex_key {
2679 name: "myapex.key",
2680 public_key: "testkey.avbpubkey",
2681 private_key: "testkey.pem",
2682 }
2683 cc_binary {
2684 name: "mybin",
2685 vendor: true,
2686 shared_libs: ["libvndk", "libvendor"],
2687 }
2688 cc_library {
2689 name: "libvndk",
2690 vndk: {
2691 enabled: true,
2692 },
2693 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002694 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002695 }
2696 cc_library {
2697 name: "libvendor",
2698 vendor: true,
2699 }
2700 `)
2701
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002702 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002703
Paul Duffina71a67a2021-03-29 00:42:57 +01002704 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002705 libs := names(ldRule.Args["libFlags"])
2706 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002707 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2708 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002709 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002710 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002711
2712 // VNDK libs are not included when use_vndk_as_stable: true
2713 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2714 "bin/mybin",
2715 "lib64/libvendor.so",
2716 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002717
2718 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2719 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2720 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002721}
2722
Justin Yun13decfb2021-03-08 19:25:55 +09002723func TestProductVariant(t *testing.T) {
2724 ctx := testApex(t, `
2725 apex {
2726 name: "myapex",
2727 key: "myapex.key",
2728 updatable: false,
2729 product_specific: true,
2730 binaries: ["foo"],
2731 }
2732
2733 apex_key {
2734 name: "myapex.key",
2735 public_key: "testkey.avbpubkey",
2736 private_key: "testkey.pem",
2737 }
2738
2739 cc_binary {
2740 name: "foo",
2741 product_available: true,
2742 apex_available: ["myapex"],
2743 srcs: ["foo.cpp"],
2744 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002745 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2746 variables.ProductVndkVersion = proptools.StringPtr("current")
2747 }),
2748 )
Justin Yun13decfb2021-03-08 19:25:55 +09002749
2750 cflags := strings.Fields(
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002751 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002752 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2753 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2754 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2755 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2756}
2757
Jooyung Han8e5685d2020-09-21 11:02:57 +09002758func TestApex_withPrebuiltFirmware(t *testing.T) {
2759 testCases := []struct {
2760 name string
2761 additionalProp string
2762 }{
2763 {"system apex with prebuilt_firmware", ""},
2764 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2765 }
2766 for _, tc := range testCases {
2767 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002768 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002769 apex {
2770 name: "myapex",
2771 key: "myapex.key",
2772 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002773 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002774 `+tc.additionalProp+`
2775 }
2776 apex_key {
2777 name: "myapex.key",
2778 public_key: "testkey.avbpubkey",
2779 private_key: "testkey.pem",
2780 }
2781 prebuilt_firmware {
2782 name: "myfirmware",
2783 src: "myfirmware.bin",
2784 filename_from_src: true,
2785 `+tc.additionalProp+`
2786 }
2787 `)
2788 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2789 "etc/firmware/myfirmware.bin",
2790 })
2791 })
2792 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002793}
2794
Jooyung Hanefb184e2020-06-25 17:14:25 +09002795func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002796 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002797 apex {
2798 name: "myapex",
2799 key: "myapex.key",
2800 use_vendor: true,
2801 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002802 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002803 }
2804
2805 apex_key {
2806 name: "myapex.key",
2807 public_key: "testkey.avbpubkey",
2808 private_key: "testkey.pem",
2809 }
2810
2811 cc_library {
2812 name: "mylib",
2813 vendor_available: true,
2814 apex_available: ["myapex"],
2815 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002816 `,
2817 setUseVendorAllowListForTest([]string{"myapex"}),
2818 )
Jooyung Hanefb184e2020-06-25 17:14:25 +09002819
2820 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002821 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002822 name := apexBundle.BaseModuleName()
2823 prefix := "TARGET_"
2824 var builder strings.Builder
2825 data.Custom(&builder, name, prefix, "", data)
2826 androidMk := builder.String()
2827 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2828}
2829
2830func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002831 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002832 apex {
2833 name: "myapex",
2834 key: "myapex.key",
2835 vendor: true,
2836 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002837 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002838 }
2839
2840 apex_key {
2841 name: "myapex.key",
2842 public_key: "testkey.avbpubkey",
2843 private_key: "testkey.pem",
2844 }
2845
2846 cc_library {
2847 name: "mylib",
2848 vendor_available: true,
2849 }
2850 `)
2851
2852 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002853 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002854 name := apexBundle.BaseModuleName()
2855 prefix := "TARGET_"
2856 var builder strings.Builder
2857 data.Custom(&builder, name, prefix, "", data)
2858 androidMk := builder.String()
2859 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2860}
2861
Jooyung Han2ed99d02020-06-24 23:26:26 +09002862func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002863 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 vintf_fragments: ["fragment.xml"],
2868 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002869 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002870 }
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876 cc_binary {
2877 name: "mybin",
2878 }
2879 `)
2880
2881 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002882 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002883 name := apexBundle.BaseModuleName()
2884 prefix := "TARGET_"
2885 var builder strings.Builder
2886 data.Custom(&builder, name, prefix, "", data)
2887 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002888 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002889 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002890}
2891
Jiyong Park16e91a02018-12-20 18:18:08 +09002892func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002893 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002894 apex {
2895 name: "myapex",
2896 key: "myapex.key",
2897 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002898 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002899 }
2900
2901 apex_key {
2902 name: "myapex.key",
2903 public_key: "testkey.avbpubkey",
2904 private_key: "testkey.pem",
2905 }
2906
2907 cc_library {
2908 name: "mylib",
2909 srcs: ["mylib.cpp"],
2910 system_shared_libs: [],
2911 stl: "none",
2912 stubs: {
2913 versions: ["1", "2", "3"],
2914 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002915 apex_available: [
2916 "//apex_available:platform",
2917 "myapex",
2918 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002919 }
2920
2921 cc_binary {
2922 name: "not_in_apex",
2923 srcs: ["mylib.cpp"],
2924 static_libs: ["mylib"],
2925 static_executable: true,
2926 system_shared_libs: [],
2927 stl: "none",
2928 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002929 `)
2930
Colin Cross7113d202019-11-20 16:39:12 -08002931 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002932
2933 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002934 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002935}
Jiyong Park9335a262018-12-24 11:31:58 +09002936
2937func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002938 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002939 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002940 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002941 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002942 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002943 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002944 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002945 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002946 }
2947
2948 cc_library {
2949 name: "mylib",
2950 srcs: ["mylib.cpp"],
2951 system_shared_libs: [],
2952 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002953 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002954 }
2955
2956 apex_key {
2957 name: "myapex.key",
2958 public_key: "testkey.avbpubkey",
2959 private_key: "testkey.pem",
2960 }
2961
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002962 android_app_certificate {
2963 name: "myapex.certificate",
2964 certificate: "testkey",
2965 }
2966
2967 android_app_certificate {
2968 name: "myapex.certificate.override",
2969 certificate: "testkey.override",
2970 }
2971
Jiyong Park9335a262018-12-24 11:31:58 +09002972 `)
2973
2974 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002975 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002976
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002977 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2978 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002979 "vendor/foo/devkeys/testkey.avbpubkey")
2980 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002981 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2982 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002983 "vendor/foo/devkeys/testkey.pem")
2984 }
2985
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002986 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002987 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002988 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002989 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002990 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002991 }
2992}
Jiyong Park58e364a2019-01-19 19:24:06 +09002993
Jooyung Hanf121a652019-12-17 14:30:11 +09002994func TestCertificate(t *testing.T) {
2995 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002996 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002997 apex {
2998 name: "myapex",
2999 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003000 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003001 }
3002 apex_key {
3003 name: "myapex.key",
3004 public_key: "testkey.avbpubkey",
3005 private_key: "testkey.pem",
3006 }`)
3007 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3008 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3009 if actual := rule.Args["certificates"]; actual != expected {
3010 t.Errorf("certificates should be %q, not %q", expected, actual)
3011 }
3012 })
3013 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003014 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003015 apex {
3016 name: "myapex_keytest",
3017 key: "myapex.key",
3018 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003019 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003020 }
3021 apex_key {
3022 name: "myapex.key",
3023 public_key: "testkey.avbpubkey",
3024 private_key: "testkey.pem",
3025 }
3026 android_app_certificate {
3027 name: "myapex.certificate.override",
3028 certificate: "testkey.override",
3029 }`)
3030 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3031 expected := "testkey.override.x509.pem testkey.override.pk8"
3032 if actual := rule.Args["certificates"]; actual != expected {
3033 t.Errorf("certificates should be %q, not %q", expected, actual)
3034 }
3035 })
3036 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003037 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003038 apex {
3039 name: "myapex",
3040 key: "myapex.key",
3041 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003042 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003043 }
3044 apex_key {
3045 name: "myapex.key",
3046 public_key: "testkey.avbpubkey",
3047 private_key: "testkey.pem",
3048 }
3049 android_app_certificate {
3050 name: "myapex.certificate",
3051 certificate: "testkey",
3052 }`)
3053 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3054 expected := "testkey.x509.pem testkey.pk8"
3055 if actual := rule.Args["certificates"]; actual != expected {
3056 t.Errorf("certificates should be %q, not %q", expected, actual)
3057 }
3058 })
3059 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003060 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003061 apex {
3062 name: "myapex_keytest",
3063 key: "myapex.key",
3064 file_contexts: ":myapex-file_contexts",
3065 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003066 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003067 }
3068 apex_key {
3069 name: "myapex.key",
3070 public_key: "testkey.avbpubkey",
3071 private_key: "testkey.pem",
3072 }
3073 android_app_certificate {
3074 name: "myapex.certificate.override",
3075 certificate: "testkey.override",
3076 }`)
3077 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3078 expected := "testkey.override.x509.pem testkey.override.pk8"
3079 if actual := rule.Args["certificates"]; actual != expected {
3080 t.Errorf("certificates should be %q, not %q", expected, actual)
3081 }
3082 })
3083 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003084 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003085 apex {
3086 name: "myapex",
3087 key: "myapex.key",
3088 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003089 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003090 }
3091 apex_key {
3092 name: "myapex.key",
3093 public_key: "testkey.avbpubkey",
3094 private_key: "testkey.pem",
3095 }`)
3096 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3097 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3098 if actual := rule.Args["certificates"]; actual != expected {
3099 t.Errorf("certificates should be %q, not %q", expected, actual)
3100 }
3101 })
3102 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003103 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003104 apex {
3105 name: "myapex_keytest",
3106 key: "myapex.key",
3107 file_contexts: ":myapex-file_contexts",
3108 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003109 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003110 }
3111 apex_key {
3112 name: "myapex.key",
3113 public_key: "testkey.avbpubkey",
3114 private_key: "testkey.pem",
3115 }
3116 android_app_certificate {
3117 name: "myapex.certificate.override",
3118 certificate: "testkey.override",
3119 }`)
3120 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3121 expected := "testkey.override.x509.pem testkey.override.pk8"
3122 if actual := rule.Args["certificates"]; actual != expected {
3123 t.Errorf("certificates should be %q, not %q", expected, actual)
3124 }
3125 })
3126}
3127
Jiyong Park58e364a2019-01-19 19:24:06 +09003128func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003129 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003130 apex {
3131 name: "myapex",
3132 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003133 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003134 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003135 }
3136
3137 apex {
3138 name: "otherapex",
3139 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003140 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003141 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003142 }
3143
3144 apex_key {
3145 name: "myapex.key",
3146 public_key: "testkey.avbpubkey",
3147 private_key: "testkey.pem",
3148 }
3149
3150 cc_library {
3151 name: "mylib",
3152 srcs: ["mylib.cpp"],
3153 system_shared_libs: [],
3154 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003155 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003156 "myapex",
3157 "otherapex",
3158 ],
Jooyung Han24282772020-03-21 23:20:55 +09003159 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003160 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003161 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003162 cc_library {
3163 name: "mylib2",
3164 srcs: ["mylib.cpp"],
3165 system_shared_libs: [],
3166 stl: "none",
3167 apex_available: [
3168 "myapex",
3169 "otherapex",
3170 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003171 static_libs: ["mylib3"],
3172 recovery_available: true,
3173 min_sdk_version: "29",
3174 }
3175 cc_library {
3176 name: "mylib3",
3177 srcs: ["mylib.cpp"],
3178 system_shared_libs: [],
3179 stl: "none",
3180 apex_available: [
3181 "myapex",
3182 "otherapex",
3183 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003184 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003185 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003186 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003187 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003188 `)
3189
Jooyung Hanc87a0592020-03-02 17:44:33 +09003190 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003191 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003192 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003193 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003194
Jooyung Hanccce2f22020-03-07 03:45:53 +09003195 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003196 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003197 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003198 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003199 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003200
Jooyung Hanccce2f22020-03-07 03:45:53 +09003201 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003202 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003203 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003204 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003205 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003206
Colin Crossaede88c2020-08-11 12:17:01 -07003207 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3208 // each variant defines additional macros to distinguish which apex variant it is built for
3209
3210 // non-APEX variant does not have __ANDROID_APEX__ defined
3211 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3212 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3213
3214 // APEX variant has __ANDROID_APEX__ defined
3215 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3216 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3217 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3218 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3219
3220 // APEX variant has __ANDROID_APEX__ defined
3221 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3222 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3223 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3224 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3225
Dan Albertb19953d2020-11-17 15:29:36 -08003226 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003227 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3228 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003229 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003230
3231 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3232 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003233
3234 // non-APEX variant does not have __ANDROID_APEX__ defined
3235 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3236 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3237
3238 // APEX variant has __ANDROID_APEX__ defined
3239 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003240 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003241 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003242 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003243
Jooyung Hanc87a0592020-03-02 17:44:33 +09003244 // APEX variant has __ANDROID_APEX__ defined
3245 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003246 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003247 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003248 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003249
Dan Albertb19953d2020-11-17 15:29:36 -08003250 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003251 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003252 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003253 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003254}
Jiyong Park7e636d02019-01-28 16:16:54 +09003255
3256func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003257 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003258 apex {
3259 name: "myapex",
3260 key: "myapex.key",
3261 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003262 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003263 }
3264
3265 apex_key {
3266 name: "myapex.key",
3267 public_key: "testkey.avbpubkey",
3268 private_key: "testkey.pem",
3269 }
3270
3271 cc_library_headers {
3272 name: "mylib_headers",
3273 export_include_dirs: ["my_include"],
3274 system_shared_libs: [],
3275 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003276 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003277 }
3278
3279 cc_library {
3280 name: "mylib",
3281 srcs: ["mylib.cpp"],
3282 system_shared_libs: [],
3283 stl: "none",
3284 header_libs: ["mylib_headers"],
3285 export_header_lib_headers: ["mylib_headers"],
3286 stubs: {
3287 versions: ["1", "2", "3"],
3288 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003289 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003290 }
3291
3292 cc_library {
3293 name: "otherlib",
3294 srcs: ["mylib.cpp"],
3295 system_shared_libs: [],
3296 stl: "none",
3297 shared_libs: ["mylib"],
3298 }
3299 `)
3300
Colin Cross7113d202019-11-20 16:39:12 -08003301 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003302
3303 // Ensure that the include path of the header lib is exported to 'otherlib'
3304 ensureContains(t, cFlags, "-Imy_include")
3305}
Alex Light9670d332019-01-29 18:07:33 -08003306
Jiyong Park7cd10e32020-01-14 09:22:18 +09003307type fileInApex struct {
3308 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003309 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003310 isLink bool
3311}
3312
Jooyung Hana57af4a2020-01-23 05:36:59 +00003313func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003315 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003316 copyCmds := apexRule.Args["copy_commands"]
3317 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003318 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003319 for _, cmd := range strings.Split(copyCmds, "&&") {
3320 cmd = strings.TrimSpace(cmd)
3321 if cmd == "" {
3322 continue
3323 }
3324 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003325 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003326 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003327 switch terms[0] {
3328 case "mkdir":
3329 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003330 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003331 t.Fatal("copyCmds contains invalid cp command", cmd)
3332 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003333 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003334 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003335 isLink = false
3336 case "ln":
3337 if len(terms) != 3 && len(terms) != 4 {
3338 // ln LINK TARGET or ln -s LINK TARGET
3339 t.Fatal("copyCmds contains invalid ln command", cmd)
3340 }
3341 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003342 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003343 isLink = true
3344 default:
3345 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3346 }
3347 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003348 index := strings.Index(dst, imageApexDir)
3349 if index == -1 {
3350 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3351 }
3352 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003353 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003354 }
3355 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003356 return ret
3357}
3358
Jooyung Hana57af4a2020-01-23 05:36:59 +00003359func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3360 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003361 var failed bool
3362 var surplus []string
3363 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003364 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003365 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003366 for _, expected := range files {
3367 if matched, _ := path.Match(expected, file.path); matched {
3368 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003369 mactchFound = true
3370 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003371 }
3372 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003373 if !mactchFound {
3374 surplus = append(surplus, file.path)
3375 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003376 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003377
Jooyung Han31c470b2019-10-18 16:26:59 +09003378 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003379 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003380 t.Log("surplus files", surplus)
3381 failed = true
3382 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003383
3384 if len(files) > len(filesMatched) {
3385 var missing []string
3386 for _, expected := range files {
3387 if !filesMatched[expected] {
3388 missing = append(missing, expected)
3389 }
3390 }
3391 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 t.Log("missing files", missing)
3393 failed = true
3394 }
3395 if failed {
3396 t.Fail()
3397 }
3398}
3399
Jooyung Han344d5432019-08-23 11:17:39 +09003400func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003401 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003402 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003403 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003404 "etc/llndk.libraries.29.txt",
3405 "etc/vndkcore.libraries.29.txt",
3406 "etc/vndksp.libraries.29.txt",
3407 "etc/vndkprivate.libraries.29.txt",
3408 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003409 }
3410 testCases := []struct {
3411 vndkVersion string
3412 expectedFiles []string
3413 }{
3414 {
3415 vndkVersion: "current",
3416 expectedFiles: append(commonFiles,
3417 "lib/libvndk.so",
3418 "lib/libvndksp.so",
3419 "lib64/libvndk.so",
3420 "lib64/libvndksp.so"),
3421 },
3422 {
3423 vndkVersion: "",
3424 expectedFiles: append(commonFiles,
3425 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3426 "lib/libvndksp.so",
3427 "lib64/libvndksp.so"),
3428 },
3429 }
3430 for _, tc := range testCases {
3431 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3432 ctx := testApex(t, `
3433 apex_vndk {
3434 name: "com.android.vndk.current",
3435 key: "com.android.vndk.current.key",
3436 updatable: false,
3437 }
3438
3439 apex_key {
3440 name: "com.android.vndk.current.key",
3441 public_key: "testkey.avbpubkey",
3442 private_key: "testkey.pem",
3443 }
3444
3445 cc_library {
3446 name: "libvndk",
3447 srcs: ["mylib.cpp"],
3448 vendor_available: true,
3449 product_available: true,
3450 vndk: {
3451 enabled: true,
3452 },
3453 system_shared_libs: [],
3454 stl: "none",
3455 apex_available: [ "com.android.vndk.current" ],
3456 }
3457
3458 cc_library {
3459 name: "libvndksp",
3460 srcs: ["mylib.cpp"],
3461 vendor_available: true,
3462 product_available: true,
3463 vndk: {
3464 enabled: true,
3465 support_system_process: true,
3466 },
3467 system_shared_libs: [],
3468 stl: "none",
3469 apex_available: [ "com.android.vndk.current" ],
3470 }
3471
3472 // VNDK-Ext should not cause any problems
3473
3474 cc_library {
3475 name: "libvndk.ext",
3476 srcs: ["mylib2.cpp"],
3477 vendor: true,
3478 vndk: {
3479 enabled: true,
3480 extends: "libvndk",
3481 },
3482 system_shared_libs: [],
3483 stl: "none",
3484 }
3485
3486 cc_library {
3487 name: "libvndksp.ext",
3488 srcs: ["mylib2.cpp"],
3489 vendor: true,
3490 vndk: {
3491 enabled: true,
3492 support_system_process: true,
3493 extends: "libvndksp",
3494 },
3495 system_shared_libs: [],
3496 stl: "none",
3497 }
3498 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3499 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3500 }))
3501 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3502 })
3503 }
Jooyung Han344d5432019-08-23 11:17:39 +09003504}
3505
3506func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003507 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003508 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003509 name: "com.android.vndk.current",
3510 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003511 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003512 }
3513
3514 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003515 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003516 public_key: "testkey.avbpubkey",
3517 private_key: "testkey.pem",
3518 }
3519
3520 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 name: "libvndk",
3522 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003523 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003524 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003525 vndk: {
3526 enabled: true,
3527 },
3528 system_shared_libs: [],
3529 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003530 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003531 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003532
3533 cc_prebuilt_library_shared {
3534 name: "libvndk.arm",
3535 srcs: ["libvndk.arm.so"],
3536 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003537 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003538 vndk: {
3539 enabled: true,
3540 },
3541 enabled: false,
3542 arch: {
3543 arm: {
3544 enabled: true,
3545 },
3546 },
3547 system_shared_libs: [],
3548 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003549 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003550 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003551 `+vndkLibrariesTxtFiles("current"),
3552 withFiles(map[string][]byte{
3553 "libvndk.so": nil,
3554 "libvndk.arm.so": nil,
3555 }))
Colin Cross2807f002021-03-02 10:15:29 -08003556 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003557 "lib/libvndk.so",
3558 "lib/libvndk.arm.so",
3559 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003560 "lib/libc++.so",
3561 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003562 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003563 })
Jooyung Han344d5432019-08-23 11:17:39 +09003564}
3565
Jooyung Han39edb6c2019-11-06 16:53:07 +09003566func vndkLibrariesTxtFiles(vers ...string) (result string) {
3567 for _, v := range vers {
3568 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003569 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003570 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003571 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003572 name: "` + txt + `.libraries.txt",
3573 }
3574 `
3575 }
3576 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003577 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003578 result += `
3579 prebuilt_etc {
3580 name: "` + txt + `.libraries.` + v + `.txt",
3581 src: "dummy.txt",
3582 }
3583 `
3584 }
3585 }
3586 }
3587 return
3588}
3589
Jooyung Han344d5432019-08-23 11:17:39 +09003590func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003591 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003592 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003593 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003594 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003595 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003596 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003597 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003598 }
3599
3600 apex_key {
3601 name: "myapex.key",
3602 public_key: "testkey.avbpubkey",
3603 private_key: "testkey.pem",
3604 }
3605
Jooyung Han31c470b2019-10-18 16:26:59 +09003606 vndk_prebuilt_shared {
3607 name: "libvndk27",
3608 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003609 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003610 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003611 vndk: {
3612 enabled: true,
3613 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 target_arch: "arm64",
3615 arch: {
3616 arm: {
3617 srcs: ["libvndk27_arm.so"],
3618 },
3619 arm64: {
3620 srcs: ["libvndk27_arm64.so"],
3621 },
3622 },
Colin Cross2807f002021-03-02 10:15:29 -08003623 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003624 }
3625
3626 vndk_prebuilt_shared {
3627 name: "libvndk27",
3628 version: "27",
3629 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003630 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003631 vndk: {
3632 enabled: true,
3633 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 target_arch: "x86_64",
3635 arch: {
3636 x86: {
3637 srcs: ["libvndk27_x86.so"],
3638 },
3639 x86_64: {
3640 srcs: ["libvndk27_x86_64.so"],
3641 },
3642 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643 }
3644 `+vndkLibrariesTxtFiles("27"),
3645 withFiles(map[string][]byte{
3646 "libvndk27_arm.so": nil,
3647 "libvndk27_arm64.so": nil,
3648 "libvndk27_x86.so": nil,
3649 "libvndk27_x86_64.so": nil,
3650 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003651
Colin Cross2807f002021-03-02 10:15:29 -08003652 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003653 "lib/libvndk27_arm.so",
3654 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003655 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 })
Jooyung Han344d5432019-08-23 11:17:39 +09003657}
3658
Jooyung Han90eee022019-10-01 20:02:42 +09003659func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003660 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003661 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003662 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003663 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003664 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003665 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003666 }
3667 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003668 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003669 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003670 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003671 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003672 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003673 }
3674 apex_key {
3675 name: "myapex.key",
3676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003679
3680 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003681 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003682 actual := proptools.String(bundle.properties.Apex_name)
3683 if !reflect.DeepEqual(actual, expected) {
3684 t.Errorf("Got '%v', expected '%v'", actual, expected)
3685 }
3686 }
3687
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003688 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003689 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003690}
3691
Jooyung Han344d5432019-08-23 11:17:39 +09003692func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003693 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003694 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003695 name: "com.android.vndk.current",
3696 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003697 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003698 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003699 }
3700
3701 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003702 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003703 public_key: "testkey.avbpubkey",
3704 private_key: "testkey.pem",
3705 }
3706
3707 cc_library {
3708 name: "libvndk",
3709 srcs: ["mylib.cpp"],
3710 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003711 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003712 native_bridge_supported: true,
3713 host_supported: true,
3714 vndk: {
3715 enabled: true,
3716 },
3717 system_shared_libs: [],
3718 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003719 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003720 }
Colin Cross2807f002021-03-02 10:15:29 -08003721 `+vndkLibrariesTxtFiles("current"),
3722 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003723
Colin Cross2807f002021-03-02 10:15:29 -08003724 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 "lib/libvndk.so",
3726 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003727 "lib/libc++.so",
3728 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003729 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 })
Jooyung Han344d5432019-08-23 11:17:39 +09003731}
3732
3733func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003734 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003735 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003736 name: "com.android.vndk.current",
3737 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003738 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003739 native_bridge_supported: true,
3740 }
3741
3742 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003743 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003744 public_key: "testkey.avbpubkey",
3745 private_key: "testkey.pem",
3746 }
3747
3748 cc_library {
3749 name: "libvndk",
3750 srcs: ["mylib.cpp"],
3751 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003752 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003753 native_bridge_supported: true,
3754 host_supported: true,
3755 vndk: {
3756 enabled: true,
3757 },
3758 system_shared_libs: [],
3759 stl: "none",
3760 }
3761 `)
3762}
3763
Jooyung Han31c470b2019-10-18 16:26:59 +09003764func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003765 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003767 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003768 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003769 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003770 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003771 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003772 }
3773
3774 apex_key {
3775 name: "myapex.key",
3776 public_key: "testkey.avbpubkey",
3777 private_key: "testkey.pem",
3778 }
3779
3780 vndk_prebuilt_shared {
3781 name: "libvndk27",
3782 version: "27",
3783 target_arch: "arm",
3784 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003785 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003786 vndk: {
3787 enabled: true,
3788 },
3789 arch: {
3790 arm: {
3791 srcs: ["libvndk27.so"],
3792 }
3793 },
3794 }
3795
3796 vndk_prebuilt_shared {
3797 name: "libvndk27",
3798 version: "27",
3799 target_arch: "arm",
3800 binder32bit: true,
3801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003802 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 vndk: {
3804 enabled: true,
3805 },
3806 arch: {
3807 arm: {
3808 srcs: ["libvndk27binder32.so"],
3809 }
3810 },
Colin Cross2807f002021-03-02 10:15:29 -08003811 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003812 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003813 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003814 withFiles(map[string][]byte{
3815 "libvndk27.so": nil,
3816 "libvndk27binder32.so": nil,
3817 }),
3818 withBinder32bit,
3819 withTargets(map[android.OsType][]android.Target{
3820 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003821 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3822 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003823 },
3824 }),
3825 )
3826
Colin Cross2807f002021-03-02 10:15:29 -08003827 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003828 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003829 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003830 })
3831}
3832
Jooyung Han45a96772020-06-15 14:59:42 +09003833func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003834 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003835 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003836 name: "com.android.vndk.current",
3837 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003838 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003839 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003840 }
3841
3842 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003843 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003844 public_key: "testkey.avbpubkey",
3845 private_key: "testkey.pem",
3846 }
3847
3848 cc_library {
3849 name: "libz",
3850 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003851 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003852 vndk: {
3853 enabled: true,
3854 },
3855 stubs: {
3856 symbol_file: "libz.map.txt",
3857 versions: ["30"],
3858 }
3859 }
3860 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3861 "libz.map.txt": nil,
3862 }))
3863
Colin Cross2807f002021-03-02 10:15:29 -08003864 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003865 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3866 ensureListEmpty(t, provideNativeLibs)
3867}
3868
Jooyung Hane1633032019-08-01 17:41:43 +09003869func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003870 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003871 apex {
3872 name: "myapex_nodep",
3873 key: "myapex.key",
3874 native_shared_libs: ["lib_nodep"],
3875 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003876 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003877 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003878 }
3879
3880 apex {
3881 name: "myapex_dep",
3882 key: "myapex.key",
3883 native_shared_libs: ["lib_dep"],
3884 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003885 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003886 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003887 }
3888
3889 apex {
3890 name: "myapex_provider",
3891 key: "myapex.key",
3892 native_shared_libs: ["libfoo"],
3893 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003896 }
3897
3898 apex {
3899 name: "myapex_selfcontained",
3900 key: "myapex.key",
3901 native_shared_libs: ["lib_dep", "libfoo"],
3902 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 apex_key {
3908 name: "myapex.key",
3909 public_key: "testkey.avbpubkey",
3910 private_key: "testkey.pem",
3911 }
3912
3913 cc_library {
3914 name: "lib_nodep",
3915 srcs: ["mylib.cpp"],
3916 system_shared_libs: [],
3917 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003918 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003919 }
3920
3921 cc_library {
3922 name: "lib_dep",
3923 srcs: ["mylib.cpp"],
3924 shared_libs: ["libfoo"],
3925 system_shared_libs: [],
3926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003927 apex_available: [
3928 "myapex_dep",
3929 "myapex_provider",
3930 "myapex_selfcontained",
3931 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 cc_library {
3935 name: "libfoo",
3936 srcs: ["mytest.cpp"],
3937 stubs: {
3938 versions: ["1"],
3939 },
3940 system_shared_libs: [],
3941 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003942 apex_available: [
3943 "myapex_provider",
3944 "myapex_selfcontained",
3945 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003946 }
3947 `)
3948
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003949 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003950 var provideNativeLibs, requireNativeLibs []string
3951
Sundong Ahnabb64432019-10-22 13:58:29 +09003952 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003953 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3954 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003955 ensureListEmpty(t, provideNativeLibs)
3956 ensureListEmpty(t, requireNativeLibs)
3957
Sundong Ahnabb64432019-10-22 13:58:29 +09003958 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003959 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3960 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003961 ensureListEmpty(t, provideNativeLibs)
3962 ensureListContains(t, requireNativeLibs, "libfoo.so")
3963
Sundong Ahnabb64432019-10-22 13:58:29 +09003964 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003965 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3966 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003967 ensureListContains(t, provideNativeLibs, "libfoo.so")
3968 ensureListEmpty(t, requireNativeLibs)
3969
Sundong Ahnabb64432019-10-22 13:58:29 +09003970 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003971 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3972 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003973 ensureListContains(t, provideNativeLibs, "libfoo.so")
3974 ensureListEmpty(t, requireNativeLibs)
3975}
3976
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003977func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003979 apex {
3980 name: "myapex",
3981 key: "myapex.key",
3982 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003983 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003985 }
3986
3987 apex_key {
3988 name: "myapex.key",
3989 public_key: "testkey.avbpubkey",
3990 private_key: "testkey.pem",
3991 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003992
3993 cc_library {
3994 name: "mylib",
3995 srcs: ["mylib.cpp"],
3996 system_shared_libs: [],
3997 stl: "none",
3998 apex_available: [
3999 "//apex_available:platform",
4000 "myapex",
4001 ],
4002 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004003 `)
4004
Sundong Ahnabb64432019-10-22 13:58:29 +09004005 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004006 apexManifestRule := module.Rule("apexManifestRule")
4007 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4008 apexRule := module.Rule("apexRule")
4009 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004010
4011 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004012 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004013 name := apexBundle.BaseModuleName()
4014 prefix := "TARGET_"
4015 var builder strings.Builder
4016 data.Custom(&builder, name, prefix, "", data)
4017 androidMk := builder.String()
4018 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4019 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004020}
4021
Alex Light0851b882019-02-07 13:20:53 -08004022func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004023 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004024 apex {
4025 name: "myapex",
4026 key: "myapex.key",
4027 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004029 }
4030
4031 apex_key {
4032 name: "myapex.key",
4033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
4037 cc_library {
4038 name: "mylib_common",
4039 srcs: ["mylib.cpp"],
4040 system_shared_libs: [],
4041 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004042 apex_available: [
4043 "//apex_available:platform",
4044 "myapex",
4045 ],
Alex Light0851b882019-02-07 13:20:53 -08004046 }
4047 `)
4048
Sundong Ahnabb64432019-10-22 13:58:29 +09004049 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004050 apexRule := module.Rule("apexRule")
4051 copyCmds := apexRule.Args["copy_commands"]
4052
4053 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4054 t.Log("Apex was a test apex!")
4055 t.Fail()
4056 }
4057 // Ensure that main rule creates an output
4058 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4059
4060 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004061 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004062
4063 // Ensure that both direct and indirect deps are copied into apex
4064 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4065
Colin Cross7113d202019-11-20 16:39:12 -08004066 // Ensure that the platform variant ends with _shared
4067 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004068
Colin Cross56a83212020-09-15 18:30:11 -07004069 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004070 t.Log("Found mylib_common not in any apex!")
4071 t.Fail()
4072 }
4073}
4074
4075func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004076 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004077 apex_test {
4078 name: "myapex",
4079 key: "myapex.key",
4080 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004081 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004082 }
4083
4084 apex_key {
4085 name: "myapex.key",
4086 public_key: "testkey.avbpubkey",
4087 private_key: "testkey.pem",
4088 }
4089
4090 cc_library {
4091 name: "mylib_common_test",
4092 srcs: ["mylib.cpp"],
4093 system_shared_libs: [],
4094 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004095 // TODO: remove //apex_available:platform
4096 apex_available: [
4097 "//apex_available:platform",
4098 "myapex",
4099 ],
Alex Light0851b882019-02-07 13:20:53 -08004100 }
4101 `)
4102
Sundong Ahnabb64432019-10-22 13:58:29 +09004103 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004104 apexRule := module.Rule("apexRule")
4105 copyCmds := apexRule.Args["copy_commands"]
4106
4107 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4108 t.Log("Apex was not a test apex!")
4109 t.Fail()
4110 }
4111 // Ensure that main rule creates an output
4112 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4113
4114 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004115 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004116
4117 // Ensure that both direct and indirect deps are copied into apex
4118 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4119
Colin Cross7113d202019-11-20 16:39:12 -08004120 // Ensure that the platform variant ends with _shared
4121 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004122}
4123
Alex Light9670d332019-01-29 18:07:33 -08004124func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004125 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004129 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004130 multilib: {
4131 first: {
4132 native_shared_libs: ["mylib_common"],
4133 }
4134 },
4135 target: {
4136 android: {
4137 multilib: {
4138 first: {
4139 native_shared_libs: ["mylib"],
4140 }
4141 }
4142 },
4143 host: {
4144 multilib: {
4145 first: {
4146 native_shared_libs: ["mylib2"],
4147 }
4148 }
4149 }
4150 }
4151 }
4152
4153 apex_key {
4154 name: "myapex.key",
4155 public_key: "testkey.avbpubkey",
4156 private_key: "testkey.pem",
4157 }
4158
4159 cc_library {
4160 name: "mylib",
4161 srcs: ["mylib.cpp"],
4162 system_shared_libs: [],
4163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004164 // TODO: remove //apex_available:platform
4165 apex_available: [
4166 "//apex_available:platform",
4167 "myapex",
4168 ],
Alex Light9670d332019-01-29 18:07:33 -08004169 }
4170
4171 cc_library {
4172 name: "mylib_common",
4173 srcs: ["mylib.cpp"],
4174 system_shared_libs: [],
4175 stl: "none",
4176 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004177 // TODO: remove //apex_available:platform
4178 apex_available: [
4179 "//apex_available:platform",
4180 "myapex",
4181 ],
Alex Light9670d332019-01-29 18:07:33 -08004182 }
4183
4184 cc_library {
4185 name: "mylib2",
4186 srcs: ["mylib.cpp"],
4187 system_shared_libs: [],
4188 stl: "none",
4189 compile_multilib: "first",
4190 }
4191 `)
4192
Sundong Ahnabb64432019-10-22 13:58:29 +09004193 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004194 copyCmds := apexRule.Args["copy_commands"]
4195
4196 // Ensure that main rule creates an output
4197 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4198
4199 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004200 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4201 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4202 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004203
4204 // Ensure that both direct and indirect deps are copied into apex
4205 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4206 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4207 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4208
Colin Cross7113d202019-11-20 16:39:12 -08004209 // Ensure that the platform variant ends with _shared
4210 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4211 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4212 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004213}
Jiyong Park04480cf2019-02-06 00:16:29 +09004214
Jiyong Park59140302020-12-14 18:44:04 +09004215func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004216 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004217 apex {
4218 name: "myapex",
4219 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004220 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004221 arch: {
4222 arm64: {
4223 native_shared_libs: ["mylib.arm64"],
4224 },
4225 x86_64: {
4226 native_shared_libs: ["mylib.x64"],
4227 },
4228 }
4229 }
4230
4231 apex_key {
4232 name: "myapex.key",
4233 public_key: "testkey.avbpubkey",
4234 private_key: "testkey.pem",
4235 }
4236
4237 cc_library {
4238 name: "mylib.arm64",
4239 srcs: ["mylib.cpp"],
4240 system_shared_libs: [],
4241 stl: "none",
4242 // TODO: remove //apex_available:platform
4243 apex_available: [
4244 "//apex_available:platform",
4245 "myapex",
4246 ],
4247 }
4248
4249 cc_library {
4250 name: "mylib.x64",
4251 srcs: ["mylib.cpp"],
4252 system_shared_libs: [],
4253 stl: "none",
4254 // TODO: remove //apex_available:platform
4255 apex_available: [
4256 "//apex_available:platform",
4257 "myapex",
4258 ],
4259 }
4260 `)
4261
4262 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4263 copyCmds := apexRule.Args["copy_commands"]
4264
4265 // Ensure that apex variant is created for the direct dep
4266 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4267 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4268
4269 // Ensure that both direct and indirect deps are copied into apex
4270 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4271 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4272}
4273
Jiyong Park04480cf2019-02-06 00:16:29 +09004274func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004275 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004276 apex {
4277 name: "myapex",
4278 key: "myapex.key",
4279 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004280 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004281 }
4282
4283 apex_key {
4284 name: "myapex.key",
4285 public_key: "testkey.avbpubkey",
4286 private_key: "testkey.pem",
4287 }
4288
4289 sh_binary {
4290 name: "myscript",
4291 src: "mylib.cpp",
4292 filename: "myscript.sh",
4293 sub_dir: "script",
4294 }
4295 `)
4296
Sundong Ahnabb64432019-10-22 13:58:29 +09004297 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004298 copyCmds := apexRule.Args["copy_commands"]
4299
4300 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4301}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004302
Jooyung Han91df2082019-11-20 01:49:42 +09004303func TestApexInVariousPartition(t *testing.T) {
4304 testcases := []struct {
4305 propName, parition, flattenedPartition string
4306 }{
4307 {"", "system", "system_ext"},
4308 {"product_specific: true", "product", "product"},
4309 {"soc_specific: true", "vendor", "vendor"},
4310 {"proprietary: true", "vendor", "vendor"},
4311 {"vendor: true", "vendor", "vendor"},
4312 {"system_ext_specific: true", "system_ext", "system_ext"},
4313 }
4314 for _, tc := range testcases {
4315 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004316 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004317 apex {
4318 name: "myapex",
4319 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004320 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004321 `+tc.propName+`
4322 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004323
Jooyung Han91df2082019-11-20 01:49:42 +09004324 apex_key {
4325 name: "myapex.key",
4326 public_key: "testkey.avbpubkey",
4327 private_key: "testkey.pem",
4328 }
4329 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004330
Jooyung Han91df2082019-11-20 01:49:42 +09004331 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004332 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4333 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004334 if actual != expected {
4335 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4336 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004337
Jooyung Han91df2082019-11-20 01:49:42 +09004338 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004339 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4340 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004341 if actual != expected {
4342 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4343 }
4344 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004345 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004346}
Jiyong Park67882562019-03-21 01:11:21 +09004347
Jooyung Han580eb4f2020-06-24 19:33:06 +09004348func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004349 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004350 apex {
4351 name: "myapex",
4352 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004353 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004354 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004355
Jooyung Han580eb4f2020-06-24 19:33:06 +09004356 apex_key {
4357 name: "myapex.key",
4358 public_key: "testkey.avbpubkey",
4359 private_key: "testkey.pem",
4360 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004361 `)
4362 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004363 rule := module.Output("file_contexts")
4364 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4365}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004366
Jooyung Han580eb4f2020-06-24 19:33:06 +09004367func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004368 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004369 apex {
4370 name: "myapex",
4371 key: "myapex.key",
4372 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004373 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004374 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004375
Jooyung Han580eb4f2020-06-24 19:33:06 +09004376 apex_key {
4377 name: "myapex.key",
4378 public_key: "testkey.avbpubkey",
4379 private_key: "testkey.pem",
4380 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004381 `, withFiles(map[string][]byte{
4382 "my_own_file_contexts": nil,
4383 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004384}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004385
Jooyung Han580eb4f2020-06-24 19:33:06 +09004386func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004387 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004388 apex {
4389 name: "myapex",
4390 key: "myapex.key",
4391 product_specific: true,
4392 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004394 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004395
Jooyung Han580eb4f2020-06-24 19:33:06 +09004396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 `)
4402
Colin Cross1c460562021-02-16 17:55:47 -08004403 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004404 apex {
4405 name: "myapex",
4406 key: "myapex.key",
4407 product_specific: true,
4408 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004410 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004411
Jooyung Han580eb4f2020-06-24 19:33:06 +09004412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417 `, withFiles(map[string][]byte{
4418 "product_specific_file_contexts": nil,
4419 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004420 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4421 rule := module.Output("file_contexts")
4422 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4423}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004424
Jooyung Han580eb4f2020-06-24 19:33:06 +09004425func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004426 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427 apex {
4428 name: "myapex",
4429 key: "myapex.key",
4430 product_specific: true,
4431 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004432 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004434
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004440
Jooyung Han580eb4f2020-06-24 19:33:06 +09004441 filegroup {
4442 name: "my-file-contexts",
4443 srcs: ["product_specific_file_contexts"],
4444 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445 `, withFiles(map[string][]byte{
4446 "product_specific_file_contexts": nil,
4447 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4449 rule := module.Output("file_contexts")
4450 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004451}
4452
Jiyong Park67882562019-03-21 01:11:21 +09004453func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004454 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004455 apex_key {
4456 name: "myapex.key",
4457 public_key: ":my.avbpubkey",
4458 private_key: ":my.pem",
4459 product_specific: true,
4460 }
4461
4462 filegroup {
4463 name: "my.avbpubkey",
4464 srcs: ["testkey2.avbpubkey"],
4465 }
4466
4467 filegroup {
4468 name: "my.pem",
4469 srcs: ["testkey2.pem"],
4470 }
4471 `)
4472
4473 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4474 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004475 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004476 if actual_pubkey != expected_pubkey {
4477 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4478 }
4479 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004480 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004481 if actual_privkey != expected_privkey {
4482 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4483 }
4484}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004485
4486func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004487 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004488 prebuilt_apex {
4489 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004490 arch: {
4491 arm64: {
4492 src: "myapex-arm64.apex",
4493 },
4494 arm: {
4495 src: "myapex-arm.apex",
4496 },
4497 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004498 }
4499 `)
4500
Paul Duffin6717d882021-06-15 19:09:41 +01004501 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004502
Jiyong Parkc95714e2019-03-29 14:23:10 +09004503 expectedInput := "myapex-arm64.apex"
4504 if prebuilt.inputApex.String() != expectedInput {
4505 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4506 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004507}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004508
Paul Duffinc0609c62021-03-01 17:27:16 +00004509func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004510 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004511 prebuilt_apex {
4512 name: "myapex",
4513 }
4514 `)
4515}
4516
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004517func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004518 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004519 prebuilt_apex {
4520 name: "myapex",
4521 src: "myapex-arm.apex",
4522 filename: "notmyapex.apex",
4523 }
4524 `)
4525
Paul Duffin6717d882021-06-15 19:09:41 +01004526 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004527
4528 expected := "notmyapex.apex"
4529 if p.installFilename != expected {
4530 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4531 }
4532}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004533
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004534func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004535 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004536 prebuilt_apex {
4537 name: "myapex.prebuilt",
4538 src: "myapex-arm.apex",
4539 overrides: [
4540 "myapex",
4541 ],
4542 }
4543 `)
4544
Paul Duffin6717d882021-06-15 19:09:41 +01004545 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004546
4547 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004548 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004549 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004550 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004551 }
4552}
4553
Paul Duffin092153d2021-01-26 11:42:39 +00004554// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4555// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004556func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004557 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004558
Paul Duffin89886cb2021-02-05 16:44:03 +00004559 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004560 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004561 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004562 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004563 stem := android.RemoveOptionalPrebuiltPrefix(name)
4564 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004565 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4566 }
4567 }
4568
Paul Duffin39853512021-02-26 11:09:39 +00004569 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004570 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004571 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004572 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4573 }
4574 }
4575
4576 t.Run("prebuilt only", func(t *testing.T) {
4577 bp := `
4578 prebuilt_apex {
4579 name: "myapex",
4580 arch: {
4581 arm64: {
4582 src: "myapex-arm64.apex",
4583 },
4584 arm: {
4585 src: "myapex-arm.apex",
4586 },
4587 },
Paul Duffin39853512021-02-26 11:09:39 +00004588 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004589 }
4590
4591 java_import {
4592 name: "libfoo",
4593 jars: ["libfoo.jar"],
4594 }
Paul Duffin39853512021-02-26 11:09:39 +00004595
4596 java_sdk_library_import {
4597 name: "libbar",
4598 public: {
4599 jars: ["libbar.jar"],
4600 },
4601 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004602 `
4603
4604 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4605 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4606
Paul Duffinf6932af2021-02-26 18:21:56 +00004607 // Make sure that the deapexer has the correct input APEX.
4608 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4609 rule := deapexer.Rule("deapexer")
4610 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4611 t.Errorf("expected: %q, found: %q", expected, actual)
4612 }
4613
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004614 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004615 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004616 rule = prebuiltApex.Rule("android/soong/android.Cp")
4617 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4618 t.Errorf("expected: %q, found: %q", expected, actual)
4619 }
4620
Paul Duffin89886cb2021-02-05 16:44:03 +00004621 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004622
4623 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004624 })
4625
4626 t.Run("prebuilt with source preferred", func(t *testing.T) {
4627
4628 bp := `
4629 prebuilt_apex {
4630 name: "myapex",
4631 arch: {
4632 arm64: {
4633 src: "myapex-arm64.apex",
4634 },
4635 arm: {
4636 src: "myapex-arm.apex",
4637 },
4638 },
Paul Duffin39853512021-02-26 11:09:39 +00004639 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004640 }
4641
4642 java_import {
4643 name: "libfoo",
4644 jars: ["libfoo.jar"],
4645 }
4646
4647 java_library {
4648 name: "libfoo",
4649 }
Paul Duffin39853512021-02-26 11:09:39 +00004650
4651 java_sdk_library_import {
4652 name: "libbar",
4653 public: {
4654 jars: ["libbar.jar"],
4655 },
4656 }
4657
4658 java_sdk_library {
4659 name: "libbar",
4660 srcs: ["foo/bar/MyClass.java"],
4661 unsafe_ignore_missing_latest_api: true,
4662 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004663 `
4664
4665 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4666 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4667
Paul Duffin89886cb2021-02-05 16:44:03 +00004668 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004669 ensureNoSourceVariant(t, ctx, "libfoo")
4670
4671 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4672 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004673 })
4674
4675 t.Run("prebuilt preferred with source", func(t *testing.T) {
4676 bp := `
4677 prebuilt_apex {
4678 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004679 arch: {
4680 arm64: {
4681 src: "myapex-arm64.apex",
4682 },
4683 arm: {
4684 src: "myapex-arm.apex",
4685 },
4686 },
Paul Duffin39853512021-02-26 11:09:39 +00004687 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004688 }
4689
4690 java_import {
4691 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004692 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004693 jars: ["libfoo.jar"],
4694 }
4695
4696 java_library {
4697 name: "libfoo",
4698 }
Paul Duffin39853512021-02-26 11:09:39 +00004699
4700 java_sdk_library_import {
4701 name: "libbar",
4702 prefer: true,
4703 public: {
4704 jars: ["libbar.jar"],
4705 },
4706 }
4707
4708 java_sdk_library {
4709 name: "libbar",
4710 srcs: ["foo/bar/MyClass.java"],
4711 unsafe_ignore_missing_latest_api: true,
4712 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004713 `
4714
4715 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4716 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4717
Paul Duffin89886cb2021-02-05 16:44:03 +00004718 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004719 ensureNoSourceVariant(t, ctx, "libfoo")
4720
4721 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4722 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004723 })
4724}
4725
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004726func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004727 preparer := android.GroupFixturePreparers(
4728 java.FixtureConfigureBootJars("myapex:libfoo", "myapex:libbar"),
4729 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4730 // is disabled.
4731 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4732 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004733
Paul Duffin37856732021-02-26 14:24:15 +00004734 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4735 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004736 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004737 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004738 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004739 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004740 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004741 foundLibfooJar = true
4742 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004743 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004744 }
4745 }
4746 if !foundLibfooJar {
Paul Duffin55607122021-03-30 23:32:51 +01004747 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().BuildDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004748 }
4749 }
4750
Paul Duffind061d402021-06-07 21:36:01 +01004751 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004752 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004753 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004754 var rule android.TestingBuildParams
4755
4756 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4757 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004758 }
4759
Paul Duffin89f570a2021-06-16 01:42:33 +01004760 fragment := java.ApexVariantReference{
4761 Apex: proptools.StringPtr("myapex"),
4762 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4763 }
4764
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004765 t.Run("prebuilt only", func(t *testing.T) {
4766 bp := `
4767 prebuilt_apex {
4768 name: "myapex",
4769 arch: {
4770 arm64: {
4771 src: "myapex-arm64.apex",
4772 },
4773 arm: {
4774 src: "myapex-arm.apex",
4775 },
4776 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004777 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4778 }
4779
4780 prebuilt_bootclasspath_fragment {
4781 name: "my-bootclasspath-fragment",
4782 contents: ["libfoo", "libbar"],
4783 apex_available: ["myapex"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004784 }
4785
4786 java_import {
4787 name: "libfoo",
4788 jars: ["libfoo.jar"],
4789 apex_available: ["myapex"],
4790 }
Paul Duffin37856732021-02-26 14:24:15 +00004791
4792 java_sdk_library_import {
4793 name: "libbar",
4794 public: {
4795 jars: ["libbar.jar"],
4796 },
4797 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004798 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00004799 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004800 `
4801
Paul Duffin89f570a2021-06-16 01:42:33 +01004802 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004803 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4804 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004805
Paul Duffin537ea3d2021-05-14 10:38:00 +01004806 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin9d67ca62021-02-03 20:06:33 +00004807 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin51d7da22021-06-16 02:04:13 +01004808 out/soong/.intermediates/libbar.stubs/android_common/combined/libbar.stubs.jar
4809 out/soong/.intermediates/libfoo/android_common_myapex/combined/libfoo.jar
4810 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004811 })
4812
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004813 t.Run("apex_set only", func(t *testing.T) {
4814 bp := `
4815 apex_set {
4816 name: "myapex",
4817 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004818 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4819 }
4820
4821 prebuilt_bootclasspath_fragment {
4822 name: "my-bootclasspath-fragment",
4823 contents: ["libfoo", "libbar"],
4824 apex_available: ["myapex"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004825 }
4826
4827 java_import {
4828 name: "libfoo",
4829 jars: ["libfoo.jar"],
4830 apex_available: ["myapex"],
4831 }
4832
4833 java_sdk_library_import {
4834 name: "libbar",
4835 public: {
4836 jars: ["libbar.jar"],
4837 },
4838 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004839 shared_library: false,
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004840 }
4841 `
4842
Paul Duffin89f570a2021-06-16 01:42:33 +01004843 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004844 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4845 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
4846
Paul Duffin537ea3d2021-05-14 10:38:00 +01004847 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004848 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin51d7da22021-06-16 02:04:13 +01004849 out/soong/.intermediates/libbar.stubs/android_common/combined/libbar.stubs.jar
4850 out/soong/.intermediates/libfoo/android_common_myapex/combined/libfoo.jar
4851 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004852 })
4853
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004854 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4855 bp := `
4856 prebuilt_apex {
4857 name: "myapex",
4858 arch: {
4859 arm64: {
4860 src: "myapex-arm64.apex",
4861 },
4862 arm: {
4863 src: "myapex-arm.apex",
4864 },
4865 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004866 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4867 }
4868
4869 prebuilt_bootclasspath_fragment {
4870 name: "my-bootclasspath-fragment",
4871 contents: ["libfoo", "libbar"],
4872 apex_available: ["myapex"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004873 }
4874
4875 java_import {
4876 name: "libfoo",
4877 jars: ["libfoo.jar"],
4878 apex_available: ["myapex"],
4879 }
4880
4881 java_library {
4882 name: "libfoo",
4883 srcs: ["foo/bar/MyClass.java"],
4884 apex_available: ["myapex"],
4885 }
Paul Duffin37856732021-02-26 14:24:15 +00004886
4887 java_sdk_library_import {
4888 name: "libbar",
4889 public: {
4890 jars: ["libbar.jar"],
4891 },
4892 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004893 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00004894 }
4895
4896 java_sdk_library {
4897 name: "libbar",
4898 srcs: ["foo/bar/MyClass.java"],
4899 unsafe_ignore_missing_latest_api: true,
4900 apex_available: ["myapex"],
4901 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004902 `
4903
4904 // In this test the source (java_library) libfoo is active since the
4905 // prebuilt (java_import) defaults to prefer:false. However the
4906 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4907 // find the dex boot jar in it. We either need to disable the source libfoo
4908 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01004909 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004910 })
4911
4912 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4913 bp := `
4914 prebuilt_apex {
4915 name: "myapex",
4916 arch: {
4917 arm64: {
4918 src: "myapex-arm64.apex",
4919 },
4920 arm: {
4921 src: "myapex-arm.apex",
4922 },
4923 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004924 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4925 }
4926
4927 prebuilt_bootclasspath_fragment {
4928 name: "my-bootclasspath-fragment",
4929 contents: ["libfoo", "libbar"],
4930 apex_available: ["myapex"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004931 }
4932
4933 java_import {
4934 name: "libfoo",
4935 prefer: true,
4936 jars: ["libfoo.jar"],
4937 apex_available: ["myapex"],
4938 }
4939
4940 java_library {
4941 name: "libfoo",
4942 srcs: ["foo/bar/MyClass.java"],
4943 apex_available: ["myapex"],
4944 }
Paul Duffin37856732021-02-26 14:24:15 +00004945
4946 java_sdk_library_import {
4947 name: "libbar",
4948 prefer: true,
4949 public: {
4950 jars: ["libbar.jar"],
4951 },
4952 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004953 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00004954 }
4955
4956 java_sdk_library {
4957 name: "libbar",
4958 srcs: ["foo/bar/MyClass.java"],
4959 unsafe_ignore_missing_latest_api: true,
4960 apex_available: ["myapex"],
4961 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004962 `
4963
Paul Duffin89f570a2021-06-16 01:42:33 +01004964 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004965 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4966 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004967
Paul Duffin537ea3d2021-05-14 10:38:00 +01004968 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin9d67ca62021-02-03 20:06:33 +00004969 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin51d7da22021-06-16 02:04:13 +01004970 out/soong/.intermediates/prebuilt_libbar.stubs/android_common/combined/libbar.stubs.jar
4971 out/soong/.intermediates/prebuilt_libfoo/android_common_myapex/combined/libfoo.jar
4972 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004973 })
4974
4975 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4976 bp := `
4977 apex {
4978 name: "myapex",
4979 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004980 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004981 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004982 }
4983
4984 apex_key {
4985 name: "myapex.key",
4986 public_key: "testkey.avbpubkey",
4987 private_key: "testkey.pem",
4988 }
4989
4990 prebuilt_apex {
4991 name: "myapex",
4992 arch: {
4993 arm64: {
4994 src: "myapex-arm64.apex",
4995 },
4996 arm: {
4997 src: "myapex-arm.apex",
4998 },
4999 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005000 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5001 }
5002
5003 prebuilt_bootclasspath_fragment {
5004 name: "my-bootclasspath-fragment",
5005 contents: ["libfoo", "libbar"],
5006 apex_available: ["myapex"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005007 }
5008
5009 java_import {
5010 name: "libfoo",
5011 jars: ["libfoo.jar"],
5012 apex_available: ["myapex"],
5013 }
5014
5015 java_library {
5016 name: "libfoo",
5017 srcs: ["foo/bar/MyClass.java"],
5018 apex_available: ["myapex"],
5019 }
Paul Duffin37856732021-02-26 14:24:15 +00005020
5021 java_sdk_library_import {
5022 name: "libbar",
5023 public: {
5024 jars: ["libbar.jar"],
5025 },
5026 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005027 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005028 }
5029
5030 java_sdk_library {
5031 name: "libbar",
5032 srcs: ["foo/bar/MyClass.java"],
5033 unsafe_ignore_missing_latest_api: true,
5034 apex_available: ["myapex"],
5035 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005036 `
5037
Paul Duffin89f570a2021-06-16 01:42:33 +01005038 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005039 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5040 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005041
Paul Duffin537ea3d2021-05-14 10:38:00 +01005042 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin4fd997b2021-02-03 20:06:33 +00005043 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin51d7da22021-06-16 02:04:13 +01005044 out/soong/.intermediates/libbar/android_common_myapex/javac/libbar.jar
5045 out/soong/.intermediates/libfoo/android_common_apex10000/javac/libfoo.jar
5046 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005047 })
5048
5049 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5050 bp := `
5051 apex {
5052 name: "myapex",
5053 enabled: false,
5054 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005055 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005056 }
5057
5058 apex_key {
5059 name: "myapex.key",
5060 public_key: "testkey.avbpubkey",
5061 private_key: "testkey.pem",
5062 }
5063
5064 prebuilt_apex {
5065 name: "myapex",
5066 arch: {
5067 arm64: {
5068 src: "myapex-arm64.apex",
5069 },
5070 arm: {
5071 src: "myapex-arm.apex",
5072 },
5073 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005074 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5075 }
5076
5077 prebuilt_bootclasspath_fragment {
5078 name: "my-bootclasspath-fragment",
5079 contents: ["libfoo", "libbar"],
5080 apex_available: ["myapex"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005081 }
5082
5083 java_import {
5084 name: "libfoo",
5085 prefer: true,
5086 jars: ["libfoo.jar"],
5087 apex_available: ["myapex"],
5088 }
5089
5090 java_library {
5091 name: "libfoo",
5092 srcs: ["foo/bar/MyClass.java"],
5093 apex_available: ["myapex"],
5094 }
Paul Duffin37856732021-02-26 14:24:15 +00005095
5096 java_sdk_library_import {
5097 name: "libbar",
5098 prefer: true,
5099 public: {
5100 jars: ["libbar.jar"],
5101 },
5102 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005103 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005104 }
5105
5106 java_sdk_library {
5107 name: "libbar",
5108 srcs: ["foo/bar/MyClass.java"],
5109 unsafe_ignore_missing_latest_api: true,
5110 apex_available: ["myapex"],
5111 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005112 `
5113
Paul Duffin89f570a2021-06-16 01:42:33 +01005114 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005115 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5116 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005117
Paul Duffin537ea3d2021-05-14 10:38:00 +01005118 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin9d67ca62021-02-03 20:06:33 +00005119 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin51d7da22021-06-16 02:04:13 +01005120 out/soong/.intermediates/prebuilt_libbar.stubs/android_common/combined/libbar.stubs.jar
5121 out/soong/.intermediates/prebuilt_libfoo/android_common_myapex/combined/libfoo.jar
5122 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005123 })
5124}
5125
Roland Levillain630846d2019-06-26 12:48:34 +01005126func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005127 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005128 apex_test {
5129 name: "myapex",
5130 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005131 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005132 tests: [
5133 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005134 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005135 ],
5136 }
5137
5138 apex_key {
5139 name: "myapex.key",
5140 public_key: "testkey.avbpubkey",
5141 private_key: "testkey.pem",
5142 }
5143
Liz Kammer1c14a212020-05-12 15:26:55 -07005144 filegroup {
5145 name: "fg",
5146 srcs: [
5147 "baz",
5148 "bar/baz"
5149 ],
5150 }
5151
Roland Levillain630846d2019-06-26 12:48:34 +01005152 cc_test {
5153 name: "mytest",
5154 gtest: false,
5155 srcs: ["mytest.cpp"],
5156 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005157 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005158 system_shared_libs: [],
5159 static_executable: true,
5160 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005161 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005162 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005163
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005164 cc_library {
5165 name: "mylib",
5166 srcs: ["mylib.cpp"],
5167 system_shared_libs: [],
5168 stl: "none",
5169 }
5170
Liz Kammer5bd365f2020-05-27 15:15:11 -07005171 filegroup {
5172 name: "fg2",
5173 srcs: [
5174 "testdata/baz"
5175 ],
5176 }
5177
Roland Levillain9b5fde92019-06-28 15:41:19 +01005178 cc_test {
5179 name: "mytests",
5180 gtest: false,
5181 srcs: [
5182 "mytest1.cpp",
5183 "mytest2.cpp",
5184 "mytest3.cpp",
5185 ],
5186 test_per_src: true,
5187 relative_install_path: "test",
5188 system_shared_libs: [],
5189 static_executable: true,
5190 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005191 data: [
5192 ":fg",
5193 ":fg2",
5194 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005195 }
Roland Levillain630846d2019-06-26 12:48:34 +01005196 `)
5197
Sundong Ahnabb64432019-10-22 13:58:29 +09005198 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005199 copyCmds := apexRule.Args["copy_commands"]
5200
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005201 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005202 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005203 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005204
Liz Kammer1c14a212020-05-12 15:26:55 -07005205 //Ensure that test data are copied into apex.
5206 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5207 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5208
Roland Levillain9b5fde92019-06-28 15:41:19 +01005209 // Ensure that test deps built with `test_per_src` are copied into apex.
5210 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5211 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5212 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005213
5214 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005215 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005216 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005217 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005218 prefix := "TARGET_"
5219 var builder strings.Builder
5220 data.Custom(&builder, name, prefix, "", data)
5221 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005222 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5223 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5224 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5225 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005226 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005227 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005228 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005229
5230 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005231 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005232 data.Custom(&builder, name, prefix, "", data)
5233 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005234 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5235 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005236}
5237
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005238func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005239 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005240 apex {
5241 name: "myapex",
5242 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005243 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005244 }
5245 apex_key {
5246 name: "myapex.key",
5247 public_key: "testkey.avbpubkey",
5248 private_key: "testkey.pem",
5249 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005250 `,
5251 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5252 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5253 }),
5254 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005255 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005256 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005257 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005258 var builder strings.Builder
5259 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5260 androidMk := builder.String()
5261 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5262}
5263
Jooyung Hand48f3c32019-08-23 11:18:57 +09005264func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5265 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5266 apex {
5267 name: "myapex",
5268 key: "myapex.key",
5269 native_shared_libs: ["libfoo"],
5270 }
5271
5272 apex_key {
5273 name: "myapex.key",
5274 public_key: "testkey.avbpubkey",
5275 private_key: "testkey.pem",
5276 }
5277
5278 cc_library {
5279 name: "libfoo",
5280 stl: "none",
5281 system_shared_libs: [],
5282 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005283 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005284 }
5285 `)
5286 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5287 apex {
5288 name: "myapex",
5289 key: "myapex.key",
5290 java_libs: ["myjar"],
5291 }
5292
5293 apex_key {
5294 name: "myapex.key",
5295 public_key: "testkey.avbpubkey",
5296 private_key: "testkey.pem",
5297 }
5298
5299 java_library {
5300 name: "myjar",
5301 srcs: ["foo/bar/MyClass.java"],
5302 sdk_version: "none",
5303 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005304 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005305 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005306 }
5307 `)
5308}
5309
Bill Peckhama41a6962021-01-11 10:58:54 -08005310func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005311 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005312 apex {
5313 name: "myapex",
5314 key: "myapex.key",
5315 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005316 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005317 }
5318
5319 apex_key {
5320 name: "myapex.key",
5321 public_key: "testkey.avbpubkey",
5322 private_key: "testkey.pem",
5323 }
5324
5325 java_import {
5326 name: "myjavaimport",
5327 apex_available: ["myapex"],
5328 jars: ["my.jar"],
5329 compile_dex: true,
5330 }
5331 `)
5332
5333 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5334 apexRule := module.Rule("apexRule")
5335 copyCmds := apexRule.Args["copy_commands"]
5336 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5337}
5338
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005339func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005340 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005341 apex {
5342 name: "myapex",
5343 key: "myapex.key",
5344 apps: [
5345 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005346 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005347 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005348 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005349 }
5350
5351 apex_key {
5352 name: "myapex.key",
5353 public_key: "testkey.avbpubkey",
5354 private_key: "testkey.pem",
5355 }
5356
5357 android_app {
5358 name: "AppFoo",
5359 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005360 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005361 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005362 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005364 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005365 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005366
5367 android_app {
5368 name: "AppFooPriv",
5369 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005370 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005371 system_modules: "none",
5372 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005373 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005374 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005375 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005376
5377 cc_library_shared {
5378 name: "libjni",
5379 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005380 shared_libs: ["libfoo"],
5381 stl: "none",
5382 system_shared_libs: [],
5383 apex_available: [ "myapex" ],
5384 sdk_version: "current",
5385 }
5386
5387 cc_library_shared {
5388 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005389 stl: "none",
5390 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005391 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005392 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005393 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005394 `)
5395
Sundong Ahnabb64432019-10-22 13:58:29 +09005396 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005397 apexRule := module.Rule("apexRule")
5398 copyCmds := apexRule.Args["copy_commands"]
5399
5400 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005401 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005402
Colin Crossaede88c2020-08-11 12:17:01 -07005403 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005404 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005405 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005406 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005407 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005408 // JNI libraries including transitive deps are
5409 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005410 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005411 // ... embedded inside APK (jnilibs.zip)
5412 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5413 // ... and not directly inside the APEX
5414 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5415 }
Dario Frenicde2a032019-10-27 00:29:22 +01005416}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005417
Dario Frenicde2a032019-10-27 00:29:22 +01005418func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005419 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005420 apex {
5421 name: "myapex",
5422 key: "myapex.key",
5423 apps: [
5424 "AppFooPrebuilt",
5425 "AppFooPrivPrebuilt",
5426 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005427 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005428 }
5429
5430 apex_key {
5431 name: "myapex.key",
5432 public_key: "testkey.avbpubkey",
5433 private_key: "testkey.pem",
5434 }
5435
5436 android_app_import {
5437 name: "AppFooPrebuilt",
5438 apk: "PrebuiltAppFoo.apk",
5439 presigned: true,
5440 dex_preopt: {
5441 enabled: false,
5442 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005443 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005444 }
5445
5446 android_app_import {
5447 name: "AppFooPrivPrebuilt",
5448 apk: "PrebuiltAppFooPriv.apk",
5449 privileged: true,
5450 presigned: true,
5451 dex_preopt: {
5452 enabled: false,
5453 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005454 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005455 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005456 }
5457 `)
5458
Sundong Ahnabb64432019-10-22 13:58:29 +09005459 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005460 apexRule := module.Rule("apexRule")
5461 copyCmds := apexRule.Args["copy_commands"]
5462
5463 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005464 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5465}
5466
5467func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005468 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005469 apex {
5470 name: "myapex",
5471 key: "myapex.key",
5472 apps: [
5473 "AppFoo",
5474 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005475 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005476 }
5477
5478 apex_key {
5479 name: "myapex.key",
5480 public_key: "testkey.avbpubkey",
5481 private_key: "testkey.pem",
5482 }
5483
5484 android_app {
5485 name: "AppFoo",
5486 srcs: ["foo/bar/MyClass.java"],
5487 sdk_version: "none",
5488 system_modules: "none",
5489 apex_available: [ "myapex" ],
5490 }
5491
5492 android_app_import {
5493 name: "AppFoo",
5494 apk: "AppFooPrebuilt.apk",
5495 filename: "AppFooPrebuilt.apk",
5496 presigned: true,
5497 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005498 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005499 }
5500 `, withFiles(map[string][]byte{
5501 "AppFooPrebuilt.apk": nil,
5502 }))
5503
5504 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005505 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005506 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005507}
5508
Dario Freni6f3937c2019-12-20 22:58:03 +00005509func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005510 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005511 apex {
5512 name: "myapex",
5513 key: "myapex.key",
5514 apps: [
5515 "TesterHelpAppFoo",
5516 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005517 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005518 }
5519
5520 apex_key {
5521 name: "myapex.key",
5522 public_key: "testkey.avbpubkey",
5523 private_key: "testkey.pem",
5524 }
5525
5526 android_test_helper_app {
5527 name: "TesterHelpAppFoo",
5528 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005529 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005530 }
5531
5532 `)
5533
5534 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5535 apexRule := module.Rule("apexRule")
5536 copyCmds := apexRule.Args["copy_commands"]
5537
5538 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5539}
5540
Jooyung Han18020ea2019-11-13 10:50:48 +09005541func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5542 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005543 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005544 apex {
5545 name: "myapex",
5546 key: "myapex.key",
5547 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005548 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005549 }
5550
5551 apex_key {
5552 name: "myapex.key",
5553 public_key: "testkey.avbpubkey",
5554 private_key: "testkey.pem",
5555 }
5556
5557 apex {
5558 name: "otherapex",
5559 key: "myapex.key",
5560 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005561 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005562 }
5563
5564 cc_defaults {
5565 name: "libfoo-defaults",
5566 apex_available: ["otherapex"],
5567 }
5568
5569 cc_library {
5570 name: "libfoo",
5571 defaults: ["libfoo-defaults"],
5572 stl: "none",
5573 system_shared_libs: [],
5574 }`)
5575}
5576
Paul Duffine52e66f2020-03-30 17:54:29 +01005577func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005578 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005579 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005580 apex {
5581 name: "myapex",
5582 key: "myapex.key",
5583 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005584 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005585 }
5586
5587 apex_key {
5588 name: "myapex.key",
5589 public_key: "testkey.avbpubkey",
5590 private_key: "testkey.pem",
5591 }
5592
5593 apex {
5594 name: "otherapex",
5595 key: "otherapex.key",
5596 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005597 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005598 }
5599
5600 apex_key {
5601 name: "otherapex.key",
5602 public_key: "testkey.avbpubkey",
5603 private_key: "testkey.pem",
5604 }
5605
5606 cc_library {
5607 name: "libfoo",
5608 stl: "none",
5609 system_shared_libs: [],
5610 apex_available: ["otherapex"],
5611 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005612}
Jiyong Park127b40b2019-09-30 16:04:35 +09005613
Paul Duffine52e66f2020-03-30 17:54:29 +01005614func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005615 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005616 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005617.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005618.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005619.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005620.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005621.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005622.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005623 apex {
5624 name: "myapex",
5625 key: "myapex.key",
5626 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005627 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005628 }
5629
5630 apex_key {
5631 name: "myapex.key",
5632 public_key: "testkey.avbpubkey",
5633 private_key: "testkey.pem",
5634 }
5635
Jiyong Park127b40b2019-09-30 16:04:35 +09005636 cc_library {
5637 name: "libfoo",
5638 stl: "none",
5639 shared_libs: ["libbar"],
5640 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005641 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005642 }
5643
5644 cc_library {
5645 name: "libbar",
5646 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005647 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005648 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005649 apex_available: ["myapex"],
5650 }
5651
5652 cc_library {
5653 name: "libbaz",
5654 stl: "none",
5655 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005656 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005657}
Jiyong Park127b40b2019-09-30 16:04:35 +09005658
Paul Duffine52e66f2020-03-30 17:54:29 +01005659func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005660 testApexError(t, "\"otherapex\" is not a valid module name", `
5661 apex {
5662 name: "myapex",
5663 key: "myapex.key",
5664 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005665 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005666 }
5667
5668 apex_key {
5669 name: "myapex.key",
5670 public_key: "testkey.avbpubkey",
5671 private_key: "testkey.pem",
5672 }
5673
5674 cc_library {
5675 name: "libfoo",
5676 stl: "none",
5677 system_shared_libs: [],
5678 apex_available: ["otherapex"],
5679 }`)
5680
Paul Duffine52e66f2020-03-30 17:54:29 +01005681 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005682 apex {
5683 name: "myapex",
5684 key: "myapex.key",
5685 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005686 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005687 }
5688
5689 apex_key {
5690 name: "myapex.key",
5691 public_key: "testkey.avbpubkey",
5692 private_key: "testkey.pem",
5693 }
5694
5695 cc_library {
5696 name: "libfoo",
5697 stl: "none",
5698 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005699 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005700 apex_available: ["myapex"],
5701 }
5702
5703 cc_library {
5704 name: "libbar",
5705 stl: "none",
5706 system_shared_libs: [],
5707 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005708 }
5709
5710 cc_library {
5711 name: "libbaz",
5712 stl: "none",
5713 system_shared_libs: [],
5714 stubs: {
5715 versions: ["10", "20", "30"],
5716 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005717 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005718}
Jiyong Park127b40b2019-09-30 16:04:35 +09005719
Jiyong Park89e850a2020-04-07 16:37:39 +09005720func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005721 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005722 apex {
5723 name: "myapex",
5724 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005725 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005726 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005727 }
5728
5729 apex_key {
5730 name: "myapex.key",
5731 public_key: "testkey.avbpubkey",
5732 private_key: "testkey.pem",
5733 }
5734
5735 cc_library {
5736 name: "libfoo",
5737 stl: "none",
5738 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005739 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005740 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005741 }
5742
5743 cc_library {
5744 name: "libfoo2",
5745 stl: "none",
5746 system_shared_libs: [],
5747 shared_libs: ["libbaz"],
5748 apex_available: ["//apex_available:platform"],
5749 }
5750
5751 cc_library {
5752 name: "libbar",
5753 stl: "none",
5754 system_shared_libs: [],
5755 apex_available: ["myapex"],
5756 }
5757
5758 cc_library {
5759 name: "libbaz",
5760 stl: "none",
5761 system_shared_libs: [],
5762 apex_available: ["myapex"],
5763 stubs: {
5764 versions: ["1"],
5765 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005766 }`)
5767
Jiyong Park89e850a2020-04-07 16:37:39 +09005768 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5769 // because it depends on libbar which isn't available to platform
5770 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5771 if libfoo.NotAvailableForPlatform() != true {
5772 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5773 }
5774
5775 // libfoo2 however can be available to platform because it depends on libbaz which provides
5776 // stubs
5777 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5778 if libfoo2.NotAvailableForPlatform() == true {
5779 t.Errorf("%q should be available to platform", libfoo2.String())
5780 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005781}
Jiyong Parka90ca002019-10-07 15:47:24 +09005782
Paul Duffine52e66f2020-03-30 17:54:29 +01005783func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005784 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005785 apex {
5786 name: "myapex",
5787 key: "myapex.key",
5788 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005789 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005790 }
5791
5792 apex_key {
5793 name: "myapex.key",
5794 public_key: "testkey.avbpubkey",
5795 private_key: "testkey.pem",
5796 }
5797
5798 cc_library {
5799 name: "libfoo",
5800 stl: "none",
5801 system_shared_libs: [],
5802 apex_available: ["myapex"],
5803 static: {
5804 apex_available: ["//apex_available:platform"],
5805 },
5806 }`)
5807
Jiyong Park89e850a2020-04-07 16:37:39 +09005808 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5809 if libfooShared.NotAvailableForPlatform() != true {
5810 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5811 }
5812 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5813 if libfooStatic.NotAvailableForPlatform() != false {
5814 t.Errorf("%q should be available to platform", libfooStatic.String())
5815 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005816}
5817
Jiyong Park5d790c32019-11-15 18:40:32 +09005818func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005819 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005820 apex {
5821 name: "myapex",
5822 key: "myapex.key",
5823 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005824 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005825 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005826 }
5827
5828 override_apex {
5829 name: "override_myapex",
5830 base: "myapex",
5831 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005832 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005833 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005834 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07005835 key: "mynewapex.key",
5836 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09005837 }
5838
5839 apex_key {
5840 name: "myapex.key",
5841 public_key: "testkey.avbpubkey",
5842 private_key: "testkey.pem",
5843 }
5844
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07005845 apex_key {
5846 name: "mynewapex.key",
5847 public_key: "testkey2.avbpubkey",
5848 private_key: "testkey2.pem",
5849 }
5850
5851 android_app_certificate {
5852 name: "myapex.certificate",
5853 certificate: "testkey",
5854 }
5855
Jiyong Park5d790c32019-11-15 18:40:32 +09005856 android_app {
5857 name: "app",
5858 srcs: ["foo/bar/MyClass.java"],
5859 package_name: "foo",
5860 sdk_version: "none",
5861 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005862 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005863 }
5864
5865 override_android_app {
5866 name: "override_app",
5867 base: "app",
5868 package_name: "bar",
5869 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005870 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005871
Jiyong Park317645e2019-12-05 13:20:58 +09005872 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5873 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5874 if originalVariant.GetOverriddenBy() != "" {
5875 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5876 }
5877 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5878 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5879 }
5880
Jiyong Park5d790c32019-11-15 18:40:32 +09005881 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5882 apexRule := module.Rule("apexRule")
5883 copyCmds := apexRule.Args["copy_commands"]
5884
5885 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005886 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005887
5888 apexBundle := module.Module().(*apexBundle)
5889 name := apexBundle.Name()
5890 if name != "override_myapex" {
5891 t.Errorf("name should be \"override_myapex\", but was %q", name)
5892 }
5893
Baligh Uddin004d7172020-02-19 21:29:28 -08005894 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5895 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5896 }
5897
Jiyong Park20bacab2020-03-03 11:45:41 +09005898 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005899 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07005900 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
5901
5902 signApkRule := module.Rule("signapk")
5903 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09005904
Colin Crossaa255532020-07-03 13:18:24 -07005905 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005906 var builder strings.Builder
5907 data.Custom(&builder, name, "TARGET_", "", data)
5908 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005909 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005910 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5911 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005912 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005913 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005914 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005915 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5916 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005917}
5918
Jooyung Han214bf372019-11-12 13:03:50 +09005919func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005920 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005921 apex {
5922 name: "myapex",
5923 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005924 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005925 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005926 }
5927
5928 apex_key {
5929 name: "myapex.key",
5930 public_key: "testkey.avbpubkey",
5931 private_key: "testkey.pem",
5932 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005933
5934 cc_library {
5935 name: "mylib",
5936 srcs: ["mylib.cpp"],
5937 stl: "libc++",
5938 system_shared_libs: [],
5939 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005940 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005941 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005942 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005943
5944 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5945 args := module.Rule("apexRule").Args
5946 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005947 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005948
5949 // The copies of the libraries in the apex should have one more dependency than
5950 // the ones outside the apex, namely the unwinder. Ideally we should check
5951 // the dependency names directly here but for some reason the names are blank in
5952 // this test.
5953 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005954 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005955 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5956 if len(apexImplicits) != len(nonApexImplicits)+1 {
5957 t.Errorf("%q missing unwinder dep", lib)
5958 }
5959 }
Jooyung Han214bf372019-11-12 13:03:50 +09005960}
5961
Paul Duffine05480a2021-03-08 15:07:14 +00005962var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01005963 "api/current.txt": nil,
5964 "api/removed.txt": nil,
5965 "api/system-current.txt": nil,
5966 "api/system-removed.txt": nil,
5967 "api/test-current.txt": nil,
5968 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005969
Anton Hanssondff2c782020-12-21 17:10:01 +00005970 "100/public/api/foo.txt": nil,
5971 "100/public/api/foo-removed.txt": nil,
5972 "100/system/api/foo.txt": nil,
5973 "100/system/api/foo-removed.txt": nil,
5974
Paul Duffineedc5d52020-06-12 17:46:39 +01005975 // For java_sdk_library_import
5976 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005977}
5978
Jooyung Han58f26ab2019-12-18 15:34:32 +09005979func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005980 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005981 apex {
5982 name: "myapex",
5983 key: "myapex.key",
5984 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005985 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005986 }
5987
5988 apex_key {
5989 name: "myapex.key",
5990 public_key: "testkey.avbpubkey",
5991 private_key: "testkey.pem",
5992 }
5993
5994 java_sdk_library {
5995 name: "foo",
5996 srcs: ["a.java"],
5997 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005998 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005999 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006000
6001 prebuilt_apis {
6002 name: "sdk",
6003 api_dirs: ["100"],
6004 }
Paul Duffin9b879592020-05-26 13:21:35 +01006005 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006006
6007 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006008 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006009 "javalib/foo.jar",
6010 "etc/permissions/foo.xml",
6011 })
6012 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006013 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
6014 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09006015}
6016
Paul Duffin9b879592020-05-26 13:21:35 +01006017func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006018 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006019 apex {
6020 name: "myapex",
6021 key: "myapex.key",
6022 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006023 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006024 }
6025
6026 apex_key {
6027 name: "myapex.key",
6028 public_key: "testkey.avbpubkey",
6029 private_key: "testkey.pem",
6030 }
6031
6032 java_sdk_library {
6033 name: "foo",
6034 srcs: ["a.java"],
6035 api_packages: ["foo"],
6036 apex_available: ["myapex"],
6037 sdk_version: "none",
6038 system_modules: "none",
6039 }
6040
6041 java_library {
6042 name: "bar",
6043 srcs: ["a.java"],
6044 libs: ["foo"],
6045 apex_available: ["myapex"],
6046 sdk_version: "none",
6047 system_modules: "none",
6048 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006049
6050 prebuilt_apis {
6051 name: "sdk",
6052 api_dirs: ["100"],
6053 }
Paul Duffin9b879592020-05-26 13:21:35 +01006054 `, withFiles(filesForSdkLibrary))
6055
6056 // java_sdk_library installs both impl jar and permission XML
6057 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6058 "javalib/bar.jar",
6059 "javalib/foo.jar",
6060 "etc/permissions/foo.xml",
6061 })
6062
6063 // The bar library should depend on the implementation jar.
6064 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006065 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006066 t.Errorf("expected %q, found %#q", expected, actual)
6067 }
6068}
6069
6070func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006071 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006072 apex {
6073 name: "myapex",
6074 key: "myapex.key",
6075 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006076 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006077 }
6078
6079 apex_key {
6080 name: "myapex.key",
6081 public_key: "testkey.avbpubkey",
6082 private_key: "testkey.pem",
6083 }
6084
6085 java_sdk_library {
6086 name: "foo",
6087 srcs: ["a.java"],
6088 api_packages: ["foo"],
6089 apex_available: ["myapex"],
6090 sdk_version: "none",
6091 system_modules: "none",
6092 }
6093
6094 java_library {
6095 name: "bar",
6096 srcs: ["a.java"],
6097 libs: ["foo"],
6098 sdk_version: "none",
6099 system_modules: "none",
6100 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006101
6102 prebuilt_apis {
6103 name: "sdk",
6104 api_dirs: ["100"],
6105 }
Paul Duffin9b879592020-05-26 13:21:35 +01006106 `, withFiles(filesForSdkLibrary))
6107
6108 // java_sdk_library installs both impl jar and permission XML
6109 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6110 "javalib/foo.jar",
6111 "etc/permissions/foo.xml",
6112 })
6113
6114 // The bar library should depend on the stubs jar.
6115 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006116 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006117 t.Errorf("expected %q, found %#q", expected, actual)
6118 }
6119}
6120
Paul Duffineedc5d52020-06-12 17:46:39 +01006121func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006123 prebuilt_apis {
6124 name: "sdk",
6125 api_dirs: ["100"],
6126 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006127 withFiles(map[string][]byte{
6128 "apex/a.java": nil,
6129 "apex/apex_manifest.json": nil,
6130 "apex/Android.bp": []byte(`
6131 package {
6132 default_visibility: ["//visibility:private"],
6133 }
6134
6135 apex {
6136 name: "myapex",
6137 key: "myapex.key",
6138 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006139 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006140 }
6141
6142 apex_key {
6143 name: "myapex.key",
6144 public_key: "testkey.avbpubkey",
6145 private_key: "testkey.pem",
6146 }
6147
6148 java_library {
6149 name: "bar",
6150 srcs: ["a.java"],
6151 libs: ["foo"],
6152 apex_available: ["myapex"],
6153 sdk_version: "none",
6154 system_modules: "none",
6155 }
6156`),
6157 "source/a.java": nil,
6158 "source/api/current.txt": nil,
6159 "source/api/removed.txt": nil,
6160 "source/Android.bp": []byte(`
6161 package {
6162 default_visibility: ["//visibility:private"],
6163 }
6164
6165 java_sdk_library {
6166 name: "foo",
6167 visibility: ["//apex"],
6168 srcs: ["a.java"],
6169 api_packages: ["foo"],
6170 apex_available: ["myapex"],
6171 sdk_version: "none",
6172 system_modules: "none",
6173 public: {
6174 enabled: true,
6175 },
6176 }
6177`),
6178 "prebuilt/a.jar": nil,
6179 "prebuilt/Android.bp": []byte(`
6180 package {
6181 default_visibility: ["//visibility:private"],
6182 }
6183
6184 java_sdk_library_import {
6185 name: "foo",
6186 visibility: ["//apex", "//source"],
6187 apex_available: ["myapex"],
6188 prefer: true,
6189 public: {
6190 jars: ["a.jar"],
6191 },
6192 }
6193`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006194 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006195 )
6196
6197 // java_sdk_library installs both impl jar and permission XML
6198 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6199 "javalib/bar.jar",
6200 "javalib/foo.jar",
6201 "etc/permissions/foo.xml",
6202 })
6203
6204 // The bar library should depend on the implementation jar.
6205 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006206 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006207 t.Errorf("expected %q, found %#q", expected, actual)
6208 }
6209}
6210
6211func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6212 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6213 apex {
6214 name: "myapex",
6215 key: "myapex.key",
6216 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006217 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006218 }
6219
6220 apex_key {
6221 name: "myapex.key",
6222 public_key: "testkey.avbpubkey",
6223 private_key: "testkey.pem",
6224 }
6225
6226 java_sdk_library_import {
6227 name: "foo",
6228 apex_available: ["myapex"],
6229 prefer: true,
6230 public: {
6231 jars: ["a.jar"],
6232 },
6233 }
6234
6235 `, withFiles(filesForSdkLibrary))
6236}
6237
atrost6e126252020-01-27 17:01:16 +00006238func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006239 result := android.GroupFixturePreparers(
6240 prepareForApexTest,
6241 java.PrepareForTestWithPlatformCompatConfig,
6242 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006243 apex {
6244 name: "myapex",
6245 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006246 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006247 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006248 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006249 }
6250
6251 apex_key {
6252 name: "myapex.key",
6253 public_key: "testkey.avbpubkey",
6254 private_key: "testkey.pem",
6255 }
6256
6257 platform_compat_config {
6258 name: "myjar-platform-compat-config",
6259 src: ":myjar",
6260 }
6261
6262 java_library {
6263 name: "myjar",
6264 srcs: ["foo/bar/MyClass.java"],
6265 sdk_version: "none",
6266 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006267 apex_available: [ "myapex" ],
6268 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006269
6270 // Make sure that a preferred prebuilt does not affect the apex contents.
6271 prebuilt_platform_compat_config {
6272 name: "myjar-platform-compat-config",
6273 metadata: "compat-config/metadata.xml",
6274 prefer: true,
6275 }
atrost6e126252020-01-27 17:01:16 +00006276 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006277 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006278 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6279 "etc/compatconfig/myjar-platform-compat-config.xml",
6280 "javalib/myjar.jar",
6281 })
6282}
6283
Jiyong Park479321d2019-12-16 11:47:12 +09006284func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6285 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6286 apex {
6287 name: "myapex",
6288 key: "myapex.key",
6289 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006290 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006291 }
6292
6293 apex_key {
6294 name: "myapex.key",
6295 public_key: "testkey.avbpubkey",
6296 private_key: "testkey.pem",
6297 }
6298
6299 java_library {
6300 name: "myjar",
6301 srcs: ["foo/bar/MyClass.java"],
6302 sdk_version: "none",
6303 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006304 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006305 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006306 }
6307 `)
6308}
6309
Jiyong Park7afd1072019-12-30 16:56:33 +09006310func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006311 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006312 apex {
6313 name: "myapex",
6314 key: "myapex.key",
6315 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006316 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006317 }
6318
6319 apex_key {
6320 name: "myapex.key",
6321 public_key: "testkey.avbpubkey",
6322 private_key: "testkey.pem",
6323 }
6324
6325 cc_library {
6326 name: "mylib",
6327 srcs: ["mylib.cpp"],
6328 system_shared_libs: [],
6329 stl: "none",
6330 required: ["a", "b"],
6331 host_required: ["c", "d"],
6332 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006333 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006334 }
6335 `)
6336
6337 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006338 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006339 name := apexBundle.BaseModuleName()
6340 prefix := "TARGET_"
6341 var builder strings.Builder
6342 data.Custom(&builder, name, prefix, "", data)
6343 androidMk := builder.String()
6344 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6345 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6346 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6347}
6348
Jiyong Park7cd10e32020-01-14 09:22:18 +09006349func TestSymlinksFromApexToSystem(t *testing.T) {
6350 bp := `
6351 apex {
6352 name: "myapex",
6353 key: "myapex.key",
6354 native_shared_libs: ["mylib"],
6355 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006356 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006357 }
6358
Jiyong Park9d677202020-02-19 16:29:35 +09006359 apex {
6360 name: "myapex.updatable",
6361 key: "myapex.key",
6362 native_shared_libs: ["mylib"],
6363 java_libs: ["myjar"],
6364 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006365 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006366 }
6367
Jiyong Park7cd10e32020-01-14 09:22:18 +09006368 apex_key {
6369 name: "myapex.key",
6370 public_key: "testkey.avbpubkey",
6371 private_key: "testkey.pem",
6372 }
6373
6374 cc_library {
6375 name: "mylib",
6376 srcs: ["mylib.cpp"],
6377 shared_libs: ["myotherlib"],
6378 system_shared_libs: [],
6379 stl: "none",
6380 apex_available: [
6381 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006382 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006383 "//apex_available:platform",
6384 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006385 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006386 }
6387
6388 cc_library {
6389 name: "myotherlib",
6390 srcs: ["mylib.cpp"],
6391 system_shared_libs: [],
6392 stl: "none",
6393 apex_available: [
6394 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006395 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006396 "//apex_available:platform",
6397 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006398 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006399 }
6400
6401 java_library {
6402 name: "myjar",
6403 srcs: ["foo/bar/MyClass.java"],
6404 sdk_version: "none",
6405 system_modules: "none",
6406 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006407 apex_available: [
6408 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006409 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006410 "//apex_available:platform",
6411 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006412 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006413 }
6414
6415 java_library {
6416 name: "myotherjar",
6417 srcs: ["foo/bar/MyClass.java"],
6418 sdk_version: "none",
6419 system_modules: "none",
6420 apex_available: [
6421 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006422 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006423 "//apex_available:platform",
6424 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006425 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006426 }
6427 `
6428
6429 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6430 for _, f := range files {
6431 if f.path == file {
6432 if f.isLink {
6433 t.Errorf("%q is not a real file", file)
6434 }
6435 return
6436 }
6437 }
6438 t.Errorf("%q is not found", file)
6439 }
6440
6441 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6442 for _, f := range files {
6443 if f.path == file {
6444 if !f.isLink {
6445 t.Errorf("%q is not a symlink", file)
6446 }
6447 return
6448 }
6449 }
6450 t.Errorf("%q is not found", file)
6451 }
6452
Jiyong Park9d677202020-02-19 16:29:35 +09006453 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6454 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006455 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006456 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006457 ensureRealfileExists(t, files, "javalib/myjar.jar")
6458 ensureRealfileExists(t, files, "lib64/mylib.so")
6459 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6460
Jiyong Park9d677202020-02-19 16:29:35 +09006461 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6462 ensureRealfileExists(t, files, "javalib/myjar.jar")
6463 ensureRealfileExists(t, files, "lib64/mylib.so")
6464 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6465
6466 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006467 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006468 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006469 ensureRealfileExists(t, files, "javalib/myjar.jar")
6470 ensureRealfileExists(t, files, "lib64/mylib.so")
6471 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006472
6473 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6474 ensureRealfileExists(t, files, "javalib/myjar.jar")
6475 ensureRealfileExists(t, files, "lib64/mylib.so")
6476 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006477}
6478
Yo Chiange8128052020-07-23 20:09:18 +08006479func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006480 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006481 apex {
6482 name: "myapex",
6483 key: "myapex.key",
6484 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006485 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006486 }
6487
6488 apex_key {
6489 name: "myapex.key",
6490 public_key: "testkey.avbpubkey",
6491 private_key: "testkey.pem",
6492 }
6493
6494 cc_library_shared {
6495 name: "mylib",
6496 srcs: ["mylib.cpp"],
6497 shared_libs: ["myotherlib"],
6498 system_shared_libs: [],
6499 stl: "none",
6500 apex_available: [
6501 "myapex",
6502 "//apex_available:platform",
6503 ],
6504 }
6505
6506 cc_prebuilt_library_shared {
6507 name: "myotherlib",
6508 srcs: ["prebuilt.so"],
6509 system_shared_libs: [],
6510 stl: "none",
6511 apex_available: [
6512 "myapex",
6513 "//apex_available:platform",
6514 ],
6515 }
6516 `)
6517
6518 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006519 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006520 var builder strings.Builder
6521 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6522 androidMk := builder.String()
6523 // `myotherlib` is added to `myapex` as symlink
6524 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6525 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6526 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6527 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006528 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 +08006529}
6530
Jooyung Han643adc42020-02-27 13:50:06 +09006531func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006532 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006533 apex {
6534 name: "myapex",
6535 key: "myapex.key",
6536 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006538 }
6539
6540 apex_key {
6541 name: "myapex.key",
6542 public_key: "testkey.avbpubkey",
6543 private_key: "testkey.pem",
6544 }
6545
6546 cc_library {
6547 name: "mylib",
6548 srcs: ["mylib.cpp"],
6549 shared_libs: ["mylib2"],
6550 system_shared_libs: [],
6551 stl: "none",
6552 apex_available: [ "myapex" ],
6553 }
6554
6555 cc_library {
6556 name: "mylib2",
6557 srcs: ["mylib.cpp"],
6558 system_shared_libs: [],
6559 stl: "none",
6560 apex_available: [ "myapex" ],
6561 }
6562 `)
6563
6564 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6565 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6566 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6567 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6568 "lib64/mylib.so",
6569 "lib64/mylib2.so",
6570 })
6571}
6572
Jooyung Han49f67012020-04-17 13:43:10 +09006573func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006574 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006578 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006579 }
6580 apex_key {
6581 name: "myapex.key",
6582 public_key: "testkey.avbpubkey",
6583 private_key: "testkey.pem",
6584 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006585 `,
6586 android.FixtureModifyConfig(func(config android.Config) {
6587 delete(config.Targets, android.Android)
6588 config.AndroidCommonTarget = android.Target{}
6589 }),
6590 )
Jooyung Han49f67012020-04-17 13:43:10 +09006591
6592 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6593 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6594 }
6595}
6596
Jiyong Parkbd159612020-02-28 15:22:21 +09006597func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006598 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006599 apex {
6600 name: "myapex",
6601 key: "myapex.key",
6602 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006603 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006604 }
6605
6606 apex_key {
6607 name: "myapex.key",
6608 public_key: "testkey.avbpubkey",
6609 private_key: "testkey.pem",
6610 }
6611
6612 android_app {
6613 name: "AppFoo",
6614 srcs: ["foo/bar/MyClass.java"],
6615 sdk_version: "none",
6616 system_modules: "none",
6617 apex_available: [ "myapex" ],
6618 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006619 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006620
Colin Crosscf371cc2020-11-13 11:48:42 -08006621 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006622 content := bundleConfigRule.Args["content"]
6623
6624 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006625 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 +09006626}
6627
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006628func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006629 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006630 apex {
6631 name: "myapex",
6632 key: "myapex.key",
6633 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006634 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006635 }
6636
6637 apex_key {
6638 name: "myapex.key",
6639 public_key: "testkey.avbpubkey",
6640 private_key: "testkey.pem",
6641 }
6642
6643 android_app_set {
6644 name: "AppSet",
6645 set: "AppSet.apks",
6646 }`)
6647 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006648 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006649 content := bundleConfigRule.Args["content"]
6650 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6651 s := mod.Rule("apexRule").Args["copy_commands"]
6652 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6653 if len(copyCmds) != 3 {
6654 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6655 }
6656 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6657 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6658 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6659}
6660
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006661func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006662 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006663 apex_set {
6664 name: "myapex",
6665 filename: "foo_v2.apex",
6666 sanitized: {
6667 none: { set: "myapex.apks", },
6668 hwaddress: { set: "myapex.hwasan.apks", },
6669 },
Paul Duffin24704672021-04-06 16:09:30 +01006670 }
6671 `
6672 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006673
Paul Duffin24704672021-04-06 16:09:30 +01006674 // Check that the extractor produces the correct output file from the correct input file.
6675 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006676
Paul Duffin24704672021-04-06 16:09:30 +01006677 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6678 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006679
Paul Duffin24704672021-04-06 16:09:30 +01006680 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6681
6682 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006683 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6684 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006685
6686 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006687}
6688
Paul Duffin89f570a2021-06-16 01:42:33 +01006689func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006690 t.Helper()
6691
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006692 bp := `
6693 java_library {
6694 name: "some-updatable-apex-lib",
6695 srcs: ["a.java"],
6696 sdk_version: "current",
6697 apex_available: [
6698 "some-updatable-apex",
6699 ],
6700 }
6701
6702 java_library {
6703 name: "some-non-updatable-apex-lib",
6704 srcs: ["a.java"],
6705 apex_available: [
6706 "some-non-updatable-apex",
6707 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01006708 compile_dex: true,
6709 }
6710
6711 bootclasspath_fragment {
6712 name: "some-non-updatable-fragment",
6713 contents: ["some-non-updatable-apex-lib"],
6714 apex_available: [
6715 "some-non-updatable-apex",
6716 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006717 }
6718
6719 java_library {
6720 name: "some-platform-lib",
6721 srcs: ["a.java"],
6722 sdk_version: "current",
6723 installable: true,
6724 }
6725
6726 java_library {
6727 name: "some-art-lib",
6728 srcs: ["a.java"],
6729 sdk_version: "current",
6730 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006731 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006732 ],
6733 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01006734 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006735 }
6736
6737 apex {
6738 name: "some-updatable-apex",
6739 key: "some-updatable-apex.key",
6740 java_libs: ["some-updatable-apex-lib"],
6741 updatable: true,
6742 min_sdk_version: "current",
6743 }
6744
6745 apex {
6746 name: "some-non-updatable-apex",
6747 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006748 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006749 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006750 }
6751
6752 apex_key {
6753 name: "some-updatable-apex.key",
6754 }
6755
6756 apex_key {
6757 name: "some-non-updatable-apex.key",
6758 }
6759
6760 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006761 name: "com.android.art.debug",
6762 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006763 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006764 updatable: true,
6765 min_sdk_version: "current",
6766 }
6767
Paul Duffinf23bc472021-04-27 12:42:20 +01006768 bootclasspath_fragment {
6769 name: "art-bootclasspath-fragment",
6770 image_name: "art",
6771 contents: ["some-art-lib"],
6772 apex_available: [
6773 "com.android.art.debug",
6774 ],
6775 }
6776
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006777 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006778 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006779 }
6780
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006781 filegroup {
6782 name: "some-updatable-apex-file_contexts",
6783 srcs: [
6784 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6785 ],
6786 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006787
6788 filegroup {
6789 name: "some-non-updatable-apex-file_contexts",
6790 srcs: [
6791 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6792 ],
6793 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006794 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006795
Paul Duffin89f570a2021-06-16 01:42:33 +01006796 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00006797}
6798
Paul Duffin89f570a2021-06-16 01:42:33 +01006799func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006800 t.Helper()
6801
Paul Duffin55607122021-03-30 23:32:51 +01006802 fs := android.MockFS{
6803 "a.java": nil,
6804 "a.jar": nil,
6805 "apex_manifest.json": nil,
6806 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006807 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006808 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6809 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6810 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006811 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006812 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006813
Paul Duffin55607122021-03-30 23:32:51 +01006814 errorHandler := android.FixtureExpectsNoErrors
6815 if errmsg != "" {
6816 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006817 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006818
Paul Duffin55607122021-03-30 23:32:51 +01006819 result := android.GroupFixturePreparers(
6820 cc.PrepareForTestWithCcDefaultModules,
6821 java.PrepareForTestWithHiddenApiBuildComponents,
6822 java.PrepareForTestWithJavaDefaultModules,
6823 java.PrepareForTestWithJavaSdkLibraryFiles,
6824 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01006825 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01006826 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01006827 android.FixtureModifyMockFS(func(fs android.MockFS) {
6828 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
6829 insert := ""
6830 for _, fragment := range fragments {
6831 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
6832 }
6833 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
6834 platform_bootclasspath {
6835 name: "platform-bootclasspath",
6836 fragments: [
6837 %s
6838 ],
6839 }
6840 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01006841 }
Paul Duffin89f570a2021-06-16 01:42:33 +01006842 }),
Paul Duffin55607122021-03-30 23:32:51 +01006843 ).
6844 ExtendWithErrorHandler(errorHandler).
6845 RunTestWithBp(t, bp)
6846
6847 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006848}
6849
Jooyung Han548640b2020-04-27 12:10:30 +09006850func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6851 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6852 apex {
6853 name: "myapex",
6854 key: "myapex.key",
6855 updatable: true,
6856 }
6857
6858 apex_key {
6859 name: "myapex.key",
6860 public_key: "testkey.avbpubkey",
6861 private_key: "testkey.pem",
6862 }
6863 `)
6864}
6865
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006866func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6867 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6868 apex {
6869 name: "myapex",
6870 key: "myapex.key",
6871 }
6872
6873 apex_key {
6874 name: "myapex.key",
6875 public_key: "testkey.avbpubkey",
6876 private_key: "testkey.pem",
6877 }
6878 `)
6879}
6880
satayevb98371c2021-06-15 16:49:50 +01006881func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
6882 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
6883 apex {
6884 name: "myapex",
6885 key: "myapex.key",
6886 systemserverclasspath_fragments: [
6887 "mysystemserverclasspathfragment",
6888 ],
6889 min_sdk_version: "29",
6890 updatable: true,
6891 }
6892
6893 apex_key {
6894 name: "myapex.key",
6895 public_key: "testkey.avbpubkey",
6896 private_key: "testkey.pem",
6897 }
6898
6899 java_library {
6900 name: "foo",
6901 srcs: ["b.java"],
6902 min_sdk_version: "29",
6903 installable: true,
6904 apex_available: [
6905 "myapex",
6906 ],
6907 }
6908
6909 systemserverclasspath_fragment {
6910 name: "mysystemserverclasspathfragment",
6911 generate_classpaths_proto: false,
6912 contents: [
6913 "foo",
6914 ],
6915 apex_available: [
6916 "myapex",
6917 ],
6918 }
6919 `)
6920}
6921
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006922func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01006923 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
6924 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
6925 // modules to be included in the BootJars.
6926 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
6927 return android.GroupFixturePreparers(
6928 dexpreopt.FixtureSetBootJars(bootJars...),
6929 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6930 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
6931 }),
6932 )
6933 }
6934
6935 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
6936 // same value. This can result in an invalid configuration as it allows non art apex jars to be
6937 // specified in the ArtApexJars configuration.
6938 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
6939 return android.GroupFixturePreparers(
6940 dexpreopt.FixtureSetArtBootJars(bootJars...),
6941 dexpreopt.FixtureSetBootJars(bootJars...),
6942 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6943 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
6944 }),
6945 )
6946 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006947
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006948 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01006949 preparer := java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01006950 fragment := java.ApexVariantReference{
6951 Apex: proptools.StringPtr("com.android.art.debug"),
6952 Module: proptools.StringPtr("art-bootclasspath-fragment"),
6953 }
6954 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006955 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006956
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006957 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01006958 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
6959 // Update the dexpreopt BootJars directly.
6960 preparer := prepareSetBootJars("com.android.art.debug:some-art-lib")
6961 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006962 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006963
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006964 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 +01006965 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 +01006966 // Update the dexpreopt ArtApexJars directly.
6967 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
6968 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006969 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006970
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006971 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 +01006972 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 +01006973 // Update the dexpreopt ArtApexJars directly.
6974 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
6975 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006976 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006977
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006978 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 +01006979 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
6980 preparer := java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib")
6981 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006982 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006983
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006984 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01006985 preparer := java.FixtureConfigureBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01006986 fragment := java.ApexVariantReference{
6987 Apex: proptools.StringPtr("some-non-updatable-apex"),
6988 Module: proptools.StringPtr("some-non-updatable-fragment"),
6989 }
6990 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006991 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006992
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006993 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01006994 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01006995 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
6996 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006997 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006998
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006999 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007000 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007001 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7002 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007003 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007004
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007005 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007006 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007007 // Update the dexpreopt ArtApexJars directly.
7008 preparer := prepareSetArtJars("platform:some-platform-lib")
7009 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007010 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007011
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007012 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007013 preparer := java.FixtureConfigureBootJars("platform:some-platform-lib")
7014 testNoUpdatableJarsInBootImage(t, "", preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007015 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007016}
7017
7018func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007019 preparer := java.FixtureConfigureBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007020 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007021 fragment := java.ApexVariantReference{
7022 Apex: proptools.StringPtr("myapex"),
7023 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7024 }
7025
Paul Duffin064b70c2020-11-02 17:32:38 +00007026 testDexpreoptWithApexes(t, `
7027 prebuilt_apex {
7028 name: "myapex" ,
7029 arch: {
7030 arm64: {
7031 src: "myapex-arm64.apex",
7032 },
7033 arm: {
7034 src: "myapex-arm.apex",
7035 },
7036 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007037 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7038 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007039
Paul Duffin89f570a2021-06-16 01:42:33 +01007040 prebuilt_bootclasspath_fragment {
7041 name: "my-bootclasspath-fragment",
7042 contents: ["libfoo"],
7043 apex_available: ["myapex"],
7044 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007045
Paul Duffin89f570a2021-06-16 01:42:33 +01007046 java_import {
7047 name: "libfoo",
7048 jars: ["libfoo.jar"],
7049 apex_available: ["myapex"],
7050 }
7051 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007052 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007053}
7054
Andrei Onea115e7e72020-06-05 21:14:03 +01007055func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
7056 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007057 bp += `
7058 apex_key {
7059 name: "myapex.key",
7060 public_key: "testkey.avbpubkey",
7061 private_key: "testkey.pem",
7062 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007063 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007064 "lib1/src/A.java": nil,
7065 "lib2/src/B.java": nil,
7066 "system/sepolicy/apex/myapex-file_contexts": nil,
7067 }
7068
Paul Duffin45338f02021-03-30 23:07:52 +01007069 errorHandler := android.FixtureExpectsNoErrors
7070 if errmsg != "" {
7071 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007072 }
Colin Crossae8600b2020-10-29 17:09:13 -07007073
Paul Duffin45338f02021-03-30 23:07:52 +01007074 android.GroupFixturePreparers(
7075 android.PrepareForTestWithAndroidBuildComponents,
7076 java.PrepareForTestWithJavaBuildComponents,
7077 PrepareForTestWithApexBuildComponents,
7078 android.PrepareForTestWithNeverallowRules(rules),
7079 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7080 updatableBootJars := make([]string, 0, len(apexBootJars))
7081 for _, apexBootJar := range apexBootJars {
7082 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
7083 }
7084 variables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
7085 }),
7086 fs.AddToFixture(),
7087 ).
7088 ExtendWithErrorHandler(errorHandler).
7089 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007090}
7091
7092func TestApexPermittedPackagesRules(t *testing.T) {
7093 testcases := []struct {
7094 name string
7095 expectedError string
7096 bp string
7097 bootJars []string
7098 modulesPackages map[string][]string
7099 }{
7100
7101 {
7102 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7103 expectedError: "",
7104 bp: `
7105 java_library {
7106 name: "bcp_lib1",
7107 srcs: ["lib1/src/*.java"],
7108 permitted_packages: ["foo.bar"],
7109 apex_available: ["myapex"],
7110 sdk_version: "none",
7111 system_modules: "none",
7112 }
7113 java_library {
7114 name: "nonbcp_lib2",
7115 srcs: ["lib2/src/*.java"],
7116 apex_available: ["myapex"],
7117 permitted_packages: ["a.b"],
7118 sdk_version: "none",
7119 system_modules: "none",
7120 }
7121 apex {
7122 name: "myapex",
7123 key: "myapex.key",
7124 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007125 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007126 }`,
7127 bootJars: []string{"bcp_lib1"},
7128 modulesPackages: map[string][]string{
7129 "myapex": []string{
7130 "foo.bar",
7131 },
7132 },
7133 },
7134 {
7135 name: "Bootclasspath apex jar not satisfying allowed module packages.",
7136 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar. Please jarjar or move code around.`,
7137 bp: `
7138 java_library {
7139 name: "bcp_lib1",
7140 srcs: ["lib1/src/*.java"],
7141 apex_available: ["myapex"],
7142 permitted_packages: ["foo.bar"],
7143 sdk_version: "none",
7144 system_modules: "none",
7145 }
7146 java_library {
7147 name: "bcp_lib2",
7148 srcs: ["lib2/src/*.java"],
7149 apex_available: ["myapex"],
7150 permitted_packages: ["foo.bar", "bar.baz"],
7151 sdk_version: "none",
7152 system_modules: "none",
7153 }
7154 apex {
7155 name: "myapex",
7156 key: "myapex.key",
7157 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007158 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007159 }
7160 `,
7161 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7162 modulesPackages: map[string][]string{
7163 "myapex": []string{
7164 "foo.bar",
7165 },
7166 },
7167 },
7168 }
7169 for _, tc := range testcases {
7170 t.Run(tc.name, func(t *testing.T) {
7171 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7172 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7173 })
7174 }
7175}
7176
Jiyong Park62304bb2020-04-13 16:19:48 +09007177func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007178 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007179 apex {
7180 name: "myapex",
7181 key: "myapex.key",
7182 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007183 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007184 }
7185
7186 apex_key {
7187 name: "myapex.key",
7188 public_key: "testkey.avbpubkey",
7189 private_key: "testkey.pem",
7190 }
7191
7192 cc_library {
7193 name: "mylib",
7194 srcs: ["mylib.cpp"],
7195 system_shared_libs: [],
7196 stl: "none",
7197 stubs: {
7198 versions: ["1"],
7199 },
7200 apex_available: ["myapex"],
7201 }
7202
7203 cc_library {
7204 name: "myprivlib",
7205 srcs: ["mylib.cpp"],
7206 system_shared_libs: [],
7207 stl: "none",
7208 apex_available: ["myapex"],
7209 }
7210
7211
7212 cc_test {
7213 name: "mytest",
7214 gtest: false,
7215 srcs: ["mylib.cpp"],
7216 system_shared_libs: [],
7217 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007218 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007219 test_for: ["myapex"]
7220 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007221
7222 cc_library {
7223 name: "mytestlib",
7224 srcs: ["mylib.cpp"],
7225 system_shared_libs: [],
7226 shared_libs: ["mylib", "myprivlib"],
7227 stl: "none",
7228 test_for: ["myapex"],
7229 }
7230
7231 cc_benchmark {
7232 name: "mybench",
7233 srcs: ["mylib.cpp"],
7234 system_shared_libs: [],
7235 shared_libs: ["mylib", "myprivlib"],
7236 stl: "none",
7237 test_for: ["myapex"],
7238 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007239 `)
7240
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007241 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007242 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007243 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7244 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7245 }
7246
7247 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007248 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007249 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7250 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7251 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7252}
Jiyong Park46a512f2020-12-04 18:02:13 +09007253
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007254func TestIndirectTestFor(t *testing.T) {
7255 ctx := testApex(t, `
7256 apex {
7257 name: "myapex",
7258 key: "myapex.key",
7259 native_shared_libs: ["mylib", "myprivlib"],
7260 updatable: false,
7261 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007262
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
7272 system_shared_libs: [],
7273 stl: "none",
7274 stubs: {
7275 versions: ["1"],
7276 },
7277 apex_available: ["myapex"],
7278 }
7279
7280 cc_library {
7281 name: "myprivlib",
7282 srcs: ["mylib.cpp"],
7283 system_shared_libs: [],
7284 stl: "none",
7285 shared_libs: ["mylib"],
7286 apex_available: ["myapex"],
7287 }
7288
7289 cc_library {
7290 name: "mytestlib",
7291 srcs: ["mylib.cpp"],
7292 system_shared_libs: [],
7293 shared_libs: ["myprivlib"],
7294 stl: "none",
7295 test_for: ["myapex"],
7296 }
7297 `)
7298
7299 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007300 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007301 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7302 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7303 }
7304
7305 // The platform variant of mytestlib links to the platform variant of the
7306 // internal myprivlib.
7307 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7308
7309 // The platform variant of myprivlib links to the platform variant of mylib
7310 // and bypasses its stubs.
7311 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 +09007312}
7313
Martin Stjernholmec009002021-03-27 15:18:31 +00007314func TestTestForForLibInOtherApex(t *testing.T) {
7315 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7316 _ = testApex(t, `
7317 apex {
7318 name: "com.android.art",
7319 key: "myapex.key",
7320 native_shared_libs: ["mylib"],
7321 updatable: false,
7322 }
7323
7324 apex {
7325 name: "com.android.art.debug",
7326 key: "myapex.key",
7327 native_shared_libs: ["mylib", "mytestlib"],
7328 updatable: false,
7329 }
7330
7331 apex_key {
7332 name: "myapex.key",
7333 public_key: "testkey.avbpubkey",
7334 private_key: "testkey.pem",
7335 }
7336
7337 cc_library {
7338 name: "mylib",
7339 srcs: ["mylib.cpp"],
7340 system_shared_libs: [],
7341 stl: "none",
7342 stubs: {
7343 versions: ["1"],
7344 },
7345 apex_available: ["com.android.art", "com.android.art.debug"],
7346 }
7347
7348 cc_library {
7349 name: "mytestlib",
7350 srcs: ["mylib.cpp"],
7351 system_shared_libs: [],
7352 shared_libs: ["mylib"],
7353 stl: "none",
7354 apex_available: ["com.android.art.debug"],
7355 test_for: ["com.android.art"],
7356 }
7357 `,
7358 android.MockFS{
7359 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7360 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7361 }.AddToFixture())
7362}
7363
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007364// TODO(jungjw): Move this to proptools
7365func intPtr(i int) *int {
7366 return &i
7367}
7368
7369func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007370 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007371 apex_set {
7372 name: "myapex",
7373 set: "myapex.apks",
7374 filename: "foo_v2.apex",
7375 overrides: ["foo"],
7376 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007377 `,
7378 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7379 variables.Platform_sdk_version = intPtr(30)
7380 }),
7381 android.FixtureModifyConfig(func(config android.Config) {
7382 config.Targets[android.Android] = []android.Target{
7383 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7384 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7385 }
7386 }),
7387 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007388
Paul Duffin24704672021-04-06 16:09:30 +01007389 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007390
7391 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007392 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007393 actual := extractedApex.Args["abis"]
7394 expected := "ARMEABI_V7A,ARM64_V8A"
7395 if actual != expected {
7396 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7397 }
7398 actual = extractedApex.Args["sdk-version"]
7399 expected = "30"
7400 if actual != expected {
7401 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7402 }
7403
Paul Duffin6717d882021-06-15 19:09:41 +01007404 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007405 a := m.Module().(*ApexSet)
7406 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007407 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007408 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7409 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7410 }
7411}
7412
Jiyong Park7d95a512020-05-10 15:16:24 +09007413func TestNoStaticLinkingToStubsLib(t *testing.T) {
7414 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7415 apex {
7416 name: "myapex",
7417 key: "myapex.key",
7418 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007419 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007420 }
7421
7422 apex_key {
7423 name: "myapex.key",
7424 public_key: "testkey.avbpubkey",
7425 private_key: "testkey.pem",
7426 }
7427
7428 cc_library {
7429 name: "mylib",
7430 srcs: ["mylib.cpp"],
7431 static_libs: ["otherlib"],
7432 system_shared_libs: [],
7433 stl: "none",
7434 apex_available: [ "myapex" ],
7435 }
7436
7437 cc_library {
7438 name: "otherlib",
7439 srcs: ["mylib.cpp"],
7440 system_shared_libs: [],
7441 stl: "none",
7442 stubs: {
7443 versions: ["1", "2", "3"],
7444 },
7445 apex_available: [ "myapex" ],
7446 }
7447 `)
7448}
7449
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007450func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007451 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007452 apex {
7453 name: "myapex",
7454 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007455 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007456 }
7457
7458 apex_key {
7459 name: "myapex.key",
7460 public_key: "testkey.avbpubkey",
7461 private_key: "testkey.pem",
7462 }
7463
7464 prebuilt_apex {
7465 name: "myapex",
7466 prefer: true,
7467 arch: {
7468 arm64: {
7469 src: "myapex-arm64.apex",
7470 },
7471 arm: {
7472 src: "myapex-arm.apex",
7473 },
7474 },
7475 }
7476
7477 apex_set {
7478 name: "myapex_set",
7479 set: "myapex.apks",
7480 filename: "myapex_set.apex",
7481 overrides: ["myapex"],
7482 }
7483 `)
7484
7485 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7486 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7487 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 +09007488 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 +09007489}
7490
Jooyung Han938b5932020-06-20 12:47:47 +09007491func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007492 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007493 apex {
7494 name: "myapex",
7495 key: "myapex.key",
7496 apps: ["app"],
7497 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007498 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007499 }
7500
7501 apex_key {
7502 name: "myapex.key",
7503 public_key: "testkey.avbpubkey",
7504 private_key: "testkey.pem",
7505 }
7506
7507 android_app {
7508 name: "app",
7509 srcs: ["foo/bar/MyClass.java"],
7510 package_name: "foo",
7511 sdk_version: "none",
7512 system_modules: "none",
7513 apex_available: [ "myapex" ],
7514 }
7515 `, withFiles(map[string][]byte{
7516 "sub/Android.bp": []byte(`
7517 override_apex {
7518 name: "override_myapex",
7519 base: "myapex",
7520 apps: ["override_app"],
7521 allowed_files: ":allowed",
7522 }
7523 // Overridable "path" property should be referenced indirectly
7524 filegroup {
7525 name: "allowed",
7526 srcs: ["allowed.txt"],
7527 }
7528 override_android_app {
7529 name: "override_app",
7530 base: "app",
7531 package_name: "bar",
7532 }
7533 `),
7534 }))
7535
7536 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7537 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7538 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7539 }
7540
7541 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7542 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7543 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7544 }
7545}
7546
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007547func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007548 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007549 apex {
7550 name: "myapex",
7551 key: "myapex.key",
7552 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007553 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007554 }
7555
7556 apex_key {
7557 name: "myapex.key",
7558 public_key: "testkey.avbpubkey",
7559 private_key: "testkey.pem",
7560 }
7561
7562 cc_library {
7563 name: "mylib",
7564 srcs: ["mylib.cpp"],
7565 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007566 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007567 },
7568 apex_available: ["myapex"],
7569 }
7570
7571 cc_prebuilt_library_shared {
7572 name: "mylib",
7573 prefer: false,
7574 srcs: ["prebuilt.so"],
7575 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007576 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007577 },
7578 apex_available: ["myapex"],
7579 }
7580 `)
7581}
7582
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007583func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007584 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007585 apex {
7586 name: "myapex",
7587 key: "myapex.key",
7588 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007589 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007590 }
7591 apex_key {
7592 name: "myapex.key",
7593 public_key: "testkey.avbpubkey",
7594 private_key: "testkey.pem",
7595 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007596 `,
7597 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7598 variables.CompressedApex = proptools.BoolPtr(true)
7599 }),
7600 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007601
7602 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7603 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7604
7605 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7606 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7607
7608 // Make sure output of bundle is .capex
7609 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7610 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7611
7612 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007613 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007614 var builder strings.Builder
7615 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7616 androidMk := builder.String()
7617 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7618}
7619
Martin Stjernholm2856c662020-12-02 15:03:42 +00007620func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007621 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007622 apex {
7623 name: "myapex",
7624 key: "myapex.key",
7625 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007626 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007627 }
7628
7629 apex_key {
7630 name: "myapex.key",
7631 public_key: "testkey.avbpubkey",
7632 private_key: "testkey.pem",
7633 }
7634
7635 cc_library {
7636 name: "mylib",
7637 srcs: ["mylib.cpp"],
7638 apex_available: ["myapex"],
7639 shared_libs: ["otherlib"],
7640 system_shared_libs: [],
7641 }
7642
7643 cc_library {
7644 name: "otherlib",
7645 srcs: ["mylib.cpp"],
7646 stubs: {
7647 versions: ["current"],
7648 },
7649 }
7650
7651 cc_prebuilt_library_shared {
7652 name: "otherlib",
7653 prefer: true,
7654 srcs: ["prebuilt.so"],
7655 stubs: {
7656 versions: ["current"],
7657 },
7658 }
7659 `)
7660
7661 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007662 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007663 var builder strings.Builder
7664 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7665 androidMk := builder.String()
7666
7667 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7668 // a thing there.
7669 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7670}
7671
Jiyong Parke3867542020-12-03 17:28:25 +09007672func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007673 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007674 apex {
7675 name: "myapex",
7676 key: "myapex.key",
7677 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007678 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007679 }
7680
7681 apex_key {
7682 name: "myapex.key",
7683 public_key: "testkey.avbpubkey",
7684 private_key: "testkey.pem",
7685 }
7686
7687 cc_library {
7688 name: "mylib",
7689 srcs: ["mylib.cpp"],
7690 system_shared_libs: [],
7691 stl: "none",
7692 apex_available: ["myapex"],
7693 shared_libs: ["mylib2"],
7694 target: {
7695 apex: {
7696 exclude_shared_libs: ["mylib2"],
7697 },
7698 },
7699 }
7700
7701 cc_library {
7702 name: "mylib2",
7703 srcs: ["mylib.cpp"],
7704 system_shared_libs: [],
7705 stl: "none",
7706 }
7707 `)
7708
7709 // Check if mylib is linked to mylib2 for the non-apex target
7710 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7711 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7712
7713 // Make sure that the link doesn't occur for the apex target
7714 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7715 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7716
7717 // It shouldn't appear in the copy cmd as well.
7718 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7719 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7720}
7721
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007722func TestPrebuiltStubLibDep(t *testing.T) {
7723 bpBase := `
7724 apex {
7725 name: "myapex",
7726 key: "myapex.key",
7727 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007728 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007729 }
7730 apex_key {
7731 name: "myapex.key",
7732 public_key: "testkey.avbpubkey",
7733 private_key: "testkey.pem",
7734 }
7735 cc_library {
7736 name: "mylib",
7737 srcs: ["mylib.cpp"],
7738 apex_available: ["myapex"],
7739 shared_libs: ["stublib"],
7740 system_shared_libs: [],
7741 }
7742 apex {
7743 name: "otherapex",
7744 enabled: %s,
7745 key: "myapex.key",
7746 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007747 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007748 }
7749 `
7750
7751 stublibSourceBp := `
7752 cc_library {
7753 name: "stublib",
7754 srcs: ["mylib.cpp"],
7755 apex_available: ["otherapex"],
7756 system_shared_libs: [],
7757 stl: "none",
7758 stubs: {
7759 versions: ["1"],
7760 },
7761 }
7762 `
7763
7764 stublibPrebuiltBp := `
7765 cc_prebuilt_library_shared {
7766 name: "stublib",
7767 srcs: ["prebuilt.so"],
7768 apex_available: ["otherapex"],
7769 stubs: {
7770 versions: ["1"],
7771 },
7772 %s
7773 }
7774 `
7775
7776 tests := []struct {
7777 name string
7778 stublibBp string
7779 usePrebuilt bool
7780 modNames []string // Modules to collect AndroidMkEntries for
7781 otherApexEnabled []string
7782 }{
7783 {
7784 name: "only_source",
7785 stublibBp: stublibSourceBp,
7786 usePrebuilt: false,
7787 modNames: []string{"stublib"},
7788 otherApexEnabled: []string{"true", "false"},
7789 },
7790 {
7791 name: "source_preferred",
7792 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7793 usePrebuilt: false,
7794 modNames: []string{"stublib", "prebuilt_stublib"},
7795 otherApexEnabled: []string{"true", "false"},
7796 },
7797 {
7798 name: "prebuilt_preferred",
7799 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7800 usePrebuilt: true,
7801 modNames: []string{"stublib", "prebuilt_stublib"},
7802 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7803 },
7804 {
7805 name: "only_prebuilt",
7806 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7807 usePrebuilt: true,
7808 modNames: []string{"stublib"},
7809 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7810 },
7811 }
7812
7813 for _, test := range tests {
7814 t.Run(test.name, func(t *testing.T) {
7815 for _, otherApexEnabled := range test.otherApexEnabled {
7816 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007817 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007818
7819 type modAndMkEntries struct {
7820 mod *cc.Module
7821 mkEntries android.AndroidMkEntries
7822 }
7823 entries := []*modAndMkEntries{}
7824
7825 // Gather shared lib modules that are installable
7826 for _, modName := range test.modNames {
7827 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7828 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7829 continue
7830 }
7831 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007832 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007833 continue
7834 }
Colin Crossaa255532020-07-03 13:18:24 -07007835 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007836 if ent.Disabled {
7837 continue
7838 }
7839 entries = append(entries, &modAndMkEntries{
7840 mod: mod,
7841 mkEntries: ent,
7842 })
7843 }
7844 }
7845 }
7846
7847 var entry *modAndMkEntries = nil
7848 for _, ent := range entries {
7849 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7850 if entry != nil {
7851 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7852 } else {
7853 entry = ent
7854 }
7855 }
7856 }
7857
7858 if entry == nil {
7859 t.Errorf("AndroidMk entry for \"stublib\" missing")
7860 } else {
7861 isPrebuilt := entry.mod.Prebuilt() != nil
7862 if isPrebuilt != test.usePrebuilt {
7863 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7864 }
7865 if !entry.mod.IsStubs() {
7866 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7867 }
7868 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7869 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7870 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007871 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09007872 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09007873 if !android.InList(expected, cflags) {
7874 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7875 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007876 }
7877 })
7878 }
7879 })
7880 }
7881}
7882
Martin Stjernholmdf298b32021-05-21 20:57:29 +01007883func TestHostApexInHostOnlyBuild(t *testing.T) {
7884 testApex(t, `
7885 apex {
7886 name: "myapex",
7887 host_supported: true,
7888 key: "myapex.key",
7889 updatable: false,
7890 payload_type: "zip",
7891 }
7892 apex_key {
7893 name: "myapex.key",
7894 public_key: "testkey.avbpubkey",
7895 private_key: "testkey.pem",
7896 }
7897 `,
7898 android.FixtureModifyConfig(func(config android.Config) {
7899 // We may not have device targets in all builds, e.g. in
7900 // prebuilts/build-tools/build-prebuilts.sh
7901 config.Targets[android.Android] = []android.Target{}
7902 }))
7903}
7904
Colin Crossc33e5212021-05-25 18:16:02 -07007905func TestApexJavaCoverage(t *testing.T) {
7906 bp := `
7907 apex {
7908 name: "myapex",
7909 key: "myapex.key",
7910 java_libs: ["mylib"],
7911 bootclasspath_fragments: ["mybootclasspathfragment"],
7912 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
7913 updatable: false,
7914 }
7915
7916 apex_key {
7917 name: "myapex.key",
7918 public_key: "testkey.avbpubkey",
7919 private_key: "testkey.pem",
7920 }
7921
7922 java_library {
7923 name: "mylib",
7924 srcs: ["mylib.java"],
7925 apex_available: ["myapex"],
7926 compile_dex: true,
7927 }
7928
7929 bootclasspath_fragment {
7930 name: "mybootclasspathfragment",
7931 contents: ["mybootclasspathlib"],
7932 apex_available: ["myapex"],
7933 }
7934
7935 java_library {
7936 name: "mybootclasspathlib",
7937 srcs: ["mybootclasspathlib.java"],
7938 apex_available: ["myapex"],
7939 compile_dex: true,
7940 }
7941
7942 systemserverclasspath_fragment {
7943 name: "mysystemserverclasspathfragment",
7944 contents: ["mysystemserverclasspathlib"],
7945 apex_available: ["myapex"],
7946 }
7947
7948 java_library {
7949 name: "mysystemserverclasspathlib",
7950 srcs: ["mysystemserverclasspathlib.java"],
7951 apex_available: ["myapex"],
7952 compile_dex: true,
7953 }
7954 `
7955
7956 result := android.GroupFixturePreparers(
7957 PrepareForTestWithApexBuildComponents,
7958 prepareForTestWithMyapex,
7959 java.PrepareForTestWithJavaDefaultModules,
7960 android.PrepareForTestWithAndroidBuildComponents,
7961 android.FixtureWithRootAndroidBp(bp),
7962 android.FixtureMergeEnv(map[string]string{
7963 "EMMA_INSTRUMENT": "true",
7964 }),
7965 ).RunTest(t)
7966
7967 // Make sure jacoco ran on both mylib and mybootclasspathlib
7968 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
7969 t.Errorf("Failed to find jacoco rule for mylib")
7970 }
7971 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
7972 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
7973 }
7974 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
7975 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
7976 }
7977}
7978
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007979func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01007980 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007981}