blob: 7fd0a654d06ff52b8637d291a7800cb3e9cdd844 [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"}
219 variables.Platform_vndk_version = proptools.StringPtr("VER")
220 }),
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"],
395 }
396
397 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
402 }
403
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900404 rust_ffi_shared {
405 name: "libfoo.ffi",
406 srcs: ["foo.rs"],
407 crate_name: "foo",
408 apex_available: ["myapex"],
409 }
410
411 rust_ffi_shared {
412 name: "libbar.ffi",
413 srcs: ["foo.rs"],
414 crate_name: "bar",
415 apex_available: ["myapex"],
416 }
417
Yifan Hongd22a84a2020-07-28 17:37:46 -0700418 apex {
419 name: "com.android.gki.fake",
420 binaries: ["foo"],
421 key: "myapex.key",
422 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000423 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800424 }
425
Paul Duffindddd5462020-04-07 15:25:44 +0100426 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900427 name: "mylib2",
428 srcs: ["mylib.cpp"],
429 system_shared_libs: [],
430 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900431 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900432 static_libs: ["libstatic"],
433 // TODO: remove //apex_available:platform
434 apex_available: [
435 "//apex_available:platform",
436 "myapex",
437 ],
438 }
439
Paul Duffindddd5462020-04-07 15:25:44 +0100440 cc_prebuilt_library_shared {
441 name: "mylib2",
442 srcs: ["prebuilt.so"],
443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
448 }
449
Jiyong Park9918e1a2020-03-17 19:16:40 +0900450 cc_library_static {
451 name: "libstatic",
452 srcs: ["mylib.cpp"],
453 system_shared_libs: [],
454 stl: "none",
455 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900461 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900462
463 java_library {
464 name: "myjar",
465 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900466 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 sdk_version: "none",
468 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900470 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 }
477
Jiyong Park77acec62020-06-01 21:39:15 +0900478 dex_import {
479 name: "myjar_dex",
480 jars: ["prebuilt.jar"],
481 apex_available: [
482 "//apex_available:platform",
483 "myapex",
484 ],
485 }
486
Jiyong Park7f7766d2019-07-25 22:02:35 +0900487 java_library {
488 name: "myotherjar",
489 srcs: ["foo/bar/MyClass.java"],
490 sdk_version: "none",
491 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900492 // TODO: remove //apex_available:platform
493 apex_available: [
494 "//apex_available:platform",
495 "myapex",
496 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900498
499 java_library {
500 name: "mysharedjar",
501 srcs: ["foo/bar/MyClass.java"],
502 sdk_version: "none",
503 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900504 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900505 `)
506
Paul Duffina71a67a2021-03-29 00:42:57 +0100507 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900508
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900509 // Make sure that Android.mk is created
510 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700511 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 var builder strings.Builder
513 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
514
515 androidMk := builder.String()
516 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
517 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
518
Jiyong Park42cca6c2019-04-01 11:15:50 +0900519 optFlags := apexRule.Args["opt_flags"]
520 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700521 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100522 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900523
Jiyong Park25fc6a92018-11-18 18:02:45 +0900524 copyCmds := apexRule.Args["copy_commands"]
525
526 // Ensure that main rule creates an output
527 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
528
529 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700530 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
531 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900533 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900534 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900535
536 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700537 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
538 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900539 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
540 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900542
543 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800544 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
545 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900546 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900547 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 // .. but not for java libs
552 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900553 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800554
Colin Cross7113d202019-11-20 16:39:12 -0800555 // Ensure that the platform variant ends with _shared or _common
556 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
557 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
559 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
561
562 // Ensure that dynamic dependency to java libs are not included
563 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800564
565 // Ensure that all symlinks are present.
566 found_foo_link_64 := false
567 found_foo := false
568 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900569 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800570 if strings.HasSuffix(cmd, "bin/foo") {
571 found_foo = true
572 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
573 found_foo_link_64 = true
574 }
575 }
576 }
577 good := found_foo && found_foo_link_64
578 if !good {
579 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
580 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900581
Sundong Ahnabb64432019-10-22 13:58:29 +0900582 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700583 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900584 if len(noticeInputs) != 3 {
585 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900586 }
587 ensureListContains(t, noticeInputs, "NOTICE")
588 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900589 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900590
Artur Satayeva8bd1132020-04-27 18:07:06 +0100591 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100593 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
594 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
595 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100596
597 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800605 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900606 apex_defaults {
607 name: "myapex-defaults",
608 key: "myapex.key",
609 prebuilts: ["myetc"],
610 native_shared_libs: ["mylib"],
611 java_libs: ["myjar"],
612 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900613 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800614 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000615 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616 }
617
618 prebuilt_etc {
619 name: "myetc",
620 src: "myprebuilt",
621 }
622
623 apex {
624 name: "myapex",
625 defaults: ["myapex-defaults"],
626 }
627
628 apex_key {
629 name: "myapex.key",
630 public_key: "testkey.avbpubkey",
631 private_key: "testkey.pem",
632 }
633
634 cc_library {
635 name: "mylib",
636 system_shared_libs: [],
637 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000638 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900639 }
640
641 java_library {
642 name: "myjar",
643 srcs: ["foo/bar/MyClass.java"],
644 sdk_version: "none",
645 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000646 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
648
649 android_app {
650 name: "AppFoo",
651 srcs: ["foo/bar/MyClass.java"],
652 sdk_version: "none",
653 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900656
657 runtime_resource_overlay {
658 name: "rro",
659 theme: "blue",
660 }
661
markchien2f59ec92020-09-02 16:23:38 +0800662 bpf {
663 name: "bpf",
664 srcs: ["bpf.c", "bpf2.c"],
665 }
666
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000668 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900669 "etc/myetc",
670 "javalib/myjar.jar",
671 "lib64/mylib.so",
672 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900673 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800674 "etc/bpf/bpf.o",
675 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900676 })
677}
678
Jooyung Han01a3ee22019-11-02 02:52:25 +0900679func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800680 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900681 apex {
682 name: "myapex",
683 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000684 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900685 }
686
687 apex_key {
688 name: "myapex.key",
689 public_key: "testkey.avbpubkey",
690 private_key: "testkey.pem",
691 }
692 `)
693
694 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900695 args := module.Rule("apexRule").Args
696 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
697 t.Error("manifest should be apex_manifest.pb, but " + manifest)
698 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699}
700
Alex Light5098a612018-11-29 17:12:15 -0800701func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800702 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800703 apex {
704 name: "myapex",
705 key: "myapex.key",
706 payload_type: "zip",
707 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000708 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800709 }
710
711 apex_key {
712 name: "myapex.key",
713 public_key: "testkey.avbpubkey",
714 private_key: "testkey.pem",
715 }
716
717 cc_library {
718 name: "mylib",
719 srcs: ["mylib.cpp"],
720 shared_libs: ["mylib2"],
721 system_shared_libs: [],
722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000723 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800724 }
725
726 cc_library {
727 name: "mylib2",
728 srcs: ["mylib.cpp"],
729 system_shared_libs: [],
730 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000731 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800732 }
733 `)
734
Sundong Ahnabb64432019-10-22 13:58:29 +0900735 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800736 copyCmds := zipApexRule.Args["copy_commands"]
737
738 // Ensure that main rule creates an output
739 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
740
741 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700742 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800743
744 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700745 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800746
747 // Ensure that both direct and indirect deps are copied into apex
748 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
749 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900750}
751
752func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800753 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900754 apex {
755 name: "myapex",
756 key: "myapex.key",
757 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000758 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900759 }
760
761 apex_key {
762 name: "myapex.key",
763 public_key: "testkey.avbpubkey",
764 private_key: "testkey.pem",
765 }
766
767 cc_library {
768 name: "mylib",
769 srcs: ["mylib.cpp"],
770 shared_libs: ["mylib2", "mylib3"],
771 system_shared_libs: [],
772 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000773 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900774 }
775
776 cc_library {
777 name: "mylib2",
778 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900779 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780 system_shared_libs: [],
781 stl: "none",
782 stubs: {
783 versions: ["1", "2", "3"],
784 },
785 }
786
787 cc_library {
788 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900789 srcs: ["mylib.cpp"],
790 shared_libs: ["mylib4"],
791 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792 stl: "none",
793 stubs: {
794 versions: ["10", "11", "12"],
795 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000796 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900798
799 cc_library {
800 name: "mylib4",
801 srcs: ["mylib.cpp"],
802 system_shared_libs: [],
803 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000804 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900805 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900806 `)
807
Sundong Ahnabb64432019-10-22 13:58:29 +0900808 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809 copyCmds := apexRule.Args["copy_commands"]
810
811 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800812 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900813
814 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800815 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900816
817 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800818 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819
Colin Crossaede88c2020-08-11 12:17:01 -0700820 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900821
822 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900823 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900825 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826
827 // 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 -0700828 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900831
832 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900833 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900834 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900835
836 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700837 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900838
Jooyung Hana57af4a2020-01-23 05:36:59 +0000839 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900840 "lib64/mylib.so",
841 "lib64/mylib3.so",
842 "lib64/mylib4.so",
843 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844}
845
Colin Cross7812fd32020-09-25 12:35:10 -0700846func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
847 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800848 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700849 apex {
850 name: "myapex",
851 key: "myapex.key",
852 native_shared_libs: ["mylib", "mylib3"],
853 min_sdk_version: "29",
854 }
855
856 apex_key {
857 name: "myapex.key",
858 public_key: "testkey.avbpubkey",
859 private_key: "testkey.pem",
860 }
861
862 cc_library {
863 name: "mylib",
864 srcs: ["mylib.cpp"],
865 shared_libs: ["mylib2", "mylib3"],
866 system_shared_libs: [],
867 stl: "none",
868 apex_available: [ "myapex" ],
869 min_sdk_version: "28",
870 }
871
872 cc_library {
873 name: "mylib2",
874 srcs: ["mylib.cpp"],
875 cflags: ["-include mylib.h"],
876 system_shared_libs: [],
877 stl: "none",
878 stubs: {
879 versions: ["28", "29", "30", "current"],
880 },
881 min_sdk_version: "28",
882 }
883
884 cc_library {
885 name: "mylib3",
886 srcs: ["mylib.cpp"],
887 shared_libs: ["mylib4"],
888 system_shared_libs: [],
889 stl: "none",
890 stubs: {
891 versions: ["28", "29", "30", "current"],
892 },
893 apex_available: [ "myapex" ],
894 min_sdk_version: "28",
895 }
896
897 cc_library {
898 name: "mylib4",
899 srcs: ["mylib.cpp"],
900 system_shared_libs: [],
901 stl: "none",
902 apex_available: [ "myapex" ],
903 min_sdk_version: "28",
904 }
905 `)
906
907 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
908 copyCmds := apexRule.Args["copy_commands"]
909
910 // Ensure that direct non-stubs dep is always included
911 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
912
913 // Ensure that indirect stubs dep is not included
914 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
915
916 // Ensure that direct stubs dep is included
917 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
918
919 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
920
Jiyong Park55549df2021-02-26 23:57:23 +0900921 // Ensure that mylib is linking with the latest version of stub for mylib2
922 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -0700923 // ... and not linking to the non-stub (impl) variant of mylib2
924 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
925
926 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
927 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
928 // .. and not linking to the stubs variant of mylib3
929 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
930
931 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700932 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700933 ensureNotContains(t, mylib2Cflags, "-include ")
934
935 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700936 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700937
938 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
939 "lib64/mylib.so",
940 "lib64/mylib3.so",
941 "lib64/mylib4.so",
942 })
943}
944
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900945func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
946 t.Parallel()
947 // myapex (Z)
948 // mylib -----------------.
949 // |
950 // otherapex (29) |
951 // libstub's versions: 29 Z current
952 // |
953 // <platform> |
954 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -0800955 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900956 apex {
957 name: "myapex",
958 key: "myapex.key",
959 native_shared_libs: ["mylib"],
960 min_sdk_version: "Z", // non-final
961 }
962
963 cc_library {
964 name: "mylib",
965 srcs: ["mylib.cpp"],
966 shared_libs: ["libstub"],
967 apex_available: ["myapex"],
968 min_sdk_version: "Z",
969 }
970
971 apex_key {
972 name: "myapex.key",
973 public_key: "testkey.avbpubkey",
974 private_key: "testkey.pem",
975 }
976
977 apex {
978 name: "otherapex",
979 key: "myapex.key",
980 native_shared_libs: ["libstub"],
981 min_sdk_version: "29",
982 }
983
984 cc_library {
985 name: "libstub",
986 srcs: ["mylib.cpp"],
987 stubs: {
988 versions: ["29", "Z", "current"],
989 },
990 apex_available: ["otherapex"],
991 min_sdk_version: "29",
992 }
993
994 // platform module depending on libstub from otherapex should use the latest stub("current")
995 cc_library {
996 name: "libplatform",
997 srcs: ["mylib.cpp"],
998 shared_libs: ["libstub"],
999 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001000 `,
1001 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1002 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1003 variables.Platform_sdk_final = proptools.BoolPtr(false)
1004 variables.Platform_version_active_codenames = []string{"Z"}
1005 }),
1006 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001007
Jiyong Park55549df2021-02-26 23:57:23 +09001008 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001009 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001010 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001011 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001012 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001013
1014 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1015 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1016 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1017 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1018 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1019}
1020
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001021func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001022 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001023 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001024 name: "myapex2",
1025 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001026 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001027 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001028 }
1029
1030 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001031 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001032 public_key: "testkey.avbpubkey",
1033 private_key: "testkey.pem",
1034 }
1035
1036 cc_library {
1037 name: "mylib",
1038 srcs: ["mylib.cpp"],
1039 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001040 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001041 system_shared_libs: [],
1042 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001043 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001044 }
1045
1046 cc_library {
1047 name: "libfoo",
1048 srcs: ["mylib.cpp"],
1049 shared_libs: ["libbar"],
1050 system_shared_libs: [],
1051 stl: "none",
1052 stubs: {
1053 versions: ["10", "20", "30"],
1054 },
1055 }
1056
1057 cc_library {
1058 name: "libbar",
1059 srcs: ["mylib.cpp"],
1060 system_shared_libs: [],
1061 stl: "none",
1062 }
1063
Jiyong Park678c8812020-02-07 17:25:49 +09001064 cc_library_static {
1065 name: "libbaz",
1066 srcs: ["mylib.cpp"],
1067 system_shared_libs: [],
1068 stl: "none",
1069 apex_available: [ "myapex2" ],
1070 }
1071
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001072 `)
1073
Jiyong Park83dc74b2020-01-14 18:38:44 +09001074 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001075 copyCmds := apexRule.Args["copy_commands"]
1076
1077 // Ensure that direct non-stubs dep is always included
1078 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1079
1080 // Ensure that indirect stubs dep is not included
1081 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1082
1083 // Ensure that dependency of stubs is not included
1084 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1085
Colin Crossaede88c2020-08-11 12:17:01 -07001086 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001087
1088 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001089 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001090 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001091 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001092
Jiyong Park3ff16992019-12-27 14:11:47 +09001093 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001094
1095 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1096 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001097
Artur Satayeva8bd1132020-04-27 18:07:06 +01001098 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001099 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001100
Artur Satayeva8bd1132020-04-27 18:07:06 +01001101 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001102 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001103}
1104
Jooyung Hand3639552019-08-09 12:57:43 +09001105func TestApexWithRuntimeLibsDependency(t *testing.T) {
1106 /*
1107 myapex
1108 |
1109 v (runtime_libs)
1110 mylib ------+------> libfoo [provides stub]
1111 |
1112 `------> libbar
1113 */
Colin Cross1c460562021-02-16 17:55:47 -08001114 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001115 apex {
1116 name: "myapex",
1117 key: "myapex.key",
1118 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001119 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001120 }
1121
1122 apex_key {
1123 name: "myapex.key",
1124 public_key: "testkey.avbpubkey",
1125 private_key: "testkey.pem",
1126 }
1127
1128 cc_library {
1129 name: "mylib",
1130 srcs: ["mylib.cpp"],
1131 runtime_libs: ["libfoo", "libbar"],
1132 system_shared_libs: [],
1133 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001134 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001135 }
1136
1137 cc_library {
1138 name: "libfoo",
1139 srcs: ["mylib.cpp"],
1140 system_shared_libs: [],
1141 stl: "none",
1142 stubs: {
1143 versions: ["10", "20", "30"],
1144 },
1145 }
1146
1147 cc_library {
1148 name: "libbar",
1149 srcs: ["mylib.cpp"],
1150 system_shared_libs: [],
1151 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001152 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001153 }
1154
1155 `)
1156
Sundong Ahnabb64432019-10-22 13:58:29 +09001157 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001158 copyCmds := apexRule.Args["copy_commands"]
1159
1160 // Ensure that direct non-stubs dep is always included
1161 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1162
1163 // Ensure that indirect stubs dep is not included
1164 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1165
1166 // Ensure that runtime_libs dep in included
1167 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1168
Sundong Ahnabb64432019-10-22 13:58:29 +09001169 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001170 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1171 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001172
1173}
1174
Paul Duffina02cae32021-03-09 01:44:06 +00001175var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1176 cc.PrepareForTestWithCcBuildComponents,
1177 PrepareForTestWithApexBuildComponents,
1178 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001179 apex {
1180 name: "com.android.runtime",
1181 key: "com.android.runtime.key",
1182 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001183 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001184 }
1185
1186 apex_key {
1187 name: "com.android.runtime.key",
1188 public_key: "testkey.avbpubkey",
1189 private_key: "testkey.pem",
1190 }
Paul Duffina02cae32021-03-09 01:44:06 +00001191 `),
1192 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1193)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001194
Paul Duffina02cae32021-03-09 01:44:06 +00001195func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001196 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001197 cc_library {
1198 name: "libc",
1199 no_libcrt: true,
1200 nocrt: true,
1201 stl: "none",
1202 system_shared_libs: [],
1203 stubs: { versions: ["1"] },
1204 apex_available: ["com.android.runtime"],
1205
1206 sanitize: {
1207 hwaddress: true,
1208 }
1209 }
1210
1211 cc_prebuilt_library_shared {
1212 name: "libclang_rt.hwasan-aarch64-android",
1213 no_libcrt: true,
1214 nocrt: true,
1215 stl: "none",
1216 system_shared_libs: [],
1217 srcs: [""],
1218 stubs: { versions: ["1"] },
1219
1220 sanitize: {
1221 never: true,
1222 },
Paul Duffina02cae32021-03-09 01:44:06 +00001223 } `)
1224 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001225
1226 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1227 "lib64/bionic/libc.so",
1228 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1229 })
1230
1231 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1232
1233 installed := hwasan.Description("install libclang_rt.hwasan")
1234 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1235
1236 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1237 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1238 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1239}
1240
1241func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001242 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001243 prepareForTestOfRuntimeApexWithHwasan,
1244 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1245 variables.SanitizeDevice = []string{"hwaddress"}
1246 }),
1247 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001248 cc_library {
1249 name: "libc",
1250 no_libcrt: true,
1251 nocrt: true,
1252 stl: "none",
1253 system_shared_libs: [],
1254 stubs: { versions: ["1"] },
1255 apex_available: ["com.android.runtime"],
1256 }
1257
1258 cc_prebuilt_library_shared {
1259 name: "libclang_rt.hwasan-aarch64-android",
1260 no_libcrt: true,
1261 nocrt: true,
1262 stl: "none",
1263 system_shared_libs: [],
1264 srcs: [""],
1265 stubs: { versions: ["1"] },
1266
1267 sanitize: {
1268 never: true,
1269 },
1270 }
Paul Duffina02cae32021-03-09 01:44:06 +00001271 `)
1272 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001273
1274 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1275 "lib64/bionic/libc.so",
1276 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1277 })
1278
1279 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1280
1281 installed := hwasan.Description("install libclang_rt.hwasan")
1282 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1283
1284 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1285 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1286 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1287}
1288
Jooyung Han61b66e92020-03-21 14:21:46 +00001289func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1290 testcases := []struct {
1291 name string
1292 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001293 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001294 shouldLink string
1295 shouldNotLink []string
1296 }{
1297 {
Jiyong Park55549df2021-02-26 23:57:23 +09001298 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001299 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001300 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001301 shouldLink: "current",
1302 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001303 },
1304 {
Jiyong Park55549df2021-02-26 23:57:23 +09001305 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001306 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001307 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001308 shouldLink: "current",
1309 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001310 },
1311 }
1312 for _, tc := range testcases {
1313 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001314 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001315 apex {
1316 name: "myapex",
1317 key: "myapex.key",
1318 use_vendor: true,
1319 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001320 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001321 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001322 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001323
Jooyung Han61b66e92020-03-21 14:21:46 +00001324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001329
Jooyung Han61b66e92020-03-21 14:21:46 +00001330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 vendor_available: true,
1334 shared_libs: ["libbar"],
1335 system_shared_libs: [],
1336 stl: "none",
1337 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001338 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001339 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001340
Jooyung Han61b66e92020-03-21 14:21:46 +00001341 cc_library {
1342 name: "libbar",
1343 srcs: ["mylib.cpp"],
1344 system_shared_libs: [],
1345 stl: "none",
1346 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001347 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001348 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001349
Jooyung Han61b66e92020-03-21 14:21:46 +00001350 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001351 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001352 symbol_file: "",
1353 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001354 `,
1355 setUseVendorAllowListForTest([]string{"myapex"}),
1356 withUnbundledBuild,
1357 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001358
Jooyung Han61b66e92020-03-21 14:21:46 +00001359 // Ensure that LLNDK dep is not included
1360 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1361 "lib64/mylib.so",
1362 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001363
Jooyung Han61b66e92020-03-21 14:21:46 +00001364 // Ensure that LLNDK dep is required
1365 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1366 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1367 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001368
Colin Crossaede88c2020-08-11 12:17:01 -07001369 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001370 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001371 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001372 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001373 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001374
Colin Crossaede88c2020-08-11 12:17:01 -07001375 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001376 ver := tc.shouldLink
1377 if tc.shouldLink == "current" {
1378 ver = strconv.Itoa(android.FutureApiLevelInt)
1379 }
1380 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001381 })
1382 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001383}
1384
Jiyong Park25fc6a92018-11-18 18:02:45 +09001385func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001386 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001387 apex {
1388 name: "myapex",
1389 key: "myapex.key",
1390 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001391 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001392 }
1393
1394 apex_key {
1395 name: "myapex.key",
1396 public_key: "testkey.avbpubkey",
1397 private_key: "testkey.pem",
1398 }
1399
1400 cc_library {
1401 name: "mylib",
1402 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001403 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001404 shared_libs: ["libdl#27"],
1405 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001406 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001407 }
1408
1409 cc_library_shared {
1410 name: "mylib_shared",
1411 srcs: ["mylib.cpp"],
1412 shared_libs: ["libdl#27"],
1413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001414 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001415 }
1416
1417 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001418 name: "libBootstrap",
1419 srcs: ["mylib.cpp"],
1420 stl: "none",
1421 bootstrap: true,
1422 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001423 `)
1424
Sundong Ahnabb64432019-10-22 13:58:29 +09001425 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426 copyCmds := apexRule.Args["copy_commands"]
1427
1428 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001429 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001430 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1431 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001432
1433 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001434 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001435
Colin Crossaede88c2020-08-11 12:17:01 -07001436 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1437 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1438 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001439
1440 // For dependency to libc
1441 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001442 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001443 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001444 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001445 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001446 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1447 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448
1449 // For dependency to libm
1450 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001451 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001452 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001453 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001454 // ... and is not compiling with the stub
1455 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1456 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1457
1458 // For dependency to libdl
1459 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001460 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001461 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001462 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1463 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001464 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001465 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001466 // ... Cflags from stub is correctly exported to mylib
1467 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1468 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001469
1470 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001471 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1472 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1473 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1474 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001475}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001476
Jooyung Han749dc692020-04-15 11:03:39 +09001477func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001478 // there are three links between liba --> libz.
1479 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001480 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001481 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001482 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001483 apex {
1484 name: "myapex",
1485 key: "myapex.key",
1486 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001487 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001488 }
1489
1490 apex {
1491 name: "otherapex",
1492 key: "myapex.key",
1493 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001494 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001495 }
1496
1497 apex_key {
1498 name: "myapex.key",
1499 public_key: "testkey.avbpubkey",
1500 private_key: "testkey.pem",
1501 }
1502
1503 cc_library {
1504 name: "libx",
1505 shared_libs: ["liba"],
1506 system_shared_libs: [],
1507 stl: "none",
1508 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001509 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001510 }
1511
1512 cc_library {
1513 name: "liby",
1514 shared_libs: ["liba"],
1515 system_shared_libs: [],
1516 stl: "none",
1517 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001518 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001519 }
1520
1521 cc_library {
1522 name: "liba",
1523 shared_libs: ["libz"],
1524 system_shared_libs: [],
1525 stl: "none",
1526 apex_available: [
1527 "//apex_available:anyapex",
1528 "//apex_available:platform",
1529 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001530 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001531 }
1532
1533 cc_library {
1534 name: "libz",
1535 system_shared_libs: [],
1536 stl: "none",
1537 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001538 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001539 },
1540 }
Jooyung Han749dc692020-04-15 11:03:39 +09001541 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001542
1543 expectLink := func(from, from_variant, to, to_variant string) {
1544 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1545 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1546 }
1547 expectNoLink := func(from, from_variant, to, to_variant string) {
1548 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1549 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1550 }
1551 // platform liba is linked to non-stub version
1552 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001553 // liba in myapex is linked to current
1554 expectLink("liba", "shared_apex29", "libz", "shared_current")
1555 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001556 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001557 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001558 // liba in otherapex is linked to current
1559 expectLink("liba", "shared_apex30", "libz", "shared_current")
1560 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001561 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1562 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001563}
1564
Jooyung Hanaed150d2020-04-02 01:41:41 +09001565func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001566 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001567 apex {
1568 name: "myapex",
1569 key: "myapex.key",
1570 native_shared_libs: ["libx"],
1571 min_sdk_version: "R",
1572 }
1573
1574 apex_key {
1575 name: "myapex.key",
1576 public_key: "testkey.avbpubkey",
1577 private_key: "testkey.pem",
1578 }
1579
1580 cc_library {
1581 name: "libx",
1582 shared_libs: ["libz"],
1583 system_shared_libs: [],
1584 stl: "none",
1585 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001587 }
1588
1589 cc_library {
1590 name: "libz",
1591 system_shared_libs: [],
1592 stl: "none",
1593 stubs: {
1594 versions: ["29", "R"],
1595 },
1596 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001597 `,
1598 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1599 variables.Platform_version_active_codenames = []string{"R"}
1600 }),
1601 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001602
1603 expectLink := func(from, from_variant, to, to_variant string) {
1604 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1605 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1606 }
1607 expectNoLink := func(from, from_variant, to, to_variant string) {
1608 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1609 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1610 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001611 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1612 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001613 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1614 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001615}
1616
Jooyung Han749dc692020-04-15 11:03:39 +09001617func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001618 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001619 apex {
1620 name: "myapex",
1621 key: "myapex.key",
1622 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001623 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001624 }
1625
1626 apex_key {
1627 name: "myapex.key",
1628 public_key: "testkey.avbpubkey",
1629 private_key: "testkey.pem",
1630 }
1631
1632 cc_library {
1633 name: "libx",
1634 shared_libs: ["libz"],
1635 system_shared_libs: [],
1636 stl: "none",
1637 apex_available: [ "myapex" ],
1638 }
1639
1640 cc_library {
1641 name: "libz",
1642 system_shared_libs: [],
1643 stl: "none",
1644 stubs: {
1645 versions: ["1", "2"],
1646 },
1647 }
1648 `)
1649
1650 expectLink := func(from, from_variant, to, to_variant string) {
1651 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1652 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1653 }
1654 expectNoLink := func(from, from_variant, to, to_variant string) {
1655 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1656 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1657 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001658 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001659 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001660 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001661 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001662}
1663
1664func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001665 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001666 apex {
1667 name: "myapex",
1668 key: "myapex.key",
1669 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001670 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001671 }
1672
1673 apex_key {
1674 name: "myapex.key",
1675 public_key: "testkey.avbpubkey",
1676 private_key: "testkey.pem",
1677 }
1678
1679 cc_library {
1680 name: "libx",
1681 system_shared_libs: [],
1682 stl: "none",
1683 apex_available: [ "myapex" ],
1684 stubs: {
1685 versions: ["1", "2"],
1686 },
1687 }
1688
1689 cc_library {
1690 name: "libz",
1691 shared_libs: ["libx"],
1692 system_shared_libs: [],
1693 stl: "none",
1694 }
1695 `)
1696
1697 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001698 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001699 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1700 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1701 }
1702 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001703 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001704 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1705 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1706 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001707 expectLink("libz", "shared", "libx", "shared_current")
1708 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001709 expectNoLink("libz", "shared", "libz", "shared_1")
1710 expectNoLink("libz", "shared", "libz", "shared")
1711}
1712
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001713var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1714 func(variables android.FixtureProductVariables) {
1715 variables.SanitizeDevice = []string{"hwaddress"}
1716 },
1717)
1718
Jooyung Han75568392020-03-20 04:29:24 +09001719func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001720 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001721 apex {
1722 name: "myapex",
1723 key: "myapex.key",
1724 native_shared_libs: ["libx"],
1725 min_sdk_version: "29",
1726 }
1727
1728 apex_key {
1729 name: "myapex.key",
1730 public_key: "testkey.avbpubkey",
1731 private_key: "testkey.pem",
1732 }
1733
1734 cc_library {
1735 name: "libx",
1736 shared_libs: ["libbar"],
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001739 }
1740
1741 cc_library {
1742 name: "libbar",
1743 stubs: {
1744 versions: ["29", "30"],
1745 },
1746 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001747 `,
1748 prepareForTestWithSantitizeHwaddress,
1749 )
Jooyung Han03b51852020-02-26 22:45:42 +09001750 expectLink := func(from, from_variant, to, to_variant string) {
1751 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1752 libFlags := ld.Args["libFlags"]
1753 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1754 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001755 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09001756}
1757
Jooyung Han75568392020-03-20 04:29:24 +09001758func TestQTargetApexUsesStaticUnwinder(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"],
1764 min_sdk_version: "29",
1765 }
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 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001776 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001777 }
Jooyung Han75568392020-03-20 04:29:24 +09001778 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001779
1780 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001781 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001782 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001783 // note that platform variant is not.
1784 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001785 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001786}
1787
Jooyung Han749dc692020-04-15 11:03:39 +09001788func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1789 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001790 apex {
1791 name: "myapex",
1792 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001793 native_shared_libs: ["mylib"],
1794 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001795 }
1796
1797 apex_key {
1798 name: "myapex.key",
1799 public_key: "testkey.avbpubkey",
1800 private_key: "testkey.pem",
1801 }
Jooyung Han749dc692020-04-15 11:03:39 +09001802
1803 cc_library {
1804 name: "mylib",
1805 srcs: ["mylib.cpp"],
1806 system_shared_libs: [],
1807 stl: "none",
1808 apex_available: [
1809 "myapex",
1810 ],
1811 min_sdk_version: "30",
1812 }
1813 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001814
1815 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1816 apex {
1817 name: "myapex",
1818 key: "myapex.key",
1819 native_shared_libs: ["libfoo.ffi"],
1820 min_sdk_version: "29",
1821 }
1822
1823 apex_key {
1824 name: "myapex.key",
1825 public_key: "testkey.avbpubkey",
1826 private_key: "testkey.pem",
1827 }
1828
1829 rust_ffi_shared {
1830 name: "libfoo.ffi",
1831 srcs: ["foo.rs"],
1832 crate_name: "foo",
1833 apex_available: [
1834 "myapex",
1835 ],
1836 min_sdk_version: "30",
1837 }
1838 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001839}
1840
1841func TestApexMinSdkVersion_Okay(t *testing.T) {
1842 testApex(t, `
1843 apex {
1844 name: "myapex",
1845 key: "myapex.key",
1846 native_shared_libs: ["libfoo"],
1847 java_libs: ["libbar"],
1848 min_sdk_version: "29",
1849 }
1850
1851 apex_key {
1852 name: "myapex.key",
1853 public_key: "testkey.avbpubkey",
1854 private_key: "testkey.pem",
1855 }
1856
1857 cc_library {
1858 name: "libfoo",
1859 srcs: ["mylib.cpp"],
1860 shared_libs: ["libfoo_dep"],
1861 apex_available: ["myapex"],
1862 min_sdk_version: "29",
1863 }
1864
1865 cc_library {
1866 name: "libfoo_dep",
1867 srcs: ["mylib.cpp"],
1868 apex_available: ["myapex"],
1869 min_sdk_version: "29",
1870 }
1871
1872 java_library {
1873 name: "libbar",
1874 sdk_version: "current",
1875 srcs: ["a.java"],
1876 static_libs: ["libbar_dep"],
1877 apex_available: ["myapex"],
1878 min_sdk_version: "29",
1879 }
1880
1881 java_library {
1882 name: "libbar_dep",
1883 sdk_version: "current",
1884 srcs: ["a.java"],
1885 apex_available: ["myapex"],
1886 min_sdk_version: "29",
1887 }
Jooyung Han03b51852020-02-26 22:45:42 +09001888 `)
1889}
1890
Artur Satayev8cf899a2020-04-15 17:29:42 +01001891func TestJavaStableSdkVersion(t *testing.T) {
1892 testCases := []struct {
1893 name string
1894 expectedError string
1895 bp string
1896 }{
1897 {
1898 name: "Non-updatable apex with non-stable dep",
1899 bp: `
1900 apex {
1901 name: "myapex",
1902 java_libs: ["myjar"],
1903 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001904 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01001905 }
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911 java_library {
1912 name: "myjar",
1913 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00001914 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001915 apex_available: ["myapex"],
1916 }
1917 `,
1918 },
1919 {
1920 name: "Updatable apex with stable dep",
1921 bp: `
1922 apex {
1923 name: "myapex",
1924 java_libs: ["myjar"],
1925 key: "myapex.key",
1926 updatable: true,
1927 min_sdk_version: "29",
1928 }
1929 apex_key {
1930 name: "myapex.key",
1931 public_key: "testkey.avbpubkey",
1932 private_key: "testkey.pem",
1933 }
1934 java_library {
1935 name: "myjar",
1936 srcs: ["foo/bar/MyClass.java"],
1937 sdk_version: "current",
1938 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001939 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001940 }
1941 `,
1942 },
1943 {
1944 name: "Updatable apex with non-stable dep",
1945 expectedError: "cannot depend on \"myjar\"",
1946 bp: `
1947 apex {
1948 name: "myapex",
1949 java_libs: ["myjar"],
1950 key: "myapex.key",
1951 updatable: true,
1952 }
1953 apex_key {
1954 name: "myapex.key",
1955 public_key: "testkey.avbpubkey",
1956 private_key: "testkey.pem",
1957 }
1958 java_library {
1959 name: "myjar",
1960 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00001961 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001962 apex_available: ["myapex"],
1963 }
1964 `,
1965 },
1966 {
Paul Duffin043f5e72021-03-05 00:00:01 +00001967 name: "Updatable apex with non-stable transitive dep",
1968 // This is not actually detecting that the transitive dependency is unstable, rather it is
1969 // detecting that the transitive dependency is building against a wider API surface than the
1970 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09001971 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001972 bp: `
1973 apex {
1974 name: "myapex",
1975 java_libs: ["myjar"],
1976 key: "myapex.key",
1977 updatable: true,
1978 }
1979 apex_key {
1980 name: "myapex.key",
1981 public_key: "testkey.avbpubkey",
1982 private_key: "testkey.pem",
1983 }
1984 java_library {
1985 name: "myjar",
1986 srcs: ["foo/bar/MyClass.java"],
1987 sdk_version: "current",
1988 apex_available: ["myapex"],
1989 static_libs: ["transitive-jar"],
1990 }
1991 java_library {
1992 name: "transitive-jar",
1993 srcs: ["foo/bar/MyClass.java"],
1994 sdk_version: "core_platform",
1995 apex_available: ["myapex"],
1996 }
1997 `,
1998 },
1999 }
2000
2001 for _, test := range testCases {
2002 t.Run(test.name, func(t *testing.T) {
2003 if test.expectedError == "" {
2004 testApex(t, test.bp)
2005 } else {
2006 testApexError(t, test.expectedError, test.bp)
2007 }
2008 })
2009 }
2010}
2011
Jooyung Han749dc692020-04-15 11:03:39 +09002012func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2013 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 native_shared_libs: ["mylib"],
2018 min_sdk_version: "29",
2019 }
2020
2021 apex_key {
2022 name: "myapex.key",
2023 public_key: "testkey.avbpubkey",
2024 private_key: "testkey.pem",
2025 }
2026
2027 cc_library {
2028 name: "mylib",
2029 srcs: ["mylib.cpp"],
2030 shared_libs: ["mylib2"],
2031 system_shared_libs: [],
2032 stl: "none",
2033 apex_available: [
2034 "myapex",
2035 ],
2036 min_sdk_version: "29",
2037 }
2038
2039 // indirect part of the apex
2040 cc_library {
2041 name: "mylib2",
2042 srcs: ["mylib.cpp"],
2043 system_shared_libs: [],
2044 stl: "none",
2045 apex_available: [
2046 "myapex",
2047 ],
2048 min_sdk_version: "30",
2049 }
2050 `)
2051}
2052
2053func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2054 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2055 apex {
2056 name: "myapex",
2057 key: "myapex.key",
2058 apps: ["AppFoo"],
2059 min_sdk_version: "29",
2060 }
2061
2062 apex_key {
2063 name: "myapex.key",
2064 public_key: "testkey.avbpubkey",
2065 private_key: "testkey.pem",
2066 }
2067
2068 android_app {
2069 name: "AppFoo",
2070 srcs: ["foo/bar/MyClass.java"],
2071 sdk_version: "current",
2072 min_sdk_version: "29",
2073 system_modules: "none",
2074 stl: "none",
2075 static_libs: ["bar"],
2076 apex_available: [ "myapex" ],
2077 }
2078
2079 java_library {
2080 name: "bar",
2081 sdk_version: "current",
2082 srcs: ["a.java"],
2083 apex_available: [ "myapex" ],
2084 }
2085 `)
2086}
2087
2088func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002089 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002090 apex {
2091 name: "myapex",
2092 key: "myapex.key",
2093 native_shared_libs: ["mylib"],
2094 min_sdk_version: "29",
2095 }
2096
2097 apex_key {
2098 name: "myapex.key",
2099 public_key: "testkey.avbpubkey",
2100 private_key: "testkey.pem",
2101 }
2102
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002103 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002104 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2105 cc_library {
2106 name: "mylib",
2107 srcs: ["mylib.cpp"],
2108 shared_libs: ["mylib2"],
2109 system_shared_libs: [],
2110 stl: "none",
2111 apex_available: ["myapex", "otherapex"],
2112 min_sdk_version: "29",
2113 }
2114
2115 cc_library {
2116 name: "mylib2",
2117 srcs: ["mylib.cpp"],
2118 system_shared_libs: [],
2119 stl: "none",
2120 apex_available: ["otherapex"],
2121 stubs: { versions: ["29", "30"] },
2122 min_sdk_version: "30",
2123 }
2124
2125 apex {
2126 name: "otherapex",
2127 key: "myapex.key",
2128 native_shared_libs: ["mylib", "mylib2"],
2129 min_sdk_version: "30",
2130 }
2131 `)
2132 expectLink := func(from, from_variant, to, to_variant string) {
2133 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2134 libFlags := ld.Args["libFlags"]
2135 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2136 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002137 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002138 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002139}
2140
Jooyung Haned124c32021-01-26 11:43:46 +09002141func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002142 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2143 func(variables android.FixtureProductVariables) {
2144 variables.Platform_sdk_codename = proptools.StringPtr("S")
2145 variables.Platform_version_active_codenames = []string{"S"}
2146 },
2147 )
Jooyung Haned124c32021-01-26 11:43:46 +09002148 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2149 apex {
2150 name: "myapex",
2151 key: "myapex.key",
2152 native_shared_libs: ["libfoo"],
2153 min_sdk_version: "S",
2154 }
2155 apex_key {
2156 name: "myapex.key",
2157 public_key: "testkey.avbpubkey",
2158 private_key: "testkey.pem",
2159 }
2160 cc_library {
2161 name: "libfoo",
2162 shared_libs: ["libbar"],
2163 apex_available: ["myapex"],
2164 min_sdk_version: "29",
2165 }
2166 cc_library {
2167 name: "libbar",
2168 apex_available: ["myapex"],
2169 }
2170 `, withSAsActiveCodeNames)
2171}
2172
2173func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002174 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2175 variables.Platform_sdk_codename = proptools.StringPtr("S")
2176 variables.Platform_version_active_codenames = []string{"S", "T"}
2177 })
Colin Cross1c460562021-02-16 17:55:47 -08002178 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002179 apex {
2180 name: "myapex",
2181 key: "myapex.key",
2182 native_shared_libs: ["libfoo"],
2183 min_sdk_version: "S",
2184 }
2185 apex_key {
2186 name: "myapex.key",
2187 public_key: "testkey.avbpubkey",
2188 private_key: "testkey.pem",
2189 }
2190 cc_library {
2191 name: "libfoo",
2192 shared_libs: ["libbar"],
2193 apex_available: ["myapex"],
2194 min_sdk_version: "S",
2195 }
2196 cc_library {
2197 name: "libbar",
2198 stubs: {
2199 symbol_file: "libbar.map.txt",
2200 versions: ["30", "S", "T"],
2201 },
2202 }
2203 `, withSAsActiveCodeNames)
2204
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002205 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002206 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2207 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002208 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002209}
2210
Jiyong Park7c2ee712018-12-07 00:42:25 +09002211func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002212 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002213 apex {
2214 name: "myapex",
2215 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002216 native_shared_libs: ["mylib"],
2217 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002218 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002219 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002220 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002221 }
2222
2223 apex_key {
2224 name: "myapex.key",
2225 public_key: "testkey.avbpubkey",
2226 private_key: "testkey.pem",
2227 }
2228
2229 prebuilt_etc {
2230 name: "myetc",
2231 src: "myprebuilt",
2232 sub_dir: "foo/bar",
2233 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002234
2235 cc_library {
2236 name: "mylib",
2237 srcs: ["mylib.cpp"],
2238 relative_install_path: "foo/bar",
2239 system_shared_libs: [],
2240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002241 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002242 }
2243
2244 cc_binary {
2245 name: "mybin",
2246 srcs: ["mylib.cpp"],
2247 relative_install_path: "foo/bar",
2248 system_shared_libs: [],
2249 static_executable: true,
2250 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002251 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002252 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002253 `)
2254
Sundong Ahnabb64432019-10-22 13:58:29 +09002255 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002256 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2257
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002258 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002259 ensureListContains(t, dirs, "etc")
2260 ensureListContains(t, dirs, "etc/foo")
2261 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002262 ensureListContains(t, dirs, "lib64")
2263 ensureListContains(t, dirs, "lib64/foo")
2264 ensureListContains(t, dirs, "lib64/foo/bar")
2265 ensureListContains(t, dirs, "lib")
2266 ensureListContains(t, dirs, "lib/foo")
2267 ensureListContains(t, dirs, "lib/foo/bar")
2268
Jiyong Parkbd13e442019-03-15 18:10:35 +09002269 ensureListContains(t, dirs, "bin")
2270 ensureListContains(t, dirs, "bin/foo")
2271 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002272}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002273
Jooyung Han35155c42020-02-06 17:33:20 +09002274func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002275 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002276 apex {
2277 name: "myapex",
2278 key: "myapex.key",
2279 multilib: {
2280 both: {
2281 native_shared_libs: ["mylib"],
2282 binaries: ["mybin"],
2283 },
2284 },
2285 compile_multilib: "both",
2286 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002287 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002288 }
2289
2290 apex_key {
2291 name: "myapex.key",
2292 public_key: "testkey.avbpubkey",
2293 private_key: "testkey.pem",
2294 }
2295
2296 cc_library {
2297 name: "mylib",
2298 relative_install_path: "foo/bar",
2299 system_shared_libs: [],
2300 stl: "none",
2301 apex_available: [ "myapex" ],
2302 native_bridge_supported: true,
2303 }
2304
2305 cc_binary {
2306 name: "mybin",
2307 relative_install_path: "foo/bar",
2308 system_shared_libs: [],
2309 static_executable: true,
2310 stl: "none",
2311 apex_available: [ "myapex" ],
2312 native_bridge_supported: true,
2313 compile_multilib: "both", // default is "first" for binary
2314 multilib: {
2315 lib64: {
2316 suffix: "64",
2317 },
2318 },
2319 }
2320 `, withNativeBridgeEnabled)
2321 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2322 "bin/foo/bar/mybin",
2323 "bin/foo/bar/mybin64",
2324 "bin/arm/foo/bar/mybin",
2325 "bin/arm64/foo/bar/mybin64",
2326 "lib/foo/bar/mylib.so",
2327 "lib/arm/foo/bar/mylib.so",
2328 "lib64/foo/bar/mylib.so",
2329 "lib64/arm64/foo/bar/mylib.so",
2330 })
2331}
2332
Jiyong Parkda6eb592018-12-19 17:12:36 +09002333func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002334 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002335 apex {
2336 name: "myapex",
2337 key: "myapex.key",
2338 native_shared_libs: ["mylib"],
2339 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002340 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002341 }
2342
2343 apex_key {
2344 name: "myapex.key",
2345 public_key: "testkey.avbpubkey",
2346 private_key: "testkey.pem",
2347 }
2348
2349 cc_library {
2350 name: "mylib",
2351 srcs: ["mylib.cpp"],
2352 shared_libs: ["mylib2"],
2353 system_shared_libs: [],
2354 vendor_available: true,
2355 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002356 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002357 }
2358
2359 cc_library {
2360 name: "mylib2",
2361 srcs: ["mylib.cpp"],
2362 system_shared_libs: [],
2363 vendor_available: true,
2364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002365 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002366 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002367 `,
2368 setUseVendorAllowListForTest([]string{"myapex"}),
2369 )
Jiyong Parkda6eb592018-12-19 17:12:36 +09002370
2371 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002372 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002373 for _, implicit := range i.Implicits {
2374 inputsList = append(inputsList, implicit.String())
2375 }
2376 }
2377 inputsString := strings.Join(inputsList, " ")
2378
2379 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002380 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2381 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002382
2383 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002384 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2385 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002386}
Jiyong Park16e91a02018-12-20 18:18:08 +09002387
Jooyung Han85d61762020-06-24 23:50:26 +09002388func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002389 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2390 apex {
2391 name: "myapex",
2392 key: "myapex.key",
2393 use_vendor: true,
2394 }
2395 apex_key {
2396 name: "myapex.key",
2397 public_key: "testkey.avbpubkey",
2398 private_key: "testkey.pem",
2399 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002400 `,
2401 setUseVendorAllowListForTest([]string{""}),
2402 )
Colin Cross440e0d02020-06-11 11:32:11 -07002403 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002404 testApex(t, `
2405 apex {
2406 name: "myapex",
2407 key: "myapex.key",
2408 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002409 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002410 }
2411 apex_key {
2412 name: "myapex.key",
2413 public_key: "testkey.avbpubkey",
2414 private_key: "testkey.pem",
2415 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002416 `,
2417 setUseVendorAllowListForTest([]string{"myapex"}),
2418 )
Jooyung Handc782442019-11-01 03:14:38 +09002419}
2420
Jooyung Han5c998b92019-06-27 11:30:33 +09002421func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2422 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2423 apex {
2424 name: "myapex",
2425 key: "myapex.key",
2426 native_shared_libs: ["mylib"],
2427 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002428 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002429 }
2430
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436
2437 cc_library {
2438 name: "mylib",
2439 srcs: ["mylib.cpp"],
2440 system_shared_libs: [],
2441 stl: "none",
2442 }
2443 `)
2444}
2445
Jooyung Han85d61762020-06-24 23:50:26 +09002446func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002447 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 binaries: ["mybin"],
2452 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002453 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002454 }
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460 cc_binary {
2461 name: "mybin",
2462 vendor: true,
2463 shared_libs: ["libfoo"],
2464 }
2465 cc_library {
2466 name: "libfoo",
2467 proprietary: true,
2468 }
2469 `)
2470
2471 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2472 "bin/mybin",
2473 "lib64/libfoo.so",
2474 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2475 "lib64/libc++.so",
2476 })
2477
2478 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002479 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002480 name := apexBundle.BaseModuleName()
2481 prefix := "TARGET_"
2482 var builder strings.Builder
2483 data.Custom(&builder, name, prefix, "", data)
Paul Duffin37ba3442021-03-29 00:21:08 +01002484 androidMk := android.StringRelativeToTop(ctx.Config(), builder.String())
2485 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002486 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002487
2488 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2489 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2490 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002491}
2492
Jooyung Handf78e212020-07-22 15:54:47 +09002493func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002494 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002495 apex {
2496 name: "myapex",
2497 key: "myapex.key",
2498 binaries: ["mybin"],
2499 vendor: true,
2500 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002501 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002502 }
2503 apex_key {
2504 name: "myapex.key",
2505 public_key: "testkey.avbpubkey",
2506 private_key: "testkey.pem",
2507 }
2508 cc_binary {
2509 name: "mybin",
2510 vendor: true,
2511 shared_libs: ["libvndk", "libvendor"],
2512 }
2513 cc_library {
2514 name: "libvndk",
2515 vndk: {
2516 enabled: true,
2517 },
2518 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002519 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002520 }
2521 cc_library {
2522 name: "libvendor",
2523 vendor: true,
2524 }
2525 `)
2526
2527 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2528
Paul Duffina71a67a2021-03-29 00:42:57 +01002529 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002530 libs := names(ldRule.Args["libFlags"])
2531 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002532 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2533 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002534 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002535 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002536
2537 // VNDK libs are not included when use_vndk_as_stable: true
2538 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2539 "bin/mybin",
2540 "lib64/libvendor.so",
2541 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002542
2543 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2544 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2545 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002546}
2547
Justin Yun13decfb2021-03-08 19:25:55 +09002548func TestProductVariant(t *testing.T) {
2549 ctx := testApex(t, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 updatable: false,
2554 product_specific: true,
2555 binaries: ["foo"],
2556 }
2557
2558 apex_key {
2559 name: "myapex.key",
2560 public_key: "testkey.avbpubkey",
2561 private_key: "testkey.pem",
2562 }
2563
2564 cc_binary {
2565 name: "foo",
2566 product_available: true,
2567 apex_available: ["myapex"],
2568 srcs: ["foo.cpp"],
2569 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002570 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2571 variables.ProductVndkVersion = proptools.StringPtr("current")
2572 }),
2573 )
Justin Yun13decfb2021-03-08 19:25:55 +09002574
2575 cflags := strings.Fields(
2576 ctx.ModuleForTests("foo", "android_product.VER_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
2577 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2578 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2579 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2580 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2581}
2582
Jooyung Han8e5685d2020-09-21 11:02:57 +09002583func TestApex_withPrebuiltFirmware(t *testing.T) {
2584 testCases := []struct {
2585 name string
2586 additionalProp string
2587 }{
2588 {"system apex with prebuilt_firmware", ""},
2589 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2590 }
2591 for _, tc := range testCases {
2592 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002593 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002594 apex {
2595 name: "myapex",
2596 key: "myapex.key",
2597 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002598 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002599 `+tc.additionalProp+`
2600 }
2601 apex_key {
2602 name: "myapex.key",
2603 public_key: "testkey.avbpubkey",
2604 private_key: "testkey.pem",
2605 }
2606 prebuilt_firmware {
2607 name: "myfirmware",
2608 src: "myfirmware.bin",
2609 filename_from_src: true,
2610 `+tc.additionalProp+`
2611 }
2612 `)
2613 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2614 "etc/firmware/myfirmware.bin",
2615 })
2616 })
2617 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002618}
2619
Jooyung Hanefb184e2020-06-25 17:14:25 +09002620func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002621 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002622 apex {
2623 name: "myapex",
2624 key: "myapex.key",
2625 use_vendor: true,
2626 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002627 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002628 }
2629
2630 apex_key {
2631 name: "myapex.key",
2632 public_key: "testkey.avbpubkey",
2633 private_key: "testkey.pem",
2634 }
2635
2636 cc_library {
2637 name: "mylib",
2638 vendor_available: true,
2639 apex_available: ["myapex"],
2640 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002641 `,
2642 setUseVendorAllowListForTest([]string{"myapex"}),
2643 )
Jooyung Hanefb184e2020-06-25 17:14:25 +09002644
2645 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002646 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002647 name := apexBundle.BaseModuleName()
2648 prefix := "TARGET_"
2649 var builder strings.Builder
2650 data.Custom(&builder, name, prefix, "", data)
2651 androidMk := builder.String()
2652 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2653}
2654
2655func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002656 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002657 apex {
2658 name: "myapex",
2659 key: "myapex.key",
2660 vendor: true,
2661 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002662 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002663 }
2664
2665 apex_key {
2666 name: "myapex.key",
2667 public_key: "testkey.avbpubkey",
2668 private_key: "testkey.pem",
2669 }
2670
2671 cc_library {
2672 name: "mylib",
2673 vendor_available: true,
2674 }
2675 `)
2676
2677 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002678 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002679 name := apexBundle.BaseModuleName()
2680 prefix := "TARGET_"
2681 var builder strings.Builder
2682 data.Custom(&builder, name, prefix, "", data)
2683 androidMk := builder.String()
2684 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2685}
2686
Jooyung Han2ed99d02020-06-24 23:26:26 +09002687func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002688 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002689 apex {
2690 name: "myapex",
2691 key: "myapex.key",
2692 vintf_fragments: ["fragment.xml"],
2693 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002694 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002695 }
2696 apex_key {
2697 name: "myapex.key",
2698 public_key: "testkey.avbpubkey",
2699 private_key: "testkey.pem",
2700 }
2701 cc_binary {
2702 name: "mybin",
2703 }
2704 `)
2705
2706 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002707 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002708 name := apexBundle.BaseModuleName()
2709 prefix := "TARGET_"
2710 var builder strings.Builder
2711 data.Custom(&builder, name, prefix, "", data)
2712 androidMk := builder.String()
2713 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2714 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2715}
2716
Jiyong Park16e91a02018-12-20 18:18:08 +09002717func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002718 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002719 apex {
2720 name: "myapex",
2721 key: "myapex.key",
2722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002723 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002724 }
2725
2726 apex_key {
2727 name: "myapex.key",
2728 public_key: "testkey.avbpubkey",
2729 private_key: "testkey.pem",
2730 }
2731
2732 cc_library {
2733 name: "mylib",
2734 srcs: ["mylib.cpp"],
2735 system_shared_libs: [],
2736 stl: "none",
2737 stubs: {
2738 versions: ["1", "2", "3"],
2739 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002740 apex_available: [
2741 "//apex_available:platform",
2742 "myapex",
2743 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002744 }
2745
2746 cc_binary {
2747 name: "not_in_apex",
2748 srcs: ["mylib.cpp"],
2749 static_libs: ["mylib"],
2750 static_executable: true,
2751 system_shared_libs: [],
2752 stl: "none",
2753 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002754 `)
2755
Colin Cross7113d202019-11-20 16:39:12 -08002756 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002757
2758 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002759 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002760}
Jiyong Park9335a262018-12-24 11:31:58 +09002761
2762func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002763 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002764 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002765 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002766 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002767 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002768 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002769 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002770 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002771 }
2772
2773 cc_library {
2774 name: "mylib",
2775 srcs: ["mylib.cpp"],
2776 system_shared_libs: [],
2777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002778 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002779 }
2780
2781 apex_key {
2782 name: "myapex.key",
2783 public_key: "testkey.avbpubkey",
2784 private_key: "testkey.pem",
2785 }
2786
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002787 android_app_certificate {
2788 name: "myapex.certificate",
2789 certificate: "testkey",
2790 }
2791
2792 android_app_certificate {
2793 name: "myapex.certificate.override",
2794 certificate: "testkey.override",
2795 }
2796
Jiyong Park9335a262018-12-24 11:31:58 +09002797 `)
2798
2799 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002800 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002801
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002802 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2803 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002804 "vendor/foo/devkeys/testkey.avbpubkey")
2805 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002806 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2807 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002808 "vendor/foo/devkeys/testkey.pem")
2809 }
2810
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002811 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002812 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002813 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002814 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002815 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002816 }
2817}
Jiyong Park58e364a2019-01-19 19:24:06 +09002818
Jooyung Hanf121a652019-12-17 14:30:11 +09002819func TestCertificate(t *testing.T) {
2820 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002821 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002822 apex {
2823 name: "myapex",
2824 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002825 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002826 }
2827 apex_key {
2828 name: "myapex.key",
2829 public_key: "testkey.avbpubkey",
2830 private_key: "testkey.pem",
2831 }`)
2832 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2833 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2834 if actual := rule.Args["certificates"]; actual != expected {
2835 t.Errorf("certificates should be %q, not %q", expected, actual)
2836 }
2837 })
2838 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002839 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002840 apex {
2841 name: "myapex_keytest",
2842 key: "myapex.key",
2843 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002844 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002845 }
2846 apex_key {
2847 name: "myapex.key",
2848 public_key: "testkey.avbpubkey",
2849 private_key: "testkey.pem",
2850 }
2851 android_app_certificate {
2852 name: "myapex.certificate.override",
2853 certificate: "testkey.override",
2854 }`)
2855 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2856 expected := "testkey.override.x509.pem testkey.override.pk8"
2857 if actual := rule.Args["certificates"]; actual != expected {
2858 t.Errorf("certificates should be %q, not %q", expected, actual)
2859 }
2860 })
2861 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002862 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002863 apex {
2864 name: "myapex",
2865 key: "myapex.key",
2866 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002867 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002868 }
2869 apex_key {
2870 name: "myapex.key",
2871 public_key: "testkey.avbpubkey",
2872 private_key: "testkey.pem",
2873 }
2874 android_app_certificate {
2875 name: "myapex.certificate",
2876 certificate: "testkey",
2877 }`)
2878 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2879 expected := "testkey.x509.pem testkey.pk8"
2880 if actual := rule.Args["certificates"]; actual != expected {
2881 t.Errorf("certificates should be %q, not %q", expected, actual)
2882 }
2883 })
2884 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002885 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002886 apex {
2887 name: "myapex_keytest",
2888 key: "myapex.key",
2889 file_contexts: ":myapex-file_contexts",
2890 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002891 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002892 }
2893 apex_key {
2894 name: "myapex.key",
2895 public_key: "testkey.avbpubkey",
2896 private_key: "testkey.pem",
2897 }
2898 android_app_certificate {
2899 name: "myapex.certificate.override",
2900 certificate: "testkey.override",
2901 }`)
2902 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2903 expected := "testkey.override.x509.pem testkey.override.pk8"
2904 if actual := rule.Args["certificates"]; actual != expected {
2905 t.Errorf("certificates should be %q, not %q", expected, actual)
2906 }
2907 })
2908 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002909 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002914 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002915 }
2916 apex_key {
2917 name: "myapex.key",
2918 public_key: "testkey.avbpubkey",
2919 private_key: "testkey.pem",
2920 }`)
2921 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2922 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2923 if actual := rule.Args["certificates"]; actual != expected {
2924 t.Errorf("certificates should be %q, not %q", expected, actual)
2925 }
2926 })
2927 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002928 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002929 apex {
2930 name: "myapex_keytest",
2931 key: "myapex.key",
2932 file_contexts: ":myapex-file_contexts",
2933 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002934 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002935 }
2936 apex_key {
2937 name: "myapex.key",
2938 public_key: "testkey.avbpubkey",
2939 private_key: "testkey.pem",
2940 }
2941 android_app_certificate {
2942 name: "myapex.certificate.override",
2943 certificate: "testkey.override",
2944 }`)
2945 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2946 expected := "testkey.override.x509.pem testkey.override.pk8"
2947 if actual := rule.Args["certificates"]; actual != expected {
2948 t.Errorf("certificates should be %q, not %q", expected, actual)
2949 }
2950 })
2951}
2952
Jiyong Park58e364a2019-01-19 19:24:06 +09002953func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002954 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002955 apex {
2956 name: "myapex",
2957 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002958 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002959 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09002960 }
2961
2962 apex {
2963 name: "otherapex",
2964 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002965 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002966 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002967 }
2968
2969 apex_key {
2970 name: "myapex.key",
2971 public_key: "testkey.avbpubkey",
2972 private_key: "testkey.pem",
2973 }
2974
2975 cc_library {
2976 name: "mylib",
2977 srcs: ["mylib.cpp"],
2978 system_shared_libs: [],
2979 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002980 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002981 "myapex",
2982 "otherapex",
2983 ],
Jooyung Han24282772020-03-21 23:20:55 +09002984 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002985 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002986 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002987 cc_library {
2988 name: "mylib2",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 apex_available: [
2993 "myapex",
2994 "otherapex",
2995 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002996 static_libs: ["mylib3"],
2997 recovery_available: true,
2998 min_sdk_version: "29",
2999 }
3000 cc_library {
3001 name: "mylib3",
3002 srcs: ["mylib.cpp"],
3003 system_shared_libs: [],
3004 stl: "none",
3005 apex_available: [
3006 "myapex",
3007 "otherapex",
3008 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003009 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003010 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003011 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003012 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003013 `)
3014
Jooyung Hanc87a0592020-03-02 17:44:33 +09003015 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003016 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003017 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003018 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003019
Jooyung Hanccce2f22020-03-07 03:45:53 +09003020 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003021 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003022 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003023 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003024 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003025
Jooyung Hanccce2f22020-03-07 03:45:53 +09003026 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003027 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003028 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003029 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003030 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003031
Colin Crossaede88c2020-08-11 12:17:01 -07003032 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3033 // each variant defines additional macros to distinguish which apex variant it is built for
3034
3035 // non-APEX variant does not have __ANDROID_APEX__ defined
3036 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3037 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3038
3039 // APEX variant has __ANDROID_APEX__ defined
3040 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3041 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3042 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3043 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3044
3045 // APEX variant has __ANDROID_APEX__ defined
3046 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3047 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3048 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3049 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3050
Dan Albertb19953d2020-11-17 15:29:36 -08003051 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003052 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3053 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003054 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003055
3056 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3057 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003058
3059 // non-APEX variant does not have __ANDROID_APEX__ defined
3060 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3061 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3062
3063 // APEX variant has __ANDROID_APEX__ defined
3064 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003065 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003066 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003067 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003068
Jooyung Hanc87a0592020-03-02 17:44:33 +09003069 // APEX variant has __ANDROID_APEX__ defined
3070 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003071 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003072 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003073 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003074
Dan Albertb19953d2020-11-17 15:29:36 -08003075 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003076 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003077 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003078 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003079}
Jiyong Park7e636d02019-01-28 16:16:54 +09003080
3081func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003082 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003083 apex {
3084 name: "myapex",
3085 key: "myapex.key",
3086 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003087 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003088 }
3089
3090 apex_key {
3091 name: "myapex.key",
3092 public_key: "testkey.avbpubkey",
3093 private_key: "testkey.pem",
3094 }
3095
3096 cc_library_headers {
3097 name: "mylib_headers",
3098 export_include_dirs: ["my_include"],
3099 system_shared_libs: [],
3100 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003101 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003102 }
3103
3104 cc_library {
3105 name: "mylib",
3106 srcs: ["mylib.cpp"],
3107 system_shared_libs: [],
3108 stl: "none",
3109 header_libs: ["mylib_headers"],
3110 export_header_lib_headers: ["mylib_headers"],
3111 stubs: {
3112 versions: ["1", "2", "3"],
3113 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003114 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003115 }
3116
3117 cc_library {
3118 name: "otherlib",
3119 srcs: ["mylib.cpp"],
3120 system_shared_libs: [],
3121 stl: "none",
3122 shared_libs: ["mylib"],
3123 }
3124 `)
3125
Colin Cross7113d202019-11-20 16:39:12 -08003126 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003127
3128 // Ensure that the include path of the header lib is exported to 'otherlib'
3129 ensureContains(t, cFlags, "-Imy_include")
3130}
Alex Light9670d332019-01-29 18:07:33 -08003131
Jiyong Park7cd10e32020-01-14 09:22:18 +09003132type fileInApex struct {
3133 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003134 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003135 isLink bool
3136}
3137
Jooyung Hana57af4a2020-01-23 05:36:59 +00003138func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003139 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003140 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003141 copyCmds := apexRule.Args["copy_commands"]
3142 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003143 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003144 for _, cmd := range strings.Split(copyCmds, "&&") {
3145 cmd = strings.TrimSpace(cmd)
3146 if cmd == "" {
3147 continue
3148 }
3149 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003150 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003151 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003152 switch terms[0] {
3153 case "mkdir":
3154 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003155 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003156 t.Fatal("copyCmds contains invalid cp command", cmd)
3157 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003158 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003159 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003160 isLink = false
3161 case "ln":
3162 if len(terms) != 3 && len(terms) != 4 {
3163 // ln LINK TARGET or ln -s LINK TARGET
3164 t.Fatal("copyCmds contains invalid ln command", cmd)
3165 }
3166 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003167 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003168 isLink = true
3169 default:
3170 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3171 }
3172 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003173 index := strings.Index(dst, imageApexDir)
3174 if index == -1 {
3175 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3176 }
3177 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003178 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003179 }
3180 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003181 return ret
3182}
3183
Jooyung Hana57af4a2020-01-23 05:36:59 +00003184func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3185 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003186 var failed bool
3187 var surplus []string
3188 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003189 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003190 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003191 for _, expected := range files {
3192 if matched, _ := path.Match(expected, file.path); matched {
3193 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003194 mactchFound = true
3195 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003196 }
3197 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003198 if !mactchFound {
3199 surplus = append(surplus, file.path)
3200 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003201 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003202
Jooyung Han31c470b2019-10-18 16:26:59 +09003203 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003204 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003205 t.Log("surplus files", surplus)
3206 failed = true
3207 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003208
3209 if len(files) > len(filesMatched) {
3210 var missing []string
3211 for _, expected := range files {
3212 if !filesMatched[expected] {
3213 missing = append(missing, expected)
3214 }
3215 }
3216 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003217 t.Log("missing files", missing)
3218 failed = true
3219 }
3220 if failed {
3221 t.Fail()
3222 }
3223}
3224
Jooyung Han344d5432019-08-23 11:17:39 +09003225func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003226 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003227 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003228 name: "com.android.vndk.current",
3229 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003230 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003231 }
3232
3233 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003234 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003235 public_key: "testkey.avbpubkey",
3236 private_key: "testkey.pem",
3237 }
3238
3239 cc_library {
3240 name: "libvndk",
3241 srcs: ["mylib.cpp"],
3242 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003243 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003244 vndk: {
3245 enabled: true,
3246 },
3247 system_shared_libs: [],
3248 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003249 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003250 }
3251
3252 cc_library {
3253 name: "libvndksp",
3254 srcs: ["mylib.cpp"],
3255 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003256 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003257 vndk: {
3258 enabled: true,
3259 support_system_process: true,
3260 },
3261 system_shared_libs: [],
3262 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003263 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003264 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003265 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003266
Colin Cross2807f002021-03-02 10:15:29 -08003267 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003268 "lib/libvndk.so",
3269 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003270 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003271 "lib64/libvndk.so",
3272 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003273 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003274 "etc/llndk.libraries.VER.txt",
3275 "etc/vndkcore.libraries.VER.txt",
3276 "etc/vndksp.libraries.VER.txt",
3277 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003278 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003279 })
Jooyung Han344d5432019-08-23 11:17:39 +09003280}
3281
3282func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003283 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003284 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003285 name: "com.android.vndk.current",
3286 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003287 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003288 }
3289
3290 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003291 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003292 public_key: "testkey.avbpubkey",
3293 private_key: "testkey.pem",
3294 }
3295
3296 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003297 name: "libvndk",
3298 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003299 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003300 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003301 vndk: {
3302 enabled: true,
3303 },
3304 system_shared_libs: [],
3305 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003306 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003307 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003308
3309 cc_prebuilt_library_shared {
3310 name: "libvndk.arm",
3311 srcs: ["libvndk.arm.so"],
3312 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003313 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 vndk: {
3315 enabled: true,
3316 },
3317 enabled: false,
3318 arch: {
3319 arm: {
3320 enabled: true,
3321 },
3322 },
3323 system_shared_libs: [],
3324 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003325 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003326 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003327 `+vndkLibrariesTxtFiles("current"),
3328 withFiles(map[string][]byte{
3329 "libvndk.so": nil,
3330 "libvndk.arm.so": nil,
3331 }))
Colin Cross2807f002021-03-02 10:15:29 -08003332 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003333 "lib/libvndk.so",
3334 "lib/libvndk.arm.so",
3335 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003336 "lib/libc++.so",
3337 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003338 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003339 })
Jooyung Han344d5432019-08-23 11:17:39 +09003340}
3341
Jooyung Han39edb6c2019-11-06 16:53:07 +09003342func vndkLibrariesTxtFiles(vers ...string) (result string) {
3343 for _, v := range vers {
3344 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003345 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003346 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003347 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003348 name: "` + txt + `.libraries.txt",
3349 }
3350 `
3351 }
3352 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003353 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003354 result += `
3355 prebuilt_etc {
3356 name: "` + txt + `.libraries.` + v + `.txt",
3357 src: "dummy.txt",
3358 }
3359 `
3360 }
3361 }
3362 }
3363 return
3364}
3365
Jooyung Han344d5432019-08-23 11:17:39 +09003366func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003368 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003369 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003370 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003371 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003372 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003373 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003374 }
3375
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
3381
Jooyung Han31c470b2019-10-18 16:26:59 +09003382 vndk_prebuilt_shared {
3383 name: "libvndk27",
3384 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003385 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003386 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003387 vndk: {
3388 enabled: true,
3389 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003390 target_arch: "arm64",
3391 arch: {
3392 arm: {
3393 srcs: ["libvndk27_arm.so"],
3394 },
3395 arm64: {
3396 srcs: ["libvndk27_arm64.so"],
3397 },
3398 },
Colin Cross2807f002021-03-02 10:15:29 -08003399 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003400 }
3401
3402 vndk_prebuilt_shared {
3403 name: "libvndk27",
3404 version: "27",
3405 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003406 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003407 vndk: {
3408 enabled: true,
3409 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 target_arch: "x86_64",
3411 arch: {
3412 x86: {
3413 srcs: ["libvndk27_x86.so"],
3414 },
3415 x86_64: {
3416 srcs: ["libvndk27_x86_64.so"],
3417 },
3418 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003419 }
3420 `+vndkLibrariesTxtFiles("27"),
3421 withFiles(map[string][]byte{
3422 "libvndk27_arm.so": nil,
3423 "libvndk27_arm64.so": nil,
3424 "libvndk27_x86.so": nil,
3425 "libvndk27_x86_64.so": nil,
3426 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003427
Colin Cross2807f002021-03-02 10:15:29 -08003428 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 "lib/libvndk27_arm.so",
3430 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003431 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003432 })
Jooyung Han344d5432019-08-23 11:17:39 +09003433}
3434
Jooyung Han90eee022019-10-01 20:02:42 +09003435func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003436 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003437 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003438 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003439 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003440 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003442 }
3443 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003444 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003445 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003446 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003447 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003448 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003449 }
3450 apex_key {
3451 name: "myapex.key",
3452 public_key: "testkey.avbpubkey",
3453 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003454 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003455
3456 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003457 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003458 actual := proptools.String(bundle.properties.Apex_name)
3459 if !reflect.DeepEqual(actual, expected) {
3460 t.Errorf("Got '%v', expected '%v'", actual, expected)
3461 }
3462 }
3463
Colin Cross2807f002021-03-02 10:15:29 -08003464 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3465 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003466}
3467
Jooyung Han344d5432019-08-23 11:17:39 +09003468func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003469 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003470 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003471 name: "com.android.vndk.current",
3472 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003473 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003474 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003475 }
3476
3477 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003478 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003479 public_key: "testkey.avbpubkey",
3480 private_key: "testkey.pem",
3481 }
3482
3483 cc_library {
3484 name: "libvndk",
3485 srcs: ["mylib.cpp"],
3486 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003487 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003488 native_bridge_supported: true,
3489 host_supported: true,
3490 vndk: {
3491 enabled: true,
3492 },
3493 system_shared_libs: [],
3494 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003495 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003496 }
Colin Cross2807f002021-03-02 10:15:29 -08003497 `+vndkLibrariesTxtFiles("current"),
3498 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003499
Colin Cross2807f002021-03-02 10:15:29 -08003500 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003501 "lib/libvndk.so",
3502 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003503 "lib/libc++.so",
3504 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003505 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003506 })
Jooyung Han344d5432019-08-23 11:17:39 +09003507}
3508
3509func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003510 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003511 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003512 name: "com.android.vndk.current",
3513 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003514 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003515 native_bridge_supported: true,
3516 }
3517
3518 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003519 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003520 public_key: "testkey.avbpubkey",
3521 private_key: "testkey.pem",
3522 }
3523
3524 cc_library {
3525 name: "libvndk",
3526 srcs: ["mylib.cpp"],
3527 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003528 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003529 native_bridge_supported: true,
3530 host_supported: true,
3531 vndk: {
3532 enabled: true,
3533 },
3534 system_shared_libs: [],
3535 stl: "none",
3536 }
3537 `)
3538}
3539
Jooyung Han31c470b2019-10-18 16:26:59 +09003540func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003541 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003542 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003543 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003544 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003545 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003546 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003547 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003548 }
3549
3550 apex_key {
3551 name: "myapex.key",
3552 public_key: "testkey.avbpubkey",
3553 private_key: "testkey.pem",
3554 }
3555
3556 vndk_prebuilt_shared {
3557 name: "libvndk27",
3558 version: "27",
3559 target_arch: "arm",
3560 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003561 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003562 vndk: {
3563 enabled: true,
3564 },
3565 arch: {
3566 arm: {
3567 srcs: ["libvndk27.so"],
3568 }
3569 },
3570 }
3571
3572 vndk_prebuilt_shared {
3573 name: "libvndk27",
3574 version: "27",
3575 target_arch: "arm",
3576 binder32bit: true,
3577 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003578 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003579 vndk: {
3580 enabled: true,
3581 },
3582 arch: {
3583 arm: {
3584 srcs: ["libvndk27binder32.so"],
3585 }
3586 },
Colin Cross2807f002021-03-02 10:15:29 -08003587 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003588 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003589 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003590 withFiles(map[string][]byte{
3591 "libvndk27.so": nil,
3592 "libvndk27binder32.so": nil,
3593 }),
3594 withBinder32bit,
3595 withTargets(map[android.OsType][]android.Target{
3596 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003597 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3598 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003599 },
3600 }),
3601 )
3602
Colin Cross2807f002021-03-02 10:15:29 -08003603 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003604 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003605 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003606 })
3607}
3608
Jooyung Han45a96772020-06-15 14:59:42 +09003609func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003610 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003611 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003612 name: "com.android.vndk.current",
3613 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003614 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003615 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003616 }
3617
3618 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003619 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003620 public_key: "testkey.avbpubkey",
3621 private_key: "testkey.pem",
3622 }
3623
3624 cc_library {
3625 name: "libz",
3626 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003627 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003628 vndk: {
3629 enabled: true,
3630 },
3631 stubs: {
3632 symbol_file: "libz.map.txt",
3633 versions: ["30"],
3634 }
3635 }
3636 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3637 "libz.map.txt": nil,
3638 }))
3639
Colin Cross2807f002021-03-02 10:15:29 -08003640 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003641 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3642 ensureListEmpty(t, provideNativeLibs)
3643}
3644
Jooyung Hane1633032019-08-01 17:41:43 +09003645func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003646 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003647 apex {
3648 name: "myapex_nodep",
3649 key: "myapex.key",
3650 native_shared_libs: ["lib_nodep"],
3651 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003652 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003653 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003654 }
3655
3656 apex {
3657 name: "myapex_dep",
3658 key: "myapex.key",
3659 native_shared_libs: ["lib_dep"],
3660 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003661 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003662 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003663 }
3664
3665 apex {
3666 name: "myapex_provider",
3667 key: "myapex.key",
3668 native_shared_libs: ["libfoo"],
3669 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003670 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003671 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003672 }
3673
3674 apex {
3675 name: "myapex_selfcontained",
3676 key: "myapex.key",
3677 native_shared_libs: ["lib_dep", "libfoo"],
3678 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003679 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003680 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003681 }
3682
3683 apex_key {
3684 name: "myapex.key",
3685 public_key: "testkey.avbpubkey",
3686 private_key: "testkey.pem",
3687 }
3688
3689 cc_library {
3690 name: "lib_nodep",
3691 srcs: ["mylib.cpp"],
3692 system_shared_libs: [],
3693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003694 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003695 }
3696
3697 cc_library {
3698 name: "lib_dep",
3699 srcs: ["mylib.cpp"],
3700 shared_libs: ["libfoo"],
3701 system_shared_libs: [],
3702 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003703 apex_available: [
3704 "myapex_dep",
3705 "myapex_provider",
3706 "myapex_selfcontained",
3707 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003708 }
3709
3710 cc_library {
3711 name: "libfoo",
3712 srcs: ["mytest.cpp"],
3713 stubs: {
3714 versions: ["1"],
3715 },
3716 system_shared_libs: [],
3717 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003718 apex_available: [
3719 "myapex_provider",
3720 "myapex_selfcontained",
3721 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003722 }
3723 `)
3724
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003725 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003726 var provideNativeLibs, requireNativeLibs []string
3727
Sundong Ahnabb64432019-10-22 13:58:29 +09003728 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003729 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3730 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003731 ensureListEmpty(t, provideNativeLibs)
3732 ensureListEmpty(t, requireNativeLibs)
3733
Sundong Ahnabb64432019-10-22 13:58:29 +09003734 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003735 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3736 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003737 ensureListEmpty(t, provideNativeLibs)
3738 ensureListContains(t, requireNativeLibs, "libfoo.so")
3739
Sundong Ahnabb64432019-10-22 13:58:29 +09003740 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003741 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3742 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003743 ensureListContains(t, provideNativeLibs, "libfoo.so")
3744 ensureListEmpty(t, requireNativeLibs)
3745
Sundong Ahnabb64432019-10-22 13:58:29 +09003746 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003747 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3748 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003749 ensureListContains(t, provideNativeLibs, "libfoo.so")
3750 ensureListEmpty(t, requireNativeLibs)
3751}
3752
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003753func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003754 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003755 apex {
3756 name: "myapex",
3757 key: "myapex.key",
3758 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003759 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003760 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003761 }
3762
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
3767 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003768
3769 cc_library {
3770 name: "mylib",
3771 srcs: ["mylib.cpp"],
3772 system_shared_libs: [],
3773 stl: "none",
3774 apex_available: [
3775 "//apex_available:platform",
3776 "myapex",
3777 ],
3778 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003779 `)
3780
Sundong Ahnabb64432019-10-22 13:58:29 +09003781 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003782 apexManifestRule := module.Rule("apexManifestRule")
3783 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3784 apexRule := module.Rule("apexRule")
3785 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003786
3787 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003788 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003789 name := apexBundle.BaseModuleName()
3790 prefix := "TARGET_"
3791 var builder strings.Builder
3792 data.Custom(&builder, name, prefix, "", data)
3793 androidMk := builder.String()
3794 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3795 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003796}
3797
Alex Light0851b882019-02-07 13:20:53 -08003798func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003799 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003800 apex {
3801 name: "myapex",
3802 key: "myapex.key",
3803 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003804 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003805 }
3806
3807 apex_key {
3808 name: "myapex.key",
3809 public_key: "testkey.avbpubkey",
3810 private_key: "testkey.pem",
3811 }
3812
3813 cc_library {
3814 name: "mylib_common",
3815 srcs: ["mylib.cpp"],
3816 system_shared_libs: [],
3817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003818 apex_available: [
3819 "//apex_available:platform",
3820 "myapex",
3821 ],
Alex Light0851b882019-02-07 13:20:53 -08003822 }
3823 `)
3824
Sundong Ahnabb64432019-10-22 13:58:29 +09003825 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003826 apexRule := module.Rule("apexRule")
3827 copyCmds := apexRule.Args["copy_commands"]
3828
3829 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3830 t.Log("Apex was a test apex!")
3831 t.Fail()
3832 }
3833 // Ensure that main rule creates an output
3834 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3835
3836 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003837 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003838
3839 // Ensure that both direct and indirect deps are copied into apex
3840 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3841
Colin Cross7113d202019-11-20 16:39:12 -08003842 // Ensure that the platform variant ends with _shared
3843 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003844
Colin Cross56a83212020-09-15 18:30:11 -07003845 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003846 t.Log("Found mylib_common not in any apex!")
3847 t.Fail()
3848 }
3849}
3850
3851func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003852 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003853 apex_test {
3854 name: "myapex",
3855 key: "myapex.key",
3856 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003857 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003858 }
3859
3860 apex_key {
3861 name: "myapex.key",
3862 public_key: "testkey.avbpubkey",
3863 private_key: "testkey.pem",
3864 }
3865
3866 cc_library {
3867 name: "mylib_common_test",
3868 srcs: ["mylib.cpp"],
3869 system_shared_libs: [],
3870 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003871 // TODO: remove //apex_available:platform
3872 apex_available: [
3873 "//apex_available:platform",
3874 "myapex",
3875 ],
Alex Light0851b882019-02-07 13:20:53 -08003876 }
3877 `)
3878
Sundong Ahnabb64432019-10-22 13:58:29 +09003879 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003880 apexRule := module.Rule("apexRule")
3881 copyCmds := apexRule.Args["copy_commands"]
3882
3883 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3884 t.Log("Apex was not a test apex!")
3885 t.Fail()
3886 }
3887 // Ensure that main rule creates an output
3888 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3889
3890 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003891 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003892
3893 // Ensure that both direct and indirect deps are copied into apex
3894 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3895
Colin Cross7113d202019-11-20 16:39:12 -08003896 // Ensure that the platform variant ends with _shared
3897 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003898}
3899
Alex Light9670d332019-01-29 18:07:33 -08003900func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003901 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003902 apex {
3903 name: "myapex",
3904 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003905 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003906 multilib: {
3907 first: {
3908 native_shared_libs: ["mylib_common"],
3909 }
3910 },
3911 target: {
3912 android: {
3913 multilib: {
3914 first: {
3915 native_shared_libs: ["mylib"],
3916 }
3917 }
3918 },
3919 host: {
3920 multilib: {
3921 first: {
3922 native_shared_libs: ["mylib2"],
3923 }
3924 }
3925 }
3926 }
3927 }
3928
3929 apex_key {
3930 name: "myapex.key",
3931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
3933 }
3934
3935 cc_library {
3936 name: "mylib",
3937 srcs: ["mylib.cpp"],
3938 system_shared_libs: [],
3939 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003940 // TODO: remove //apex_available:platform
3941 apex_available: [
3942 "//apex_available:platform",
3943 "myapex",
3944 ],
Alex Light9670d332019-01-29 18:07:33 -08003945 }
3946
3947 cc_library {
3948 name: "mylib_common",
3949 srcs: ["mylib.cpp"],
3950 system_shared_libs: [],
3951 stl: "none",
3952 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003953 // TODO: remove //apex_available:platform
3954 apex_available: [
3955 "//apex_available:platform",
3956 "myapex",
3957 ],
Alex Light9670d332019-01-29 18:07:33 -08003958 }
3959
3960 cc_library {
3961 name: "mylib2",
3962 srcs: ["mylib.cpp"],
3963 system_shared_libs: [],
3964 stl: "none",
3965 compile_multilib: "first",
3966 }
3967 `)
3968
Sundong Ahnabb64432019-10-22 13:58:29 +09003969 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003970 copyCmds := apexRule.Args["copy_commands"]
3971
3972 // Ensure that main rule creates an output
3973 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3974
3975 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003976 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3977 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3978 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003979
3980 // Ensure that both direct and indirect deps are copied into apex
3981 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3982 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3983 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3984
Colin Cross7113d202019-11-20 16:39:12 -08003985 // Ensure that the platform variant ends with _shared
3986 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3987 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3988 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003989}
Jiyong Park04480cf2019-02-06 00:16:29 +09003990
Jiyong Park59140302020-12-14 18:44:04 +09003991func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09003993 apex {
3994 name: "myapex",
3995 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003996 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09003997 arch: {
3998 arm64: {
3999 native_shared_libs: ["mylib.arm64"],
4000 },
4001 x86_64: {
4002 native_shared_libs: ["mylib.x64"],
4003 },
4004 }
4005 }
4006
4007 apex_key {
4008 name: "myapex.key",
4009 public_key: "testkey.avbpubkey",
4010 private_key: "testkey.pem",
4011 }
4012
4013 cc_library {
4014 name: "mylib.arm64",
4015 srcs: ["mylib.cpp"],
4016 system_shared_libs: [],
4017 stl: "none",
4018 // TODO: remove //apex_available:platform
4019 apex_available: [
4020 "//apex_available:platform",
4021 "myapex",
4022 ],
4023 }
4024
4025 cc_library {
4026 name: "mylib.x64",
4027 srcs: ["mylib.cpp"],
4028 system_shared_libs: [],
4029 stl: "none",
4030 // TODO: remove //apex_available:platform
4031 apex_available: [
4032 "//apex_available:platform",
4033 "myapex",
4034 ],
4035 }
4036 `)
4037
4038 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4039 copyCmds := apexRule.Args["copy_commands"]
4040
4041 // Ensure that apex variant is created for the direct dep
4042 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4043 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4044
4045 // Ensure that both direct and indirect deps are copied into apex
4046 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4047 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4048}
4049
Jiyong Park04480cf2019-02-06 00:16:29 +09004050func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004051 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004052 apex {
4053 name: "myapex",
4054 key: "myapex.key",
4055 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004056 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004057 }
4058
4059 apex_key {
4060 name: "myapex.key",
4061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
4064
4065 sh_binary {
4066 name: "myscript",
4067 src: "mylib.cpp",
4068 filename: "myscript.sh",
4069 sub_dir: "script",
4070 }
4071 `)
4072
Sundong Ahnabb64432019-10-22 13:58:29 +09004073 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004074 copyCmds := apexRule.Args["copy_commands"]
4075
4076 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4077}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004078
Jooyung Han91df2082019-11-20 01:49:42 +09004079func TestApexInVariousPartition(t *testing.T) {
4080 testcases := []struct {
4081 propName, parition, flattenedPartition string
4082 }{
4083 {"", "system", "system_ext"},
4084 {"product_specific: true", "product", "product"},
4085 {"soc_specific: true", "vendor", "vendor"},
4086 {"proprietary: true", "vendor", "vendor"},
4087 {"vendor: true", "vendor", "vendor"},
4088 {"system_ext_specific: true", "system_ext", "system_ext"},
4089 }
4090 for _, tc := range testcases {
4091 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004092 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004093 apex {
4094 name: "myapex",
4095 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004096 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004097 `+tc.propName+`
4098 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004099
Jooyung Han91df2082019-11-20 01:49:42 +09004100 apex_key {
4101 name: "myapex.key",
4102 public_key: "testkey.avbpubkey",
4103 private_key: "testkey.pem",
4104 }
4105 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004106
Jooyung Han91df2082019-11-20 01:49:42 +09004107 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004108 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4109 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004110 if actual != expected {
4111 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4112 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004113
Jooyung Han91df2082019-11-20 01:49:42 +09004114 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004115 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4116 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004117 if actual != expected {
4118 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4119 }
4120 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004121 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004122}
Jiyong Park67882562019-03-21 01:11:21 +09004123
Jooyung Han580eb4f2020-06-24 19:33:06 +09004124func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004125 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004129 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004130 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004131
Jooyung Han580eb4f2020-06-24 19:33:06 +09004132 apex_key {
4133 name: "myapex.key",
4134 public_key: "testkey.avbpubkey",
4135 private_key: "testkey.pem",
4136 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004137 `)
4138 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004139 rule := module.Output("file_contexts")
4140 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4141}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004142
Jooyung Han580eb4f2020-06-24 19:33:06 +09004143func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004144 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004145 apex {
4146 name: "myapex",
4147 key: "myapex.key",
4148 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004149 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004150 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004151
Jooyung Han580eb4f2020-06-24 19:33:06 +09004152 apex_key {
4153 name: "myapex.key",
4154 public_key: "testkey.avbpubkey",
4155 private_key: "testkey.pem",
4156 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004157 `, withFiles(map[string][]byte{
4158 "my_own_file_contexts": nil,
4159 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004160}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161
Jooyung Han580eb4f2020-06-24 19:33:06 +09004162func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004163 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004164 apex {
4165 name: "myapex",
4166 key: "myapex.key",
4167 product_specific: true,
4168 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004170 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004171
Jooyung Han580eb4f2020-06-24 19:33:06 +09004172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177 `)
4178
Colin Cross1c460562021-02-16 17:55:47 -08004179 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004180 apex {
4181 name: "myapex",
4182 key: "myapex.key",
4183 product_specific: true,
4184 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004185 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004186 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004187
Jooyung Han580eb4f2020-06-24 19:33:06 +09004188 apex_key {
4189 name: "myapex.key",
4190 public_key: "testkey.avbpubkey",
4191 private_key: "testkey.pem",
4192 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004193 `, withFiles(map[string][]byte{
4194 "product_specific_file_contexts": nil,
4195 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004196 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4197 rule := module.Output("file_contexts")
4198 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4199}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004200
Jooyung Han580eb4f2020-06-24 19:33:06 +09004201func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004202 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
4206 product_specific: true,
4207 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004208 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004209 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004210
Jooyung Han580eb4f2020-06-24 19:33:06 +09004211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004216
Jooyung Han580eb4f2020-06-24 19:33:06 +09004217 filegroup {
4218 name: "my-file-contexts",
4219 srcs: ["product_specific_file_contexts"],
4220 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004221 `, withFiles(map[string][]byte{
4222 "product_specific_file_contexts": nil,
4223 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004224 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4225 rule := module.Output("file_contexts")
4226 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004227}
4228
Jiyong Park67882562019-03-21 01:11:21 +09004229func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004230 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004231 apex_key {
4232 name: "myapex.key",
4233 public_key: ":my.avbpubkey",
4234 private_key: ":my.pem",
4235 product_specific: true,
4236 }
4237
4238 filegroup {
4239 name: "my.avbpubkey",
4240 srcs: ["testkey2.avbpubkey"],
4241 }
4242
4243 filegroup {
4244 name: "my.pem",
4245 srcs: ["testkey2.pem"],
4246 }
4247 `)
4248
4249 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4250 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004251 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004252 if actual_pubkey != expected_pubkey {
4253 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4254 }
4255 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004256 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004257 if actual_privkey != expected_privkey {
4258 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4259 }
4260}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004261
4262func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004263 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004264 prebuilt_apex {
4265 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004266 arch: {
4267 arm64: {
4268 src: "myapex-arm64.apex",
4269 },
4270 arm: {
4271 src: "myapex-arm.apex",
4272 },
4273 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004274 }
4275 `)
4276
4277 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4278
Jiyong Parkc95714e2019-03-29 14:23:10 +09004279 expectedInput := "myapex-arm64.apex"
4280 if prebuilt.inputApex.String() != expectedInput {
4281 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4282 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004283}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004284
4285func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004286 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004287 prebuilt_apex {
4288 name: "myapex",
4289 src: "myapex-arm.apex",
4290 filename: "notmyapex.apex",
4291 }
4292 `)
4293
4294 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4295
4296 expected := "notmyapex.apex"
4297 if p.installFilename != expected {
4298 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4299 }
4300}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004301
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004302func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004303 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004304 prebuilt_apex {
4305 name: "myapex.prebuilt",
4306 src: "myapex-arm.apex",
4307 overrides: [
4308 "myapex",
4309 ],
4310 }
4311 `)
4312
4313 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4314
4315 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004316 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004317 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004318 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004319 }
4320}
4321
Paul Duffin092153d2021-01-26 11:42:39 +00004322// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4323// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004324func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4325 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004326 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004327 }
4328
Paul Duffin89886cb2021-02-05 16:44:03 +00004329 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004330 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004331 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004332 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004333 stem := android.RemoveOptionalPrebuiltPrefix(name)
4334 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004335 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4336 }
4337 }
4338
Paul Duffin39853512021-02-26 11:09:39 +00004339 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004340 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004341 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004342 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4343 }
4344 }
4345
4346 t.Run("prebuilt only", func(t *testing.T) {
4347 bp := `
4348 prebuilt_apex {
4349 name: "myapex",
4350 arch: {
4351 arm64: {
4352 src: "myapex-arm64.apex",
4353 },
4354 arm: {
4355 src: "myapex-arm.apex",
4356 },
4357 },
Paul Duffin39853512021-02-26 11:09:39 +00004358 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004359 }
4360
4361 java_import {
4362 name: "libfoo",
4363 jars: ["libfoo.jar"],
4364 }
Paul Duffin39853512021-02-26 11:09:39 +00004365
4366 java_sdk_library_import {
4367 name: "libbar",
4368 public: {
4369 jars: ["libbar.jar"],
4370 },
4371 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004372 `
4373
4374 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4375 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4376
Paul Duffinf6932af2021-02-26 18:21:56 +00004377 // Make sure that the deapexer has the correct input APEX.
4378 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4379 rule := deapexer.Rule("deapexer")
4380 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4381 t.Errorf("expected: %q, found: %q", expected, actual)
4382 }
4383
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004384 // Make sure that the prebuilt_apex has the correct input APEX.
4385 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4386 rule = prebuiltApex.Rule("android/soong/android.Cp")
4387 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4388 t.Errorf("expected: %q, found: %q", expected, actual)
4389 }
4390
Paul Duffin89886cb2021-02-05 16:44:03 +00004391 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004392
4393 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004394 })
4395
4396 t.Run("prebuilt with source preferred", func(t *testing.T) {
4397
4398 bp := `
4399 prebuilt_apex {
4400 name: "myapex",
4401 arch: {
4402 arm64: {
4403 src: "myapex-arm64.apex",
4404 },
4405 arm: {
4406 src: "myapex-arm.apex",
4407 },
4408 },
Paul Duffin39853512021-02-26 11:09:39 +00004409 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004410 }
4411
4412 java_import {
4413 name: "libfoo",
4414 jars: ["libfoo.jar"],
4415 }
4416
4417 java_library {
4418 name: "libfoo",
4419 }
Paul Duffin39853512021-02-26 11:09:39 +00004420
4421 java_sdk_library_import {
4422 name: "libbar",
4423 public: {
4424 jars: ["libbar.jar"],
4425 },
4426 }
4427
4428 java_sdk_library {
4429 name: "libbar",
4430 srcs: ["foo/bar/MyClass.java"],
4431 unsafe_ignore_missing_latest_api: true,
4432 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004433 `
4434
4435 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4436 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4437
Paul Duffin89886cb2021-02-05 16:44:03 +00004438 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004439 ensureNoSourceVariant(t, ctx, "libfoo")
4440
4441 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4442 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004443 })
4444
4445 t.Run("prebuilt preferred with source", func(t *testing.T) {
4446 bp := `
4447 prebuilt_apex {
4448 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004449 arch: {
4450 arm64: {
4451 src: "myapex-arm64.apex",
4452 },
4453 arm: {
4454 src: "myapex-arm.apex",
4455 },
4456 },
Paul Duffin39853512021-02-26 11:09:39 +00004457 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004458 }
4459
4460 java_import {
4461 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004462 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004463 jars: ["libfoo.jar"],
4464 }
4465
4466 java_library {
4467 name: "libfoo",
4468 }
Paul Duffin39853512021-02-26 11:09:39 +00004469
4470 java_sdk_library_import {
4471 name: "libbar",
4472 prefer: true,
4473 public: {
4474 jars: ["libbar.jar"],
4475 },
4476 }
4477
4478 java_sdk_library {
4479 name: "libbar",
4480 srcs: ["foo/bar/MyClass.java"],
4481 unsafe_ignore_missing_latest_api: true,
4482 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004483 `
4484
4485 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4486 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4487
Paul Duffin89886cb2021-02-05 16:44:03 +00004488 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004489 ensureNoSourceVariant(t, ctx, "libfoo")
4490
4491 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4492 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004493 })
4494}
4495
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004496func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4497 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004498 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004499 }
4500
Paul Duffin37856732021-02-26 14:24:15 +00004501 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4502 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004503 s := ctx.SingletonForTests("dex_bootjars")
4504 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004505 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004506 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004507 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004508 foundLibfooJar = true
4509 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004510 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004511 }
4512 }
4513 if !foundLibfooJar {
Paul Duffin55607122021-03-30 23:32:51 +01004514 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 +00004515 }
4516 }
4517
Paul Duffin4fd997b2021-02-03 20:06:33 +00004518 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004519 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004520 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4521 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4522 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4523 }
4524
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004525 t.Run("prebuilt only", func(t *testing.T) {
4526 bp := `
4527 prebuilt_apex {
4528 name: "myapex",
4529 arch: {
4530 arm64: {
4531 src: "myapex-arm64.apex",
4532 },
4533 arm: {
4534 src: "myapex-arm.apex",
4535 },
4536 },
Paul Duffin37856732021-02-26 14:24:15 +00004537 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004538 }
4539
4540 java_import {
4541 name: "libfoo",
4542 jars: ["libfoo.jar"],
4543 apex_available: ["myapex"],
4544 }
Paul Duffin37856732021-02-26 14:24:15 +00004545
4546 java_sdk_library_import {
4547 name: "libbar",
4548 public: {
4549 jars: ["libbar.jar"],
4550 },
4551 apex_available: ["myapex"],
4552 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004553 `
4554
4555 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin55607122021-03-30 23:32:51 +01004556 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4557 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004558
Paul Duffin9d67ca62021-02-03 20:06:33 +00004559 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4560 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004561.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004562.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4563`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004564 })
4565
4566 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4567 bp := `
4568 prebuilt_apex {
4569 name: "myapex",
4570 arch: {
4571 arm64: {
4572 src: "myapex-arm64.apex",
4573 },
4574 arm: {
4575 src: "myapex-arm.apex",
4576 },
4577 },
Paul Duffin37856732021-02-26 14:24:15 +00004578 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004579 }
4580
4581 java_import {
4582 name: "libfoo",
4583 jars: ["libfoo.jar"],
4584 apex_available: ["myapex"],
4585 }
4586
4587 java_library {
4588 name: "libfoo",
4589 srcs: ["foo/bar/MyClass.java"],
4590 apex_available: ["myapex"],
4591 }
Paul Duffin37856732021-02-26 14:24:15 +00004592
4593 java_sdk_library_import {
4594 name: "libbar",
4595 public: {
4596 jars: ["libbar.jar"],
4597 },
4598 apex_available: ["myapex"],
4599 }
4600
4601 java_sdk_library {
4602 name: "libbar",
4603 srcs: ["foo/bar/MyClass.java"],
4604 unsafe_ignore_missing_latest_api: true,
4605 apex_available: ["myapex"],
4606 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004607 `
4608
4609 // In this test the source (java_library) libfoo is active since the
4610 // prebuilt (java_import) defaults to prefer:false. However the
4611 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4612 // find the dex boot jar in it. We either need to disable the source libfoo
4613 // or make the prebuilt libfoo preferred.
4614 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4615 })
4616
4617 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4618 bp := `
4619 prebuilt_apex {
4620 name: "myapex",
4621 arch: {
4622 arm64: {
4623 src: "myapex-arm64.apex",
4624 },
4625 arm: {
4626 src: "myapex-arm.apex",
4627 },
4628 },
Paul Duffin37856732021-02-26 14:24:15 +00004629 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004630 }
4631
4632 java_import {
4633 name: "libfoo",
4634 prefer: true,
4635 jars: ["libfoo.jar"],
4636 apex_available: ["myapex"],
4637 }
4638
4639 java_library {
4640 name: "libfoo",
4641 srcs: ["foo/bar/MyClass.java"],
4642 apex_available: ["myapex"],
4643 }
Paul Duffin37856732021-02-26 14:24:15 +00004644
4645 java_sdk_library_import {
4646 name: "libbar",
4647 prefer: true,
4648 public: {
4649 jars: ["libbar.jar"],
4650 },
4651 apex_available: ["myapex"],
4652 }
4653
4654 java_sdk_library {
4655 name: "libbar",
4656 srcs: ["foo/bar/MyClass.java"],
4657 unsafe_ignore_missing_latest_api: true,
4658 apex_available: ["myapex"],
4659 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004660 `
4661
4662 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin55607122021-03-30 23:32:51 +01004663 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4664 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004665
Paul Duffin9d67ca62021-02-03 20:06:33 +00004666 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4667 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004668.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004669.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4670`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004671 })
4672
4673 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4674 bp := `
4675 apex {
4676 name: "myapex",
4677 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004678 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004679 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004680 }
4681
4682 apex_key {
4683 name: "myapex.key",
4684 public_key: "testkey.avbpubkey",
4685 private_key: "testkey.pem",
4686 }
4687
4688 prebuilt_apex {
4689 name: "myapex",
4690 arch: {
4691 arm64: {
4692 src: "myapex-arm64.apex",
4693 },
4694 arm: {
4695 src: "myapex-arm.apex",
4696 },
4697 },
Paul Duffin37856732021-02-26 14:24:15 +00004698 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004699 }
4700
4701 java_import {
4702 name: "libfoo",
4703 jars: ["libfoo.jar"],
4704 apex_available: ["myapex"],
4705 }
4706
4707 java_library {
4708 name: "libfoo",
4709 srcs: ["foo/bar/MyClass.java"],
4710 apex_available: ["myapex"],
4711 }
Paul Duffin37856732021-02-26 14:24:15 +00004712
4713 java_sdk_library_import {
4714 name: "libbar",
4715 public: {
4716 jars: ["libbar.jar"],
4717 },
4718 apex_available: ["myapex"],
4719 }
4720
4721 java_sdk_library {
4722 name: "libbar",
4723 srcs: ["foo/bar/MyClass.java"],
4724 unsafe_ignore_missing_latest_api: true,
4725 apex_available: ["myapex"],
4726 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004727 `
4728
4729 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin55607122021-03-30 23:32:51 +01004730 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4731 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004732
4733 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4734 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004735.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004736.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4737`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004738 })
4739
4740 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4741 bp := `
4742 apex {
4743 name: "myapex",
4744 enabled: false,
4745 key: "myapex.key",
4746 java_libs: ["libfoo"],
4747 }
4748
4749 apex_key {
4750 name: "myapex.key",
4751 public_key: "testkey.avbpubkey",
4752 private_key: "testkey.pem",
4753 }
4754
4755 prebuilt_apex {
4756 name: "myapex",
4757 arch: {
4758 arm64: {
4759 src: "myapex-arm64.apex",
4760 },
4761 arm: {
4762 src: "myapex-arm.apex",
4763 },
4764 },
Paul Duffin37856732021-02-26 14:24:15 +00004765 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004766 }
4767
4768 java_import {
4769 name: "libfoo",
4770 prefer: true,
4771 jars: ["libfoo.jar"],
4772 apex_available: ["myapex"],
4773 }
4774
4775 java_library {
4776 name: "libfoo",
4777 srcs: ["foo/bar/MyClass.java"],
4778 apex_available: ["myapex"],
4779 }
Paul Duffin37856732021-02-26 14:24:15 +00004780
4781 java_sdk_library_import {
4782 name: "libbar",
4783 prefer: true,
4784 public: {
4785 jars: ["libbar.jar"],
4786 },
4787 apex_available: ["myapex"],
4788 }
4789
4790 java_sdk_library {
4791 name: "libbar",
4792 srcs: ["foo/bar/MyClass.java"],
4793 unsafe_ignore_missing_latest_api: true,
4794 apex_available: ["myapex"],
4795 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004796 `
4797
4798 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin55607122021-03-30 23:32:51 +01004799 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4800 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004801
Paul Duffin9d67ca62021-02-03 20:06:33 +00004802 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4803 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004804.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004805.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4806`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004807 })
4808}
4809
Roland Levillain630846d2019-06-26 12:48:34 +01004810func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004811 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004812 apex_test {
4813 name: "myapex",
4814 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004815 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004816 tests: [
4817 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004818 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004819 ],
4820 }
4821
4822 apex_key {
4823 name: "myapex.key",
4824 public_key: "testkey.avbpubkey",
4825 private_key: "testkey.pem",
4826 }
4827
Liz Kammer1c14a212020-05-12 15:26:55 -07004828 filegroup {
4829 name: "fg",
4830 srcs: [
4831 "baz",
4832 "bar/baz"
4833 ],
4834 }
4835
Roland Levillain630846d2019-06-26 12:48:34 +01004836 cc_test {
4837 name: "mytest",
4838 gtest: false,
4839 srcs: ["mytest.cpp"],
4840 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004841 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004842 system_shared_libs: [],
4843 static_executable: true,
4844 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004845 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004846 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004847
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004848 cc_library {
4849 name: "mylib",
4850 srcs: ["mylib.cpp"],
4851 system_shared_libs: [],
4852 stl: "none",
4853 }
4854
Liz Kammer5bd365f2020-05-27 15:15:11 -07004855 filegroup {
4856 name: "fg2",
4857 srcs: [
4858 "testdata/baz"
4859 ],
4860 }
4861
Roland Levillain9b5fde92019-06-28 15:41:19 +01004862 cc_test {
4863 name: "mytests",
4864 gtest: false,
4865 srcs: [
4866 "mytest1.cpp",
4867 "mytest2.cpp",
4868 "mytest3.cpp",
4869 ],
4870 test_per_src: true,
4871 relative_install_path: "test",
4872 system_shared_libs: [],
4873 static_executable: true,
4874 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004875 data: [
4876 ":fg",
4877 ":fg2",
4878 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004879 }
Roland Levillain630846d2019-06-26 12:48:34 +01004880 `)
4881
Sundong Ahnabb64432019-10-22 13:58:29 +09004882 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004883 copyCmds := apexRule.Args["copy_commands"]
4884
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004885 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004886 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004887 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004888
Liz Kammer1c14a212020-05-12 15:26:55 -07004889 //Ensure that test data are copied into apex.
4890 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4891 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4892
Roland Levillain9b5fde92019-06-28 15:41:19 +01004893 // Ensure that test deps built with `test_per_src` are copied into apex.
4894 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4895 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4896 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004897
4898 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004899 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004900 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004901 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004902 prefix := "TARGET_"
4903 var builder strings.Builder
4904 data.Custom(&builder, name, prefix, "", data)
4905 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004906 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4907 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4908 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4909 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004910 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004911 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004912 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004913
4914 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004915 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004916 data.Custom(&builder, name, prefix, "", data)
4917 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004918 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4919 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004920}
4921
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004922func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004923 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004924 apex {
4925 name: "myapex",
4926 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004927 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004928 }
4929 apex_key {
4930 name: "myapex.key",
4931 public_key: "testkey.avbpubkey",
4932 private_key: "testkey.pem",
4933 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00004934 `,
4935 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4936 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4937 }),
4938 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004939 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004940 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004941 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004942 var builder strings.Builder
4943 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4944 androidMk := builder.String()
4945 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4946}
4947
Jooyung Hand48f3c32019-08-23 11:18:57 +09004948func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4949 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4950 apex {
4951 name: "myapex",
4952 key: "myapex.key",
4953 native_shared_libs: ["libfoo"],
4954 }
4955
4956 apex_key {
4957 name: "myapex.key",
4958 public_key: "testkey.avbpubkey",
4959 private_key: "testkey.pem",
4960 }
4961
4962 cc_library {
4963 name: "libfoo",
4964 stl: "none",
4965 system_shared_libs: [],
4966 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004967 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004968 }
4969 `)
4970 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4971 apex {
4972 name: "myapex",
4973 key: "myapex.key",
4974 java_libs: ["myjar"],
4975 }
4976
4977 apex_key {
4978 name: "myapex.key",
4979 public_key: "testkey.avbpubkey",
4980 private_key: "testkey.pem",
4981 }
4982
4983 java_library {
4984 name: "myjar",
4985 srcs: ["foo/bar/MyClass.java"],
4986 sdk_version: "none",
4987 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004988 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004989 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004990 }
4991 `)
4992}
4993
Bill Peckhama41a6962021-01-11 10:58:54 -08004994func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004995 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08004996 apex {
4997 name: "myapex",
4998 key: "myapex.key",
4999 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005000 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005001 }
5002
5003 apex_key {
5004 name: "myapex.key",
5005 public_key: "testkey.avbpubkey",
5006 private_key: "testkey.pem",
5007 }
5008
5009 java_import {
5010 name: "myjavaimport",
5011 apex_available: ["myapex"],
5012 jars: ["my.jar"],
5013 compile_dex: true,
5014 }
5015 `)
5016
5017 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5018 apexRule := module.Rule("apexRule")
5019 copyCmds := apexRule.Args["copy_commands"]
5020 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5021}
5022
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005023func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005024 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005025 apex {
5026 name: "myapex",
5027 key: "myapex.key",
5028 apps: [
5029 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005030 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005031 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005032 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005033 }
5034
5035 apex_key {
5036 name: "myapex.key",
5037 public_key: "testkey.avbpubkey",
5038 private_key: "testkey.pem",
5039 }
5040
5041 android_app {
5042 name: "AppFoo",
5043 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005044 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005045 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005046 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005047 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005048 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005049 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005050
5051 android_app {
5052 name: "AppFooPriv",
5053 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005054 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005055 system_modules: "none",
5056 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005057 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005058 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005059 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005060
5061 cc_library_shared {
5062 name: "libjni",
5063 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005064 shared_libs: ["libfoo"],
5065 stl: "none",
5066 system_shared_libs: [],
5067 apex_available: [ "myapex" ],
5068 sdk_version: "current",
5069 }
5070
5071 cc_library_shared {
5072 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005073 stl: "none",
5074 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005075 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005076 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005077 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005078 `)
5079
Sundong Ahnabb64432019-10-22 13:58:29 +09005080 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005081 apexRule := module.Rule("apexRule")
5082 copyCmds := apexRule.Args["copy_commands"]
5083
5084 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005085 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005086
Colin Crossaede88c2020-08-11 12:17:01 -07005087 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005088 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005089 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005090 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005091 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005092 // JNI libraries including transitive deps are
5093 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005094 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005095 // ... embedded inside APK (jnilibs.zip)
5096 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5097 // ... and not directly inside the APEX
5098 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5099 }
Dario Frenicde2a032019-10-27 00:29:22 +01005100}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005101
Dario Frenicde2a032019-10-27 00:29:22 +01005102func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005103 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005104 apex {
5105 name: "myapex",
5106 key: "myapex.key",
5107 apps: [
5108 "AppFooPrebuilt",
5109 "AppFooPrivPrebuilt",
5110 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005111 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005112 }
5113
5114 apex_key {
5115 name: "myapex.key",
5116 public_key: "testkey.avbpubkey",
5117 private_key: "testkey.pem",
5118 }
5119
5120 android_app_import {
5121 name: "AppFooPrebuilt",
5122 apk: "PrebuiltAppFoo.apk",
5123 presigned: true,
5124 dex_preopt: {
5125 enabled: false,
5126 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005127 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005128 }
5129
5130 android_app_import {
5131 name: "AppFooPrivPrebuilt",
5132 apk: "PrebuiltAppFooPriv.apk",
5133 privileged: true,
5134 presigned: true,
5135 dex_preopt: {
5136 enabled: false,
5137 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005138 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005139 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005140 }
5141 `)
5142
Sundong Ahnabb64432019-10-22 13:58:29 +09005143 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005144 apexRule := module.Rule("apexRule")
5145 copyCmds := apexRule.Args["copy_commands"]
5146
5147 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005148 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5149}
5150
5151func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005152 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005153 apex {
5154 name: "myapex",
5155 key: "myapex.key",
5156 apps: [
5157 "AppFoo",
5158 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005159 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005160 }
5161
5162 apex_key {
5163 name: "myapex.key",
5164 public_key: "testkey.avbpubkey",
5165 private_key: "testkey.pem",
5166 }
5167
5168 android_app {
5169 name: "AppFoo",
5170 srcs: ["foo/bar/MyClass.java"],
5171 sdk_version: "none",
5172 system_modules: "none",
5173 apex_available: [ "myapex" ],
5174 }
5175
5176 android_app_import {
5177 name: "AppFoo",
5178 apk: "AppFooPrebuilt.apk",
5179 filename: "AppFooPrebuilt.apk",
5180 presigned: true,
5181 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005182 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005183 }
5184 `, withFiles(map[string][]byte{
5185 "AppFooPrebuilt.apk": nil,
5186 }))
5187
5188 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005189 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005190 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005191}
5192
Dario Freni6f3937c2019-12-20 22:58:03 +00005193func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005194 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005195 apex {
5196 name: "myapex",
5197 key: "myapex.key",
5198 apps: [
5199 "TesterHelpAppFoo",
5200 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005201 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005202 }
5203
5204 apex_key {
5205 name: "myapex.key",
5206 public_key: "testkey.avbpubkey",
5207 private_key: "testkey.pem",
5208 }
5209
5210 android_test_helper_app {
5211 name: "TesterHelpAppFoo",
5212 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005213 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005214 }
5215
5216 `)
5217
5218 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5219 apexRule := module.Rule("apexRule")
5220 copyCmds := apexRule.Args["copy_commands"]
5221
5222 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5223}
5224
Jooyung Han18020ea2019-11-13 10:50:48 +09005225func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5226 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005227 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005228 apex {
5229 name: "myapex",
5230 key: "myapex.key",
5231 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005232 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005233 }
5234
5235 apex_key {
5236 name: "myapex.key",
5237 public_key: "testkey.avbpubkey",
5238 private_key: "testkey.pem",
5239 }
5240
5241 apex {
5242 name: "otherapex",
5243 key: "myapex.key",
5244 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005245 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005246 }
5247
5248 cc_defaults {
5249 name: "libfoo-defaults",
5250 apex_available: ["otherapex"],
5251 }
5252
5253 cc_library {
5254 name: "libfoo",
5255 defaults: ["libfoo-defaults"],
5256 stl: "none",
5257 system_shared_libs: [],
5258 }`)
5259}
5260
Paul Duffine52e66f2020-03-30 17:54:29 +01005261func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005262 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005263 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005264 apex {
5265 name: "myapex",
5266 key: "myapex.key",
5267 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005268 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005269 }
5270
5271 apex_key {
5272 name: "myapex.key",
5273 public_key: "testkey.avbpubkey",
5274 private_key: "testkey.pem",
5275 }
5276
5277 apex {
5278 name: "otherapex",
5279 key: "otherapex.key",
5280 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005281 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005282 }
5283
5284 apex_key {
5285 name: "otherapex.key",
5286 public_key: "testkey.avbpubkey",
5287 private_key: "testkey.pem",
5288 }
5289
5290 cc_library {
5291 name: "libfoo",
5292 stl: "none",
5293 system_shared_libs: [],
5294 apex_available: ["otherapex"],
5295 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005296}
Jiyong Park127b40b2019-09-30 16:04:35 +09005297
Paul Duffine52e66f2020-03-30 17:54:29 +01005298func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005299 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005300 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005301.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005302.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005303.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005304.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005305.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005306.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005307 apex {
5308 name: "myapex",
5309 key: "myapex.key",
5310 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005311 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005312 }
5313
5314 apex_key {
5315 name: "myapex.key",
5316 public_key: "testkey.avbpubkey",
5317 private_key: "testkey.pem",
5318 }
5319
Jiyong Park127b40b2019-09-30 16:04:35 +09005320 cc_library {
5321 name: "libfoo",
5322 stl: "none",
5323 shared_libs: ["libbar"],
5324 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005325 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005326 }
5327
5328 cc_library {
5329 name: "libbar",
5330 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005331 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005332 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005333 apex_available: ["myapex"],
5334 }
5335
5336 cc_library {
5337 name: "libbaz",
5338 stl: "none",
5339 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005340 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005341}
Jiyong Park127b40b2019-09-30 16:04:35 +09005342
Paul Duffine52e66f2020-03-30 17:54:29 +01005343func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005344 testApexError(t, "\"otherapex\" is not a valid module name", `
5345 apex {
5346 name: "myapex",
5347 key: "myapex.key",
5348 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005349 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005350 }
5351
5352 apex_key {
5353 name: "myapex.key",
5354 public_key: "testkey.avbpubkey",
5355 private_key: "testkey.pem",
5356 }
5357
5358 cc_library {
5359 name: "libfoo",
5360 stl: "none",
5361 system_shared_libs: [],
5362 apex_available: ["otherapex"],
5363 }`)
5364
Paul Duffine52e66f2020-03-30 17:54:29 +01005365 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005366 apex {
5367 name: "myapex",
5368 key: "myapex.key",
5369 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005370 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005371 }
5372
5373 apex_key {
5374 name: "myapex.key",
5375 public_key: "testkey.avbpubkey",
5376 private_key: "testkey.pem",
5377 }
5378
5379 cc_library {
5380 name: "libfoo",
5381 stl: "none",
5382 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005383 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005384 apex_available: ["myapex"],
5385 }
5386
5387 cc_library {
5388 name: "libbar",
5389 stl: "none",
5390 system_shared_libs: [],
5391 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005392 }
5393
5394 cc_library {
5395 name: "libbaz",
5396 stl: "none",
5397 system_shared_libs: [],
5398 stubs: {
5399 versions: ["10", "20", "30"],
5400 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005401 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005402}
Jiyong Park127b40b2019-09-30 16:04:35 +09005403
Jiyong Park89e850a2020-04-07 16:37:39 +09005404func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005405 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005409 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005410 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005411 }
5412
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418
5419 cc_library {
5420 name: "libfoo",
5421 stl: "none",
5422 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005423 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005424 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005425 }
5426
5427 cc_library {
5428 name: "libfoo2",
5429 stl: "none",
5430 system_shared_libs: [],
5431 shared_libs: ["libbaz"],
5432 apex_available: ["//apex_available:platform"],
5433 }
5434
5435 cc_library {
5436 name: "libbar",
5437 stl: "none",
5438 system_shared_libs: [],
5439 apex_available: ["myapex"],
5440 }
5441
5442 cc_library {
5443 name: "libbaz",
5444 stl: "none",
5445 system_shared_libs: [],
5446 apex_available: ["myapex"],
5447 stubs: {
5448 versions: ["1"],
5449 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005450 }`)
5451
Jiyong Park89e850a2020-04-07 16:37:39 +09005452 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5453 // because it depends on libbar which isn't available to platform
5454 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5455 if libfoo.NotAvailableForPlatform() != true {
5456 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5457 }
5458
5459 // libfoo2 however can be available to platform because it depends on libbaz which provides
5460 // stubs
5461 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5462 if libfoo2.NotAvailableForPlatform() == true {
5463 t.Errorf("%q should be available to platform", libfoo2.String())
5464 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005465}
Jiyong Parka90ca002019-10-07 15:47:24 +09005466
Paul Duffine52e66f2020-03-30 17:54:29 +01005467func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005468 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005469 apex {
5470 name: "myapex",
5471 key: "myapex.key",
5472 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005473 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005474 }
5475
5476 apex_key {
5477 name: "myapex.key",
5478 public_key: "testkey.avbpubkey",
5479 private_key: "testkey.pem",
5480 }
5481
5482 cc_library {
5483 name: "libfoo",
5484 stl: "none",
5485 system_shared_libs: [],
5486 apex_available: ["myapex"],
5487 static: {
5488 apex_available: ["//apex_available:platform"],
5489 },
5490 }`)
5491
Jiyong Park89e850a2020-04-07 16:37:39 +09005492 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5493 if libfooShared.NotAvailableForPlatform() != true {
5494 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5495 }
5496 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5497 if libfooStatic.NotAvailableForPlatform() != false {
5498 t.Errorf("%q should be available to platform", libfooStatic.String())
5499 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005500}
5501
Jiyong Park5d790c32019-11-15 18:40:32 +09005502func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005503 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005504 apex {
5505 name: "myapex",
5506 key: "myapex.key",
5507 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005508 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005509 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005510 }
5511
5512 override_apex {
5513 name: "override_myapex",
5514 base: "myapex",
5515 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005516 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005517 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005518 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005519 }
5520
5521 apex_key {
5522 name: "myapex.key",
5523 public_key: "testkey.avbpubkey",
5524 private_key: "testkey.pem",
5525 }
5526
5527 android_app {
5528 name: "app",
5529 srcs: ["foo/bar/MyClass.java"],
5530 package_name: "foo",
5531 sdk_version: "none",
5532 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005533 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005534 }
5535
5536 override_android_app {
5537 name: "override_app",
5538 base: "app",
5539 package_name: "bar",
5540 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005541 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005542
Jiyong Park317645e2019-12-05 13:20:58 +09005543 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5544 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5545 if originalVariant.GetOverriddenBy() != "" {
5546 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5547 }
5548 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5549 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5550 }
5551
Jiyong Park5d790c32019-11-15 18:40:32 +09005552 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5553 apexRule := module.Rule("apexRule")
5554 copyCmds := apexRule.Args["copy_commands"]
5555
5556 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005557 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005558
5559 apexBundle := module.Module().(*apexBundle)
5560 name := apexBundle.Name()
5561 if name != "override_myapex" {
5562 t.Errorf("name should be \"override_myapex\", but was %q", name)
5563 }
5564
Baligh Uddin004d7172020-02-19 21:29:28 -08005565 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5566 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5567 }
5568
Jiyong Park20bacab2020-03-03 11:45:41 +09005569 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005570 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005571
Colin Crossaa255532020-07-03 13:18:24 -07005572 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005573 var builder strings.Builder
5574 data.Custom(&builder, name, "TARGET_", "", data)
5575 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005576 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005577 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5578 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005579 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005580 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005581 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005582 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5583 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005584}
5585
Jooyung Han214bf372019-11-12 13:03:50 +09005586func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005587 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005588 apex {
5589 name: "myapex",
5590 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005591 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005592 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005593 }
5594
5595 apex_key {
5596 name: "myapex.key",
5597 public_key: "testkey.avbpubkey",
5598 private_key: "testkey.pem",
5599 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005600
5601 cc_library {
5602 name: "mylib",
5603 srcs: ["mylib.cpp"],
5604 stl: "libc++",
5605 system_shared_libs: [],
5606 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005607 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005608 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005609 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005610
5611 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5612 args := module.Rule("apexRule").Args
5613 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005614 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005615
5616 // The copies of the libraries in the apex should have one more dependency than
5617 // the ones outside the apex, namely the unwinder. Ideally we should check
5618 // the dependency names directly here but for some reason the names are blank in
5619 // this test.
5620 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005621 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005622 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5623 if len(apexImplicits) != len(nonApexImplicits)+1 {
5624 t.Errorf("%q missing unwinder dep", lib)
5625 }
5626 }
Jooyung Han214bf372019-11-12 13:03:50 +09005627}
5628
Paul Duffine05480a2021-03-08 15:07:14 +00005629var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01005630 "api/current.txt": nil,
5631 "api/removed.txt": nil,
5632 "api/system-current.txt": nil,
5633 "api/system-removed.txt": nil,
5634 "api/test-current.txt": nil,
5635 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005636
Anton Hanssondff2c782020-12-21 17:10:01 +00005637 "100/public/api/foo.txt": nil,
5638 "100/public/api/foo-removed.txt": nil,
5639 "100/system/api/foo.txt": nil,
5640 "100/system/api/foo-removed.txt": nil,
5641
Paul Duffineedc5d52020-06-12 17:46:39 +01005642 // For java_sdk_library_import
5643 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005644}
5645
Jooyung Han58f26ab2019-12-18 15:34:32 +09005646func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005647 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005648 apex {
5649 name: "myapex",
5650 key: "myapex.key",
5651 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005652 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005653 }
5654
5655 apex_key {
5656 name: "myapex.key",
5657 public_key: "testkey.avbpubkey",
5658 private_key: "testkey.pem",
5659 }
5660
5661 java_sdk_library {
5662 name: "foo",
5663 srcs: ["a.java"],
5664 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005665 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005666 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005667
5668 prebuilt_apis {
5669 name: "sdk",
5670 api_dirs: ["100"],
5671 }
Paul Duffin9b879592020-05-26 13:21:35 +01005672 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005673
5674 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005675 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005676 "javalib/foo.jar",
5677 "etc/permissions/foo.xml",
5678 })
5679 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005680 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5681 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005682}
5683
Paul Duffin9b879592020-05-26 13:21:35 +01005684func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005685 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005686 apex {
5687 name: "myapex",
5688 key: "myapex.key",
5689 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005690 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005691 }
5692
5693 apex_key {
5694 name: "myapex.key",
5695 public_key: "testkey.avbpubkey",
5696 private_key: "testkey.pem",
5697 }
5698
5699 java_sdk_library {
5700 name: "foo",
5701 srcs: ["a.java"],
5702 api_packages: ["foo"],
5703 apex_available: ["myapex"],
5704 sdk_version: "none",
5705 system_modules: "none",
5706 }
5707
5708 java_library {
5709 name: "bar",
5710 srcs: ["a.java"],
5711 libs: ["foo"],
5712 apex_available: ["myapex"],
5713 sdk_version: "none",
5714 system_modules: "none",
5715 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005716
5717 prebuilt_apis {
5718 name: "sdk",
5719 api_dirs: ["100"],
5720 }
Paul Duffin9b879592020-05-26 13:21:35 +01005721 `, withFiles(filesForSdkLibrary))
5722
5723 // java_sdk_library installs both impl jar and permission XML
5724 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5725 "javalib/bar.jar",
5726 "javalib/foo.jar",
5727 "etc/permissions/foo.xml",
5728 })
5729
5730 // The bar library should depend on the implementation jar.
5731 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01005732 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01005733 t.Errorf("expected %q, found %#q", expected, actual)
5734 }
5735}
5736
5737func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005738 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005739 apex {
5740 name: "myapex",
5741 key: "myapex.key",
5742 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005743 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005744 }
5745
5746 apex_key {
5747 name: "myapex.key",
5748 public_key: "testkey.avbpubkey",
5749 private_key: "testkey.pem",
5750 }
5751
5752 java_sdk_library {
5753 name: "foo",
5754 srcs: ["a.java"],
5755 api_packages: ["foo"],
5756 apex_available: ["myapex"],
5757 sdk_version: "none",
5758 system_modules: "none",
5759 }
5760
5761 java_library {
5762 name: "bar",
5763 srcs: ["a.java"],
5764 libs: ["foo"],
5765 sdk_version: "none",
5766 system_modules: "none",
5767 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005768
5769 prebuilt_apis {
5770 name: "sdk",
5771 api_dirs: ["100"],
5772 }
Paul Duffin9b879592020-05-26 13:21:35 +01005773 `, withFiles(filesForSdkLibrary))
5774
5775 // java_sdk_library installs both impl jar and permission XML
5776 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5777 "javalib/foo.jar",
5778 "etc/permissions/foo.xml",
5779 })
5780
5781 // The bar library should depend on the stubs jar.
5782 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01005783 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01005784 t.Errorf("expected %q, found %#q", expected, actual)
5785 }
5786}
5787
Paul Duffineedc5d52020-06-12 17:46:39 +01005788func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005789 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005790 prebuilt_apis {
5791 name: "sdk",
5792 api_dirs: ["100"],
5793 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005794 withFiles(map[string][]byte{
5795 "apex/a.java": nil,
5796 "apex/apex_manifest.json": nil,
5797 "apex/Android.bp": []byte(`
5798 package {
5799 default_visibility: ["//visibility:private"],
5800 }
5801
5802 apex {
5803 name: "myapex",
5804 key: "myapex.key",
5805 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005806 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005807 }
5808
5809 apex_key {
5810 name: "myapex.key",
5811 public_key: "testkey.avbpubkey",
5812 private_key: "testkey.pem",
5813 }
5814
5815 java_library {
5816 name: "bar",
5817 srcs: ["a.java"],
5818 libs: ["foo"],
5819 apex_available: ["myapex"],
5820 sdk_version: "none",
5821 system_modules: "none",
5822 }
5823`),
5824 "source/a.java": nil,
5825 "source/api/current.txt": nil,
5826 "source/api/removed.txt": nil,
5827 "source/Android.bp": []byte(`
5828 package {
5829 default_visibility: ["//visibility:private"],
5830 }
5831
5832 java_sdk_library {
5833 name: "foo",
5834 visibility: ["//apex"],
5835 srcs: ["a.java"],
5836 api_packages: ["foo"],
5837 apex_available: ["myapex"],
5838 sdk_version: "none",
5839 system_modules: "none",
5840 public: {
5841 enabled: true,
5842 },
5843 }
5844`),
5845 "prebuilt/a.jar": nil,
5846 "prebuilt/Android.bp": []byte(`
5847 package {
5848 default_visibility: ["//visibility:private"],
5849 }
5850
5851 java_sdk_library_import {
5852 name: "foo",
5853 visibility: ["//apex", "//source"],
5854 apex_available: ["myapex"],
5855 prefer: true,
5856 public: {
5857 jars: ["a.jar"],
5858 },
5859 }
5860`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005861 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005862 )
5863
5864 // java_sdk_library installs both impl jar and permission XML
5865 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5866 "javalib/bar.jar",
5867 "javalib/foo.jar",
5868 "etc/permissions/foo.xml",
5869 })
5870
5871 // The bar library should depend on the implementation jar.
5872 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01005873 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01005874 t.Errorf("expected %q, found %#q", expected, actual)
5875 }
5876}
5877
5878func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5879 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5880 apex {
5881 name: "myapex",
5882 key: "myapex.key",
5883 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005884 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005885 }
5886
5887 apex_key {
5888 name: "myapex.key",
5889 public_key: "testkey.avbpubkey",
5890 private_key: "testkey.pem",
5891 }
5892
5893 java_sdk_library_import {
5894 name: "foo",
5895 apex_available: ["myapex"],
5896 prefer: true,
5897 public: {
5898 jars: ["a.jar"],
5899 },
5900 }
5901
5902 `, withFiles(filesForSdkLibrary))
5903}
5904
atrost6e126252020-01-27 17:01:16 +00005905func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01005906 result := android.GroupFixturePreparers(
5907 prepareForApexTest,
5908 java.PrepareForTestWithPlatformCompatConfig,
5909 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00005910 apex {
5911 name: "myapex",
5912 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00005913 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00005914 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005915 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005916 }
5917
5918 apex_key {
5919 name: "myapex.key",
5920 public_key: "testkey.avbpubkey",
5921 private_key: "testkey.pem",
5922 }
5923
5924 platform_compat_config {
5925 name: "myjar-platform-compat-config",
5926 src: ":myjar",
5927 }
5928
5929 java_library {
5930 name: "myjar",
5931 srcs: ["foo/bar/MyClass.java"],
5932 sdk_version: "none",
5933 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005934 apex_available: [ "myapex" ],
5935 }
Paul Duffin1b29e002021-03-16 15:06:54 +00005936
5937 // Make sure that a preferred prebuilt does not affect the apex contents.
5938 prebuilt_platform_compat_config {
5939 name: "myjar-platform-compat-config",
5940 metadata: "compat-config/metadata.xml",
5941 prefer: true,
5942 }
atrost6e126252020-01-27 17:01:16 +00005943 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00005944 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00005945 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5946 "etc/compatconfig/myjar-platform-compat-config.xml",
5947 "javalib/myjar.jar",
5948 })
5949}
5950
Jiyong Park479321d2019-12-16 11:47:12 +09005951func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5952 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5953 apex {
5954 name: "myapex",
5955 key: "myapex.key",
5956 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005957 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005958 }
5959
5960 apex_key {
5961 name: "myapex.key",
5962 public_key: "testkey.avbpubkey",
5963 private_key: "testkey.pem",
5964 }
5965
5966 java_library {
5967 name: "myjar",
5968 srcs: ["foo/bar/MyClass.java"],
5969 sdk_version: "none",
5970 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005971 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005972 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005973 }
5974 `)
5975}
5976
Jiyong Park7afd1072019-12-30 16:56:33 +09005977func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005978 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005979 apex {
5980 name: "myapex",
5981 key: "myapex.key",
5982 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005983 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005984 }
5985
5986 apex_key {
5987 name: "myapex.key",
5988 public_key: "testkey.avbpubkey",
5989 private_key: "testkey.pem",
5990 }
5991
5992 cc_library {
5993 name: "mylib",
5994 srcs: ["mylib.cpp"],
5995 system_shared_libs: [],
5996 stl: "none",
5997 required: ["a", "b"],
5998 host_required: ["c", "d"],
5999 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006000 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006001 }
6002 `)
6003
6004 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006005 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006006 name := apexBundle.BaseModuleName()
6007 prefix := "TARGET_"
6008 var builder strings.Builder
6009 data.Custom(&builder, name, prefix, "", data)
6010 androidMk := builder.String()
6011 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6012 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6013 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6014}
6015
Jiyong Park7cd10e32020-01-14 09:22:18 +09006016func TestSymlinksFromApexToSystem(t *testing.T) {
6017 bp := `
6018 apex {
6019 name: "myapex",
6020 key: "myapex.key",
6021 native_shared_libs: ["mylib"],
6022 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006023 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006024 }
6025
Jiyong Park9d677202020-02-19 16:29:35 +09006026 apex {
6027 name: "myapex.updatable",
6028 key: "myapex.key",
6029 native_shared_libs: ["mylib"],
6030 java_libs: ["myjar"],
6031 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006032 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006033 }
6034
Jiyong Park7cd10e32020-01-14 09:22:18 +09006035 apex_key {
6036 name: "myapex.key",
6037 public_key: "testkey.avbpubkey",
6038 private_key: "testkey.pem",
6039 }
6040
6041 cc_library {
6042 name: "mylib",
6043 srcs: ["mylib.cpp"],
6044 shared_libs: ["myotherlib"],
6045 system_shared_libs: [],
6046 stl: "none",
6047 apex_available: [
6048 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006049 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006050 "//apex_available:platform",
6051 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006052 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006053 }
6054
6055 cc_library {
6056 name: "myotherlib",
6057 srcs: ["mylib.cpp"],
6058 system_shared_libs: [],
6059 stl: "none",
6060 apex_available: [
6061 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006062 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006063 "//apex_available:platform",
6064 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006065 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006066 }
6067
6068 java_library {
6069 name: "myjar",
6070 srcs: ["foo/bar/MyClass.java"],
6071 sdk_version: "none",
6072 system_modules: "none",
6073 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006074 apex_available: [
6075 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006076 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006077 "//apex_available:platform",
6078 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006079 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006080 }
6081
6082 java_library {
6083 name: "myotherjar",
6084 srcs: ["foo/bar/MyClass.java"],
6085 sdk_version: "none",
6086 system_modules: "none",
6087 apex_available: [
6088 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006089 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006090 "//apex_available:platform",
6091 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006092 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006093 }
6094 `
6095
6096 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6097 for _, f := range files {
6098 if f.path == file {
6099 if f.isLink {
6100 t.Errorf("%q is not a real file", file)
6101 }
6102 return
6103 }
6104 }
6105 t.Errorf("%q is not found", file)
6106 }
6107
6108 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6109 for _, f := range files {
6110 if f.path == file {
6111 if !f.isLink {
6112 t.Errorf("%q is not a symlink", file)
6113 }
6114 return
6115 }
6116 }
6117 t.Errorf("%q is not found", file)
6118 }
6119
Jiyong Park9d677202020-02-19 16:29:35 +09006120 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6121 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006123 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006124 ensureRealfileExists(t, files, "javalib/myjar.jar")
6125 ensureRealfileExists(t, files, "lib64/mylib.so")
6126 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6127
Jiyong Park9d677202020-02-19 16:29:35 +09006128 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6129 ensureRealfileExists(t, files, "javalib/myjar.jar")
6130 ensureRealfileExists(t, files, "lib64/mylib.so")
6131 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6132
6133 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006134 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006135 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006136 ensureRealfileExists(t, files, "javalib/myjar.jar")
6137 ensureRealfileExists(t, files, "lib64/mylib.so")
6138 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006139
6140 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6141 ensureRealfileExists(t, files, "javalib/myjar.jar")
6142 ensureRealfileExists(t, files, "lib64/mylib.so")
6143 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006144}
6145
Yo Chiange8128052020-07-23 20:09:18 +08006146func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006147 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006148 apex {
6149 name: "myapex",
6150 key: "myapex.key",
6151 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006152 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006153 }
6154
6155 apex_key {
6156 name: "myapex.key",
6157 public_key: "testkey.avbpubkey",
6158 private_key: "testkey.pem",
6159 }
6160
6161 cc_library_shared {
6162 name: "mylib",
6163 srcs: ["mylib.cpp"],
6164 shared_libs: ["myotherlib"],
6165 system_shared_libs: [],
6166 stl: "none",
6167 apex_available: [
6168 "myapex",
6169 "//apex_available:platform",
6170 ],
6171 }
6172
6173 cc_prebuilt_library_shared {
6174 name: "myotherlib",
6175 srcs: ["prebuilt.so"],
6176 system_shared_libs: [],
6177 stl: "none",
6178 apex_available: [
6179 "myapex",
6180 "//apex_available:platform",
6181 ],
6182 }
6183 `)
6184
6185 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006186 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006187 var builder strings.Builder
6188 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6189 androidMk := builder.String()
6190 // `myotherlib` is added to `myapex` as symlink
6191 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6192 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6193 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6194 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006195 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 +08006196}
6197
Jooyung Han643adc42020-02-27 13:50:06 +09006198func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006199 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006200 apex {
6201 name: "myapex",
6202 key: "myapex.key",
6203 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006205 }
6206
6207 apex_key {
6208 name: "myapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 cc_library {
6214 name: "mylib",
6215 srcs: ["mylib.cpp"],
6216 shared_libs: ["mylib2"],
6217 system_shared_libs: [],
6218 stl: "none",
6219 apex_available: [ "myapex" ],
6220 }
6221
6222 cc_library {
6223 name: "mylib2",
6224 srcs: ["mylib.cpp"],
6225 system_shared_libs: [],
6226 stl: "none",
6227 apex_available: [ "myapex" ],
6228 }
6229 `)
6230
6231 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6232 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6233 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6234 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6235 "lib64/mylib.so",
6236 "lib64/mylib2.so",
6237 })
6238}
6239
Jooyung Han49f67012020-04-17 13:43:10 +09006240func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006241 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006242 apex {
6243 name: "myapex",
6244 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006245 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006246 }
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006252 `,
6253 android.FixtureModifyConfig(func(config android.Config) {
6254 delete(config.Targets, android.Android)
6255 config.AndroidCommonTarget = android.Target{}
6256 }),
6257 )
Jooyung Han49f67012020-04-17 13:43:10 +09006258
6259 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6260 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6261 }
6262}
6263
Jiyong Parkbd159612020-02-28 15:22:21 +09006264func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006265 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006266 apex {
6267 name: "myapex",
6268 key: "myapex.key",
6269 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006270 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006271 }
6272
6273 apex_key {
6274 name: "myapex.key",
6275 public_key: "testkey.avbpubkey",
6276 private_key: "testkey.pem",
6277 }
6278
6279 android_app {
6280 name: "AppFoo",
6281 srcs: ["foo/bar/MyClass.java"],
6282 sdk_version: "none",
6283 system_modules: "none",
6284 apex_available: [ "myapex" ],
6285 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006286 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006287
Colin Crosscf371cc2020-11-13 11:48:42 -08006288 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006289 content := bundleConfigRule.Args["content"]
6290
6291 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006292 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 +09006293}
6294
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006295func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006296 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006297 apex {
6298 name: "myapex",
6299 key: "myapex.key",
6300 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006301 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006302 }
6303
6304 apex_key {
6305 name: "myapex.key",
6306 public_key: "testkey.avbpubkey",
6307 private_key: "testkey.pem",
6308 }
6309
6310 android_app_set {
6311 name: "AppSet",
6312 set: "AppSet.apks",
6313 }`)
6314 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006315 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006316 content := bundleConfigRule.Args["content"]
6317 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6318 s := mod.Rule("apexRule").Args["copy_commands"]
6319 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6320 if len(copyCmds) != 3 {
6321 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6322 }
6323 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6324 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6325 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6326}
6327
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006328func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006329 ctx := testApex(t, "", android.FixtureModifyMockFS(func(fs android.MockFS) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006330 bp := `
6331 apex_set {
6332 name: "myapex",
6333 filename: "foo_v2.apex",
6334 sanitized: {
6335 none: { set: "myapex.apks", },
6336 hwaddress: { set: "myapex.hwasan.apks", },
6337 },
6338 }`
6339 fs["Android.bp"] = []byte(bp)
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006340 }),
6341 prepareForTestWithSantitizeHwaddress,
6342 )
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006343
6344 m := ctx.ModuleForTests("myapex", "android_common")
Paul Duffin37ba3442021-03-29 00:21:08 +01006345 extractedApex := m.Output("out/soong/.intermediates/myapex/android_common/foo_v2.apex")
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006346
6347 actual := extractedApex.Inputs
6348 if len(actual) != 1 {
6349 t.Errorf("expected a single input")
6350 }
6351
6352 expected := "myapex.hwasan.apks"
6353 if actual[0].String() != expected {
6354 t.Errorf("expected %s, got %s", expected, actual[0].String())
6355 }
6356}
6357
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006358func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006359 t.Helper()
6360
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006361 bp := `
6362 java_library {
6363 name: "some-updatable-apex-lib",
6364 srcs: ["a.java"],
6365 sdk_version: "current",
6366 apex_available: [
6367 "some-updatable-apex",
6368 ],
6369 }
6370
6371 java_library {
6372 name: "some-non-updatable-apex-lib",
6373 srcs: ["a.java"],
6374 apex_available: [
6375 "some-non-updatable-apex",
6376 ],
6377 }
6378
6379 java_library {
6380 name: "some-platform-lib",
6381 srcs: ["a.java"],
6382 sdk_version: "current",
6383 installable: true,
6384 }
6385
6386 java_library {
6387 name: "some-art-lib",
6388 srcs: ["a.java"],
6389 sdk_version: "current",
6390 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006391 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006392 ],
6393 hostdex: true,
6394 }
6395
6396 apex {
6397 name: "some-updatable-apex",
6398 key: "some-updatable-apex.key",
6399 java_libs: ["some-updatable-apex-lib"],
6400 updatable: true,
6401 min_sdk_version: "current",
6402 }
6403
6404 apex {
6405 name: "some-non-updatable-apex",
6406 key: "some-non-updatable-apex.key",
6407 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006408 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006409 }
6410
6411 apex_key {
6412 name: "some-updatable-apex.key",
6413 }
6414
6415 apex_key {
6416 name: "some-non-updatable-apex.key",
6417 }
6418
6419 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006420 name: "com.android.art.debug",
6421 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006422 java_libs: ["some-art-lib"],
6423 updatable: true,
6424 min_sdk_version: "current",
6425 }
6426
6427 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006428 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006429 }
6430
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006431 filegroup {
6432 name: "some-updatable-apex-file_contexts",
6433 srcs: [
6434 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6435 ],
6436 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006437
6438 filegroup {
6439 name: "some-non-updatable-apex-file_contexts",
6440 srcs: [
6441 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6442 ],
6443 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006444 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006445
6446 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6447}
6448
Paul Duffin064b70c2020-11-02 17:32:38 +00006449func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006450 t.Helper()
6451
Paul Duffin55607122021-03-30 23:32:51 +01006452 fs := android.MockFS{
6453 "a.java": nil,
6454 "a.jar": nil,
6455 "apex_manifest.json": nil,
6456 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006457 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006458 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6459 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6460 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006461 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006462 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006463
Paul Duffin55607122021-03-30 23:32:51 +01006464 errorHandler := android.FixtureExpectsNoErrors
6465 if errmsg != "" {
6466 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006467 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006468
Paul Duffin55607122021-03-30 23:32:51 +01006469 result := android.GroupFixturePreparers(
6470 cc.PrepareForTestWithCcDefaultModules,
6471 java.PrepareForTestWithHiddenApiBuildComponents,
6472 java.PrepareForTestWithJavaDefaultModules,
6473 java.PrepareForTestWithJavaSdkLibraryFiles,
6474 PrepareForTestWithApexBuildComponents,
6475 android.FixtureModifyConfig(func(config android.Config) {
6476 pathCtx := android.PathContextForTesting(config)
6477 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6478 transformDexpreoptConfig(dexpreoptConfig)
6479 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6480
6481 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
6482 // product variables.
6483 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6484 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6485 }),
6486 fs.AddToFixture(),
6487 ).
6488 ExtendWithErrorHandler(errorHandler).
6489 RunTestWithBp(t, bp)
6490
6491 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006492}
6493
Jooyung Han548640b2020-04-27 12:10:30 +09006494func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6495 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6496 apex {
6497 name: "myapex",
6498 key: "myapex.key",
6499 updatable: true,
6500 }
6501
6502 apex_key {
6503 name: "myapex.key",
6504 public_key: "testkey.avbpubkey",
6505 private_key: "testkey.pem",
6506 }
6507 `)
6508}
6509
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006510func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6511 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6512 apex {
6513 name: "myapex",
6514 key: "myapex.key",
6515 }
6516
6517 apex_key {
6518 name: "myapex.key",
6519 public_key: "testkey.avbpubkey",
6520 private_key: "testkey.pem",
6521 }
6522 `)
6523}
6524
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006525func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006526 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006527 var transform func(*dexpreopt.GlobalConfig)
6528
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006529 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6530 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006531 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006532 }
6533 testNoUpdatableJarsInBootImage(t, "", transform)
6534 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006535
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006536 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006537 err = `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006538 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006539 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006540 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006541 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006542 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006543
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006544 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006545 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006546 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006547 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006548 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006549 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006550 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006551
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006552 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006553 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006554 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006555 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006556 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006557 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006558 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006559
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006560 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006561 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006562 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006563 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006564 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006565 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006566 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006567
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006568 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6569 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006570 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006571 }
6572 testNoUpdatableJarsInBootImage(t, "", transform)
6573 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006574
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006575 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006576 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006577 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006578 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006579 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006580 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006581 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006582
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006583 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006584 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006585 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006586 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006587 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006588 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006589 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006590
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006591 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006592 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006593 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006594 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006595 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006596 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006597 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006598
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006599 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6600 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006601 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006602 }
6603 testNoUpdatableJarsInBootImage(t, "", transform)
6604 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006605
6606}
6607
6608func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6609 transform := func(config *dexpreopt.GlobalConfig) {
6610 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6611 }
6612 t.Run("prebuilt no source", func(t *testing.T) {
6613 testDexpreoptWithApexes(t, `
6614 prebuilt_apex {
6615 name: "myapex" ,
6616 arch: {
6617 arm64: {
6618 src: "myapex-arm64.apex",
6619 },
6620 arm: {
6621 src: "myapex-arm.apex",
6622 },
6623 },
6624 exported_java_libs: ["libfoo"],
6625 }
6626
6627 java_import {
6628 name: "libfoo",
6629 jars: ["libfoo.jar"],
6630 }
6631`, "", transform)
6632 })
6633
6634 t.Run("prebuilt no source", func(t *testing.T) {
6635 testDexpreoptWithApexes(t, `
6636 prebuilt_apex {
6637 name: "myapex" ,
6638 arch: {
6639 arm64: {
6640 src: "myapex-arm64.apex",
6641 },
6642 arm: {
6643 src: "myapex-arm.apex",
6644 },
6645 },
6646 exported_java_libs: ["libfoo"],
6647 }
6648
6649 java_import {
6650 name: "libfoo",
6651 jars: ["libfoo.jar"],
6652 }
6653`, "", transform)
6654 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006655}
6656
Andrei Onea115e7e72020-06-05 21:14:03 +01006657func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6658 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006659 bp += `
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }`
Paul Duffin45338f02021-03-30 23:07:52 +01006665 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01006666 "lib1/src/A.java": nil,
6667 "lib2/src/B.java": nil,
6668 "system/sepolicy/apex/myapex-file_contexts": nil,
6669 }
6670
Paul Duffin45338f02021-03-30 23:07:52 +01006671 errorHandler := android.FixtureExpectsNoErrors
6672 if errmsg != "" {
6673 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07006674 }
Colin Crossae8600b2020-10-29 17:09:13 -07006675
Paul Duffin45338f02021-03-30 23:07:52 +01006676 android.GroupFixturePreparers(
6677 android.PrepareForTestWithAndroidBuildComponents,
6678 java.PrepareForTestWithJavaBuildComponents,
6679 PrepareForTestWithApexBuildComponents,
6680 android.PrepareForTestWithNeverallowRules(rules),
6681 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6682 updatableBootJars := make([]string, 0, len(apexBootJars))
6683 for _, apexBootJar := range apexBootJars {
6684 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6685 }
6686 variables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6687 }),
6688 fs.AddToFixture(),
6689 ).
6690 ExtendWithErrorHandler(errorHandler).
6691 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01006692}
6693
6694func TestApexPermittedPackagesRules(t *testing.T) {
6695 testcases := []struct {
6696 name string
6697 expectedError string
6698 bp string
6699 bootJars []string
6700 modulesPackages map[string][]string
6701 }{
6702
6703 {
6704 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6705 expectedError: "",
6706 bp: `
6707 java_library {
6708 name: "bcp_lib1",
6709 srcs: ["lib1/src/*.java"],
6710 permitted_packages: ["foo.bar"],
6711 apex_available: ["myapex"],
6712 sdk_version: "none",
6713 system_modules: "none",
6714 }
6715 java_library {
6716 name: "nonbcp_lib2",
6717 srcs: ["lib2/src/*.java"],
6718 apex_available: ["myapex"],
6719 permitted_packages: ["a.b"],
6720 sdk_version: "none",
6721 system_modules: "none",
6722 }
6723 apex {
6724 name: "myapex",
6725 key: "myapex.key",
6726 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006727 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006728 }`,
6729 bootJars: []string{"bcp_lib1"},
6730 modulesPackages: map[string][]string{
6731 "myapex": []string{
6732 "foo.bar",
6733 },
6734 },
6735 },
6736 {
6737 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6738 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.`,
6739 bp: `
6740 java_library {
6741 name: "bcp_lib1",
6742 srcs: ["lib1/src/*.java"],
6743 apex_available: ["myapex"],
6744 permitted_packages: ["foo.bar"],
6745 sdk_version: "none",
6746 system_modules: "none",
6747 }
6748 java_library {
6749 name: "bcp_lib2",
6750 srcs: ["lib2/src/*.java"],
6751 apex_available: ["myapex"],
6752 permitted_packages: ["foo.bar", "bar.baz"],
6753 sdk_version: "none",
6754 system_modules: "none",
6755 }
6756 apex {
6757 name: "myapex",
6758 key: "myapex.key",
6759 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006760 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006761 }
6762 `,
6763 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6764 modulesPackages: map[string][]string{
6765 "myapex": []string{
6766 "foo.bar",
6767 },
6768 },
6769 },
6770 }
6771 for _, tc := range testcases {
6772 t.Run(tc.name, func(t *testing.T) {
6773 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6774 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6775 })
6776 }
6777}
6778
Jiyong Park62304bb2020-04-13 16:19:48 +09006779func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006780 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006781 apex {
6782 name: "myapex",
6783 key: "myapex.key",
6784 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006785 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006786 }
6787
6788 apex_key {
6789 name: "myapex.key",
6790 public_key: "testkey.avbpubkey",
6791 private_key: "testkey.pem",
6792 }
6793
6794 cc_library {
6795 name: "mylib",
6796 srcs: ["mylib.cpp"],
6797 system_shared_libs: [],
6798 stl: "none",
6799 stubs: {
6800 versions: ["1"],
6801 },
6802 apex_available: ["myapex"],
6803 }
6804
6805 cc_library {
6806 name: "myprivlib",
6807 srcs: ["mylib.cpp"],
6808 system_shared_libs: [],
6809 stl: "none",
6810 apex_available: ["myapex"],
6811 }
6812
6813
6814 cc_test {
6815 name: "mytest",
6816 gtest: false,
6817 srcs: ["mylib.cpp"],
6818 system_shared_libs: [],
6819 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006820 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006821 test_for: ["myapex"]
6822 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006823
6824 cc_library {
6825 name: "mytestlib",
6826 srcs: ["mylib.cpp"],
6827 system_shared_libs: [],
6828 shared_libs: ["mylib", "myprivlib"],
6829 stl: "none",
6830 test_for: ["myapex"],
6831 }
6832
6833 cc_benchmark {
6834 name: "mybench",
6835 srcs: ["mylib.cpp"],
6836 system_shared_libs: [],
6837 shared_libs: ["mylib", "myprivlib"],
6838 stl: "none",
6839 test_for: ["myapex"],
6840 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006841 `)
6842
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006843 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01006844 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006845 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
6846 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
6847 }
6848
6849 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09006850 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006851 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
6852 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
6853 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
6854}
Jiyong Park46a512f2020-12-04 18:02:13 +09006855
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006856func TestIndirectTestFor(t *testing.T) {
6857 ctx := testApex(t, `
6858 apex {
6859 name: "myapex",
6860 key: "myapex.key",
6861 native_shared_libs: ["mylib", "myprivlib"],
6862 updatable: false,
6863 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006864
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006865 apex_key {
6866 name: "myapex.key",
6867 public_key: "testkey.avbpubkey",
6868 private_key: "testkey.pem",
6869 }
6870
6871 cc_library {
6872 name: "mylib",
6873 srcs: ["mylib.cpp"],
6874 system_shared_libs: [],
6875 stl: "none",
6876 stubs: {
6877 versions: ["1"],
6878 },
6879 apex_available: ["myapex"],
6880 }
6881
6882 cc_library {
6883 name: "myprivlib",
6884 srcs: ["mylib.cpp"],
6885 system_shared_libs: [],
6886 stl: "none",
6887 shared_libs: ["mylib"],
6888 apex_available: ["myapex"],
6889 }
6890
6891 cc_library {
6892 name: "mytestlib",
6893 srcs: ["mylib.cpp"],
6894 system_shared_libs: [],
6895 shared_libs: ["myprivlib"],
6896 stl: "none",
6897 test_for: ["myapex"],
6898 }
6899 `)
6900
6901 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01006902 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00006903 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
6904 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
6905 }
6906
6907 // The platform variant of mytestlib links to the platform variant of the
6908 // internal myprivlib.
6909 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
6910
6911 // The platform variant of myprivlib links to the platform variant of mylib
6912 // and bypasses its stubs.
6913 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 +09006914}
6915
Martin Stjernholm4d058c82021-03-27 15:18:31 +00006916func TestTestForForLibInOtherApex(t *testing.T) {
6917 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
6918 _ = testApex(t, `
6919 apex {
6920 name: "com.android.art",
6921 key: "myapex.key",
6922 native_shared_libs: ["mylib"],
6923 updatable: false,
6924 }
6925
6926 apex {
6927 name: "com.android.art.debug",
6928 key: "myapex.key",
6929 native_shared_libs: ["mylib", "mytestlib"],
6930 updatable: false,
6931 }
6932
6933 apex_key {
6934 name: "myapex.key",
6935 public_key: "testkey.avbpubkey",
6936 private_key: "testkey.pem",
6937 }
6938
6939 cc_library {
6940 name: "mylib",
6941 srcs: ["mylib.cpp"],
6942 system_shared_libs: [],
6943 stl: "none",
6944 stubs: {
6945 versions: ["1"],
6946 },
6947 apex_available: ["com.android.art", "com.android.art.debug"],
6948 }
6949
6950 cc_library {
6951 name: "mytestlib",
6952 srcs: ["mylib.cpp"],
6953 system_shared_libs: [],
6954 shared_libs: ["mylib"],
6955 stl: "none",
6956 apex_available: ["com.android.art.debug"],
6957 test_for: ["com.android.art"],
6958 }
6959 `,
6960 android.MockFS{
6961 "system/sepolicy/apex/com.android.art-file_contexts": nil,
6962 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
6963 }.AddToFixture())
6964}
6965
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006966// TODO(jungjw): Move this to proptools
6967func intPtr(i int) *int {
6968 return &i
6969}
6970
6971func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006972 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006973 apex_set {
6974 name: "myapex",
6975 set: "myapex.apks",
6976 filename: "foo_v2.apex",
6977 overrides: ["foo"],
6978 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006979 `,
6980 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6981 variables.Platform_sdk_version = intPtr(30)
6982 }),
6983 android.FixtureModifyConfig(func(config android.Config) {
6984 config.Targets[android.Android] = []android.Target{
6985 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6986 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6987 }
6988 }),
6989 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006990
6991 m := ctx.ModuleForTests("myapex", "android_common")
6992
6993 // Check extract_apks tool parameters.
Paul Duffin37ba3442021-03-29 00:21:08 +01006994 extractedApex := m.Output("out/soong/.intermediates/myapex/android_common/foo_v2.apex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006995 actual := extractedApex.Args["abis"]
6996 expected := "ARMEABI_V7A,ARM64_V8A"
6997 if actual != expected {
6998 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6999 }
7000 actual = extractedApex.Args["sdk-version"]
7001 expected = "30"
7002 if actual != expected {
7003 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7004 }
7005
7006 a := m.Module().(*ApexSet)
7007 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007008 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007009 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7010 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7011 }
7012}
7013
Jiyong Park7d95a512020-05-10 15:16:24 +09007014func TestNoStaticLinkingToStubsLib(t *testing.T) {
7015 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7016 apex {
7017 name: "myapex",
7018 key: "myapex.key",
7019 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007020 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007021 }
7022
7023 apex_key {
7024 name: "myapex.key",
7025 public_key: "testkey.avbpubkey",
7026 private_key: "testkey.pem",
7027 }
7028
7029 cc_library {
7030 name: "mylib",
7031 srcs: ["mylib.cpp"],
7032 static_libs: ["otherlib"],
7033 system_shared_libs: [],
7034 stl: "none",
7035 apex_available: [ "myapex" ],
7036 }
7037
7038 cc_library {
7039 name: "otherlib",
7040 srcs: ["mylib.cpp"],
7041 system_shared_libs: [],
7042 stl: "none",
7043 stubs: {
7044 versions: ["1", "2", "3"],
7045 },
7046 apex_available: [ "myapex" ],
7047 }
7048 `)
7049}
7050
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007051func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007052 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007056 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007057 }
7058
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
7064
7065 prebuilt_apex {
7066 name: "myapex",
7067 prefer: true,
7068 arch: {
7069 arm64: {
7070 src: "myapex-arm64.apex",
7071 },
7072 arm: {
7073 src: "myapex-arm.apex",
7074 },
7075 },
7076 }
7077
7078 apex_set {
7079 name: "myapex_set",
7080 set: "myapex.apks",
7081 filename: "myapex_set.apex",
7082 overrides: ["myapex"],
7083 }
7084 `)
7085
7086 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7087 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7088 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 +09007089 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 +09007090}
7091
Jooyung Han938b5932020-06-20 12:47:47 +09007092func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007093 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007094 apex {
7095 name: "myapex",
7096 key: "myapex.key",
7097 apps: ["app"],
7098 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007099 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007100 }
7101
7102 apex_key {
7103 name: "myapex.key",
7104 public_key: "testkey.avbpubkey",
7105 private_key: "testkey.pem",
7106 }
7107
7108 android_app {
7109 name: "app",
7110 srcs: ["foo/bar/MyClass.java"],
7111 package_name: "foo",
7112 sdk_version: "none",
7113 system_modules: "none",
7114 apex_available: [ "myapex" ],
7115 }
7116 `, withFiles(map[string][]byte{
7117 "sub/Android.bp": []byte(`
7118 override_apex {
7119 name: "override_myapex",
7120 base: "myapex",
7121 apps: ["override_app"],
7122 allowed_files: ":allowed",
7123 }
7124 // Overridable "path" property should be referenced indirectly
7125 filegroup {
7126 name: "allowed",
7127 srcs: ["allowed.txt"],
7128 }
7129 override_android_app {
7130 name: "override_app",
7131 base: "app",
7132 package_name: "bar",
7133 }
7134 `),
7135 }))
7136
7137 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7138 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7139 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7140 }
7141
7142 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7143 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7144 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7145 }
7146}
7147
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007148func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007149 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
7153 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 cc_library {
7164 name: "mylib",
7165 srcs: ["mylib.cpp"],
7166 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007167 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007168 },
7169 apex_available: ["myapex"],
7170 }
7171
7172 cc_prebuilt_library_shared {
7173 name: "mylib",
7174 prefer: false,
7175 srcs: ["prebuilt.so"],
7176 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007177 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007178 },
7179 apex_available: ["myapex"],
7180 }
7181 `)
7182}
7183
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007184func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007185 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007186 apex {
7187 name: "myapex",
7188 key: "myapex.key",
7189 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007190 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007191 }
7192 apex_key {
7193 name: "myapex.key",
7194 public_key: "testkey.avbpubkey",
7195 private_key: "testkey.pem",
7196 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007197 `,
7198 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7199 variables.CompressedApex = proptools.BoolPtr(true)
7200 }),
7201 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007202
7203 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7204 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7205
7206 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7207 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7208
7209 // Make sure output of bundle is .capex
7210 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7211 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7212
7213 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007214 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007215 var builder strings.Builder
7216 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7217 androidMk := builder.String()
7218 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7219}
7220
Martin Stjernholm2856c662020-12-02 15:03:42 +00007221func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007222 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007223 apex {
7224 name: "myapex",
7225 key: "myapex.key",
7226 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007227 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007228 }
7229
7230 apex_key {
7231 name: "myapex.key",
7232 public_key: "testkey.avbpubkey",
7233 private_key: "testkey.pem",
7234 }
7235
7236 cc_library {
7237 name: "mylib",
7238 srcs: ["mylib.cpp"],
7239 apex_available: ["myapex"],
7240 shared_libs: ["otherlib"],
7241 system_shared_libs: [],
7242 }
7243
7244 cc_library {
7245 name: "otherlib",
7246 srcs: ["mylib.cpp"],
7247 stubs: {
7248 versions: ["current"],
7249 },
7250 }
7251
7252 cc_prebuilt_library_shared {
7253 name: "otherlib",
7254 prefer: true,
7255 srcs: ["prebuilt.so"],
7256 stubs: {
7257 versions: ["current"],
7258 },
7259 }
7260 `)
7261
7262 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007263 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007264 var builder strings.Builder
7265 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7266 androidMk := builder.String()
7267
7268 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7269 // a thing there.
7270 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7271}
7272
Jiyong Parke3867542020-12-03 17:28:25 +09007273func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007274 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007275 apex {
7276 name: "myapex",
7277 key: "myapex.key",
7278 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007279 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007280 }
7281
7282 apex_key {
7283 name: "myapex.key",
7284 public_key: "testkey.avbpubkey",
7285 private_key: "testkey.pem",
7286 }
7287
7288 cc_library {
7289 name: "mylib",
7290 srcs: ["mylib.cpp"],
7291 system_shared_libs: [],
7292 stl: "none",
7293 apex_available: ["myapex"],
7294 shared_libs: ["mylib2"],
7295 target: {
7296 apex: {
7297 exclude_shared_libs: ["mylib2"],
7298 },
7299 },
7300 }
7301
7302 cc_library {
7303 name: "mylib2",
7304 srcs: ["mylib.cpp"],
7305 system_shared_libs: [],
7306 stl: "none",
7307 }
7308 `)
7309
7310 // Check if mylib is linked to mylib2 for the non-apex target
7311 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7312 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7313
7314 // Make sure that the link doesn't occur for the apex target
7315 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7316 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7317
7318 // It shouldn't appear in the copy cmd as well.
7319 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7320 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7321}
7322
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007323func TestPrebuiltStubLibDep(t *testing.T) {
7324 bpBase := `
7325 apex {
7326 name: "myapex",
7327 key: "myapex.key",
7328 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007329 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007330 }
7331 apex_key {
7332 name: "myapex.key",
7333 public_key: "testkey.avbpubkey",
7334 private_key: "testkey.pem",
7335 }
7336 cc_library {
7337 name: "mylib",
7338 srcs: ["mylib.cpp"],
7339 apex_available: ["myapex"],
7340 shared_libs: ["stublib"],
7341 system_shared_libs: [],
7342 }
7343 apex {
7344 name: "otherapex",
7345 enabled: %s,
7346 key: "myapex.key",
7347 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007348 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007349 }
7350 `
7351
7352 stublibSourceBp := `
7353 cc_library {
7354 name: "stublib",
7355 srcs: ["mylib.cpp"],
7356 apex_available: ["otherapex"],
7357 system_shared_libs: [],
7358 stl: "none",
7359 stubs: {
7360 versions: ["1"],
7361 },
7362 }
7363 `
7364
7365 stublibPrebuiltBp := `
7366 cc_prebuilt_library_shared {
7367 name: "stublib",
7368 srcs: ["prebuilt.so"],
7369 apex_available: ["otherapex"],
7370 stubs: {
7371 versions: ["1"],
7372 },
7373 %s
7374 }
7375 `
7376
7377 tests := []struct {
7378 name string
7379 stublibBp string
7380 usePrebuilt bool
7381 modNames []string // Modules to collect AndroidMkEntries for
7382 otherApexEnabled []string
7383 }{
7384 {
7385 name: "only_source",
7386 stublibBp: stublibSourceBp,
7387 usePrebuilt: false,
7388 modNames: []string{"stublib"},
7389 otherApexEnabled: []string{"true", "false"},
7390 },
7391 {
7392 name: "source_preferred",
7393 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7394 usePrebuilt: false,
7395 modNames: []string{"stublib", "prebuilt_stublib"},
7396 otherApexEnabled: []string{"true", "false"},
7397 },
7398 {
7399 name: "prebuilt_preferred",
7400 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7401 usePrebuilt: true,
7402 modNames: []string{"stublib", "prebuilt_stublib"},
7403 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7404 },
7405 {
7406 name: "only_prebuilt",
7407 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7408 usePrebuilt: true,
7409 modNames: []string{"stublib"},
7410 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7411 },
7412 }
7413
7414 for _, test := range tests {
7415 t.Run(test.name, func(t *testing.T) {
7416 for _, otherApexEnabled := range test.otherApexEnabled {
7417 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007418 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007419
7420 type modAndMkEntries struct {
7421 mod *cc.Module
7422 mkEntries android.AndroidMkEntries
7423 }
7424 entries := []*modAndMkEntries{}
7425
7426 // Gather shared lib modules that are installable
7427 for _, modName := range test.modNames {
7428 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7429 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7430 continue
7431 }
7432 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007433 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007434 continue
7435 }
Colin Crossaa255532020-07-03 13:18:24 -07007436 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007437 if ent.Disabled {
7438 continue
7439 }
7440 entries = append(entries, &modAndMkEntries{
7441 mod: mod,
7442 mkEntries: ent,
7443 })
7444 }
7445 }
7446 }
7447
7448 var entry *modAndMkEntries = nil
7449 for _, ent := range entries {
7450 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7451 if entry != nil {
7452 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7453 } else {
7454 entry = ent
7455 }
7456 }
7457 }
7458
7459 if entry == nil {
7460 t.Errorf("AndroidMk entry for \"stublib\" missing")
7461 } else {
7462 isPrebuilt := entry.mod.Prebuilt() != nil
7463 if isPrebuilt != test.usePrebuilt {
7464 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7465 }
7466 if !entry.mod.IsStubs() {
7467 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7468 }
7469 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7470 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7471 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007472 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09007473 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09007474 if !android.InList(expected, cflags) {
7475 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7476 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007477 }
7478 })
7479 }
7480 })
7481 }
7482}
7483
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007484func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01007485 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007486}