blob: e5f77fc2374b60803a30a09930172ee7c217da3b [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
Kiyoung Kim487689e2022-07-26 09:48:22 +090029 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090030 "github.com/google/blueprint/proptools"
31
32 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
150 java.PrepareForTestWithJavaDefaultModules,
151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900447 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900448 static_libs: ["libstatic"],
449 // TODO: remove //apex_available:platform
450 apex_available: [
451 "//apex_available:platform",
452 "myapex",
453 ],
454 }
455
Paul Duffindddd5462020-04-07 15:25:44 +0100456 cc_prebuilt_library_shared {
457 name: "mylib2",
458 srcs: ["prebuilt.so"],
459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
464 }
465
Jiyong Park9918e1a2020-03-17 19:16:40 +0900466 cc_library_static {
467 name: "libstatic",
468 srcs: ["mylib.cpp"],
469 system_shared_libs: [],
470 stl: "none",
471 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Paul Duffina71a67a2021-03-29 00:42:57 +0100523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
526 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Artur Satayeva8bd1132020-04-27 18:07:06 +0100600 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
603 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
604 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100605
606 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800611}
612
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800614 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 apex_defaults {
616 name: "myapex-defaults",
617 key: "myapex.key",
618 prebuilts: ["myetc"],
619 native_shared_libs: ["mylib"],
620 java_libs: ["myjar"],
621 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900622 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800623 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000624 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
626
627 prebuilt_etc {
628 name: "myetc",
629 src: "myprebuilt",
630 }
631
632 apex {
633 name: "myapex",
634 defaults: ["myapex-defaults"],
635 }
636
637 apex_key {
638 name: "myapex.key",
639 public_key: "testkey.avbpubkey",
640 private_key: "testkey.pem",
641 }
642
643 cc_library {
644 name: "mylib",
645 system_shared_libs: [],
646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
649
650 java_library {
651 name: "myjar",
652 srcs: ["foo/bar/MyClass.java"],
653 sdk_version: "none",
654 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000655 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900656 }
657
658 android_app {
659 name: "AppFoo",
660 srcs: ["foo/bar/MyClass.java"],
661 sdk_version: "none",
662 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900664 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900665
666 runtime_resource_overlay {
667 name: "rro",
668 theme: "blue",
669 }
670
markchien2f59ec92020-09-02 16:23:38 +0800671 bpf {
672 name: "bpf",
673 srcs: ["bpf.c", "bpf2.c"],
674 }
675
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 bpf {
677 name: "netd_test",
678 srcs: ["netd_test.c"],
679 sub_dir: "netd",
680 }
681
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000683 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 "etc/myetc",
685 "javalib/myjar.jar",
686 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000687 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900688 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800689 "etc/bpf/bpf.o",
690 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800691 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900692 })
693}
694
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800696 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 apex {
698 name: "myapex",
699 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000700 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708 `)
709
710 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900711 args := module.Rule("apexRule").Args
712 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
713 t.Error("manifest should be apex_manifest.pb, but " + manifest)
714 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715}
716
Liz Kammer4854a7d2021-05-27 14:28:27 -0400717func TestApexManifestMinSdkVersion(t *testing.T) {
718 ctx := testApex(t, `
719 apex_defaults {
720 name: "my_defaults",
721 key: "myapex.key",
722 product_specific: true,
723 file_contexts: ":my-file-contexts",
724 updatable: false,
725 }
726 apex {
727 name: "myapex_30",
728 min_sdk_version: "30",
729 defaults: ["my_defaults"],
730 }
731
732 apex {
733 name: "myapex_current",
734 min_sdk_version: "current",
735 defaults: ["my_defaults"],
736 }
737
738 apex {
739 name: "myapex_none",
740 defaults: ["my_defaults"],
741 }
742
743 apex_key {
744 name: "myapex.key",
745 public_key: "testkey.avbpubkey",
746 private_key: "testkey.pem",
747 }
748
749 filegroup {
750 name: "my-file-contexts",
751 srcs: ["product_specific_file_contexts"],
752 }
753 `, withFiles(map[string][]byte{
754 "product_specific_file_contexts": nil,
755 }), android.FixtureModifyProductVariables(
756 func(variables android.FixtureProductVariables) {
757 variables.Unbundled_build = proptools.BoolPtr(true)
758 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
759 }), android.FixtureMergeEnv(map[string]string{
760 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
761 }))
762
763 testCases := []struct {
764 module string
765 minSdkVersion string
766 }{
767 {
768 module: "myapex_30",
769 minSdkVersion: "30",
770 },
771 {
772 module: "myapex_current",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 {
776 module: "myapex_none",
777 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
778 },
779 }
780 for _, tc := range testCases {
781 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
782 args := module.Rule("apexRule").Args
783 optFlags := args["opt_flags"]
784 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
785 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
786 }
787 }
788}
789
Alex Light5098a612018-11-29 17:12:15 -0800790func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800791 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800792 apex {
793 name: "myapex",
794 key: "myapex.key",
795 payload_type: "zip",
796 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000797 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800798 }
799
800 apex_key {
801 name: "myapex.key",
802 public_key: "testkey.avbpubkey",
803 private_key: "testkey.pem",
804 }
805
806 cc_library {
807 name: "mylib",
808 srcs: ["mylib.cpp"],
809 shared_libs: ["mylib2"],
810 system_shared_libs: [],
811 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000812 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800813 }
814
815 cc_library {
816 name: "mylib2",
817 srcs: ["mylib.cpp"],
818 system_shared_libs: [],
819 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000820 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800821 }
822 `)
823
Sundong Ahnabb64432019-10-22 13:58:29 +0900824 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800825 copyCmds := zipApexRule.Args["copy_commands"]
826
827 // Ensure that main rule creates an output
828 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
829
830 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700834 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800835
836 // Ensure that both direct and indirect deps are copied into apex
837 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
838 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900839}
840
841func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800842 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900843 apex {
844 name: "myapex",
845 key: "myapex.key",
846 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900847 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000848 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900849 }
850
851 apex_key {
852 name: "myapex.key",
853 public_key: "testkey.avbpubkey",
854 private_key: "testkey.pem",
855 }
856
857 cc_library {
858 name: "mylib",
859 srcs: ["mylib.cpp"],
860 shared_libs: ["mylib2", "mylib3"],
861 system_shared_libs: [],
862 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000863 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900864 }
865
866 cc_library {
867 name: "mylib2",
868 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900869 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 system_shared_libs: [],
871 stl: "none",
872 stubs: {
873 versions: ["1", "2", "3"],
874 },
875 }
876
877 cc_library {
878 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900879 srcs: ["mylib.cpp"],
880 shared_libs: ["mylib4"],
881 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882 stl: "none",
883 stubs: {
884 versions: ["10", "11", "12"],
885 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000886 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900887 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900888
889 cc_library {
890 name: "mylib4",
891 srcs: ["mylib.cpp"],
892 system_shared_libs: [],
893 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000894 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900895 }
Jiyong Park105dc322021-06-11 17:22:09 +0900896
897 rust_binary {
898 name: "foo.rust",
899 srcs: ["foo.rs"],
900 shared_libs: ["libfoo.shared_from_rust"],
901 prefer_rlib: true,
902 apex_available: ["myapex"],
903 }
904
905 cc_library_shared {
906 name: "libfoo.shared_from_rust",
907 srcs: ["mylib.cpp"],
908 system_shared_libs: [],
909 stl: "none",
910 stubs: {
911 versions: ["10", "11", "12"],
912 },
913 }
914
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 `)
916
Sundong Ahnabb64432019-10-22 13:58:29 +0900917 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 copyCmds := apexRule.Args["copy_commands"]
919
920 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
926 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800927 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
Colin Crossaede88c2020-08-11 12:17:01 -0700929 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930
931 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900932 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900934 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935
936 // 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 -0700937 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700939 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900940
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700941 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
942 // is replaced by sharing of "cFlags" in cc/builder.go.
943 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
944 // module variable representing "cflags". So it was not detected by ensureNotContains.
945 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
946 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
947 // including the original cflags's "-include mylib.h".
948 //
Jiyong Park64379952018-12-13 18:37:29 +0900949 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700950 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
951 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900952
Jiyong Park85cc35a2022-07-17 11:30:47 +0900953 // Ensure that genstub for platform-provided lib is invoked with --systemapi
954 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
955 // Ensure that genstub for apex-provided lib is invoked with --apex
956 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900957
Jooyung Hana57af4a2020-01-23 05:36:59 +0000958 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900959 "lib64/mylib.so",
960 "lib64/mylib3.so",
961 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900962 "bin/foo.rust",
963 "lib64/libc++.so", // by the implicit dependency from foo.rust
964 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900965 })
Jiyong Park105dc322021-06-11 17:22:09 +0900966
967 // Ensure that stub dependency from a rust module is not included
968 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
969 // The rust module is linked to the stub cc library
970 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
971 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
972 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900973
974 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
975 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900976}
977
Jiyong Park1bc84122021-06-22 20:23:05 +0900978func TestApexCanUsePrivateApis(t *testing.T) {
979 ctx := testApex(t, `
980 apex {
981 name: "myapex",
982 key: "myapex.key",
983 native_shared_libs: ["mylib"],
984 binaries: ["foo.rust"],
985 updatable: false,
986 platform_apis: true,
987 }
988
989 apex_key {
990 name: "myapex.key",
991 public_key: "testkey.avbpubkey",
992 private_key: "testkey.pem",
993 }
994
995 cc_library {
996 name: "mylib",
997 srcs: ["mylib.cpp"],
998 shared_libs: ["mylib2"],
999 system_shared_libs: [],
1000 stl: "none",
1001 apex_available: [ "myapex" ],
1002 }
1003
1004 cc_library {
1005 name: "mylib2",
1006 srcs: ["mylib.cpp"],
1007 cflags: ["-include mylib.h"],
1008 system_shared_libs: [],
1009 stl: "none",
1010 stubs: {
1011 versions: ["1", "2", "3"],
1012 },
1013 }
1014
1015 rust_binary {
1016 name: "foo.rust",
1017 srcs: ["foo.rs"],
1018 shared_libs: ["libfoo.shared_from_rust"],
1019 prefer_rlib: true,
1020 apex_available: ["myapex"],
1021 }
1022
1023 cc_library_shared {
1024 name: "libfoo.shared_from_rust",
1025 srcs: ["mylib.cpp"],
1026 system_shared_libs: [],
1027 stl: "none",
1028 stubs: {
1029 versions: ["10", "11", "12"],
1030 },
1031 }
1032 `)
1033
1034 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1035 copyCmds := apexRule.Args["copy_commands"]
1036
1037 // Ensure that indirect stubs dep is not included
1038 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1039 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1040
1041 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1042 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1045 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001046 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001047 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1048 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1049}
1050
Colin Cross7812fd32020-09-25 12:35:10 -07001051func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1052 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001053 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001054 apex {
1055 name: "myapex",
1056 key: "myapex.key",
1057 native_shared_libs: ["mylib", "mylib3"],
1058 min_sdk_version: "29",
1059 }
1060
1061 apex_key {
1062 name: "myapex.key",
1063 public_key: "testkey.avbpubkey",
1064 private_key: "testkey.pem",
1065 }
1066
1067 cc_library {
1068 name: "mylib",
1069 srcs: ["mylib.cpp"],
1070 shared_libs: ["mylib2", "mylib3"],
1071 system_shared_libs: [],
1072 stl: "none",
1073 apex_available: [ "myapex" ],
1074 min_sdk_version: "28",
1075 }
1076
1077 cc_library {
1078 name: "mylib2",
1079 srcs: ["mylib.cpp"],
1080 cflags: ["-include mylib.h"],
1081 system_shared_libs: [],
1082 stl: "none",
1083 stubs: {
1084 versions: ["28", "29", "30", "current"],
1085 },
1086 min_sdk_version: "28",
1087 }
1088
1089 cc_library {
1090 name: "mylib3",
1091 srcs: ["mylib.cpp"],
1092 shared_libs: ["mylib4"],
1093 system_shared_libs: [],
1094 stl: "none",
1095 stubs: {
1096 versions: ["28", "29", "30", "current"],
1097 },
1098 apex_available: [ "myapex" ],
1099 min_sdk_version: "28",
1100 }
1101
1102 cc_library {
1103 name: "mylib4",
1104 srcs: ["mylib.cpp"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 apex_available: [ "myapex" ],
1108 min_sdk_version: "28",
1109 }
1110 `)
1111
1112 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1113 copyCmds := apexRule.Args["copy_commands"]
1114
1115 // Ensure that direct non-stubs dep is always included
1116 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1117
1118 // Ensure that indirect stubs dep is not included
1119 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1120
1121 // Ensure that direct stubs dep is included
1122 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1123
1124 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1125
Jiyong Park55549df2021-02-26 23:57:23 +09001126 // Ensure that mylib is linking with the latest version of stub for mylib2
1127 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001128 // ... and not linking to the non-stub (impl) variant of mylib2
1129 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1130
1131 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1132 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1133 // .. and not linking to the stubs variant of mylib3
1134 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1135
1136 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001137 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001138 ensureNotContains(t, mylib2Cflags, "-include ")
1139
Jiyong Park85cc35a2022-07-17 11:30:47 +09001140 // Ensure that genstub is invoked with --systemapi
1141 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001142
1143 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1144 "lib64/mylib.so",
1145 "lib64/mylib3.so",
1146 "lib64/mylib4.so",
1147 })
1148}
1149
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001150func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1151 t.Parallel()
1152 // myapex (Z)
1153 // mylib -----------------.
1154 // |
1155 // otherapex (29) |
1156 // libstub's versions: 29 Z current
1157 // |
1158 // <platform> |
1159 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001160 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001161 apex {
1162 name: "myapex",
1163 key: "myapex.key",
1164 native_shared_libs: ["mylib"],
1165 min_sdk_version: "Z", // non-final
1166 }
1167
1168 cc_library {
1169 name: "mylib",
1170 srcs: ["mylib.cpp"],
1171 shared_libs: ["libstub"],
1172 apex_available: ["myapex"],
1173 min_sdk_version: "Z",
1174 }
1175
1176 apex_key {
1177 name: "myapex.key",
1178 public_key: "testkey.avbpubkey",
1179 private_key: "testkey.pem",
1180 }
1181
1182 apex {
1183 name: "otherapex",
1184 key: "myapex.key",
1185 native_shared_libs: ["libstub"],
1186 min_sdk_version: "29",
1187 }
1188
1189 cc_library {
1190 name: "libstub",
1191 srcs: ["mylib.cpp"],
1192 stubs: {
1193 versions: ["29", "Z", "current"],
1194 },
1195 apex_available: ["otherapex"],
1196 min_sdk_version: "29",
1197 }
1198
1199 // platform module depending on libstub from otherapex should use the latest stub("current")
1200 cc_library {
1201 name: "libplatform",
1202 srcs: ["mylib.cpp"],
1203 shared_libs: ["libstub"],
1204 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001205 `,
1206 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1207 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1208 variables.Platform_sdk_final = proptools.BoolPtr(false)
1209 variables.Platform_version_active_codenames = []string{"Z"}
1210 }),
1211 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212
Jiyong Park55549df2021-02-26 23:57:23 +09001213 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001215 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001216 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001217 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001218
1219 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1220 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1221 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1222 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1223 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1224}
1225
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001226func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001227 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001229 name: "myapex2",
1230 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001232 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001233 }
1234
1235 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001236 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001237 public_key: "testkey.avbpubkey",
1238 private_key: "testkey.pem",
1239 }
1240
1241 cc_library {
1242 name: "mylib",
1243 srcs: ["mylib.cpp"],
1244 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001245 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 system_shared_libs: [],
1247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001248 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001249 }
1250
1251 cc_library {
1252 name: "libfoo",
1253 srcs: ["mylib.cpp"],
1254 shared_libs: ["libbar"],
1255 system_shared_libs: [],
1256 stl: "none",
1257 stubs: {
1258 versions: ["10", "20", "30"],
1259 },
1260 }
1261
1262 cc_library {
1263 name: "libbar",
1264 srcs: ["mylib.cpp"],
1265 system_shared_libs: [],
1266 stl: "none",
1267 }
1268
Jiyong Park678c8812020-02-07 17:25:49 +09001269 cc_library_static {
1270 name: "libbaz",
1271 srcs: ["mylib.cpp"],
1272 system_shared_libs: [],
1273 stl: "none",
1274 apex_available: [ "myapex2" ],
1275 }
1276
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 `)
1278
Jiyong Park83dc74b2020-01-14 18:38:44 +09001279 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 copyCmds := apexRule.Args["copy_commands"]
1281
1282 // Ensure that direct non-stubs dep is always included
1283 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1284
1285 // Ensure that indirect stubs dep is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1287
1288 // Ensure that dependency of stubs is not included
1289 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1290
Colin Crossaede88c2020-08-11 12:17:01 -07001291 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292
1293 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001296 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001297
Jiyong Park3ff16992019-12-27 14:11:47 +09001298 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001299
1300 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1301 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001305
Artur Satayeva8bd1132020-04-27 18:07:06 +01001306 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001307 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001308}
1309
Jooyung Hand3639552019-08-09 12:57:43 +09001310func TestApexWithRuntimeLibsDependency(t *testing.T) {
1311 /*
1312 myapex
1313 |
1314 v (runtime_libs)
1315 mylib ------+------> libfoo [provides stub]
1316 |
1317 `------> libbar
1318 */
Colin Cross1c460562021-02-16 17:55:47 -08001319 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001320 apex {
1321 name: "myapex",
1322 key: "myapex.key",
1323 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001324 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001325 }
1326
1327 apex_key {
1328 name: "myapex.key",
1329 public_key: "testkey.avbpubkey",
1330 private_key: "testkey.pem",
1331 }
1332
1333 cc_library {
1334 name: "mylib",
1335 srcs: ["mylib.cpp"],
1336 runtime_libs: ["libfoo", "libbar"],
1337 system_shared_libs: [],
1338 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001339 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001340 }
1341
1342 cc_library {
1343 name: "libfoo",
1344 srcs: ["mylib.cpp"],
1345 system_shared_libs: [],
1346 stl: "none",
1347 stubs: {
1348 versions: ["10", "20", "30"],
1349 },
1350 }
1351
1352 cc_library {
1353 name: "libbar",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001357 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001358 }
1359
1360 `)
1361
Sundong Ahnabb64432019-10-22 13:58:29 +09001362 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001363 copyCmds := apexRule.Args["copy_commands"]
1364
1365 // Ensure that direct non-stubs dep is always included
1366 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1367
1368 // Ensure that indirect stubs dep is not included
1369 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1370
1371 // Ensure that runtime_libs dep in included
1372 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1373
Sundong Ahnabb64432019-10-22 13:58:29 +09001374 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001375 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1376 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001377
1378}
1379
Paul Duffina02cae32021-03-09 01:44:06 +00001380var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1381 cc.PrepareForTestWithCcBuildComponents,
1382 PrepareForTestWithApexBuildComponents,
1383 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001384 apex {
1385 name: "com.android.runtime",
1386 key: "com.android.runtime.key",
1387 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001388 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001389 }
1390
1391 apex_key {
1392 name: "com.android.runtime.key",
1393 public_key: "testkey.avbpubkey",
1394 private_key: "testkey.pem",
1395 }
Paul Duffina02cae32021-03-09 01:44:06 +00001396 `),
1397 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1398)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399
Paul Duffina02cae32021-03-09 01:44:06 +00001400func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001401 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001402 cc_library {
1403 name: "libc",
1404 no_libcrt: true,
1405 nocrt: true,
1406 stl: "none",
1407 system_shared_libs: [],
1408 stubs: { versions: ["1"] },
1409 apex_available: ["com.android.runtime"],
1410
1411 sanitize: {
1412 hwaddress: true,
1413 }
1414 }
1415
1416 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001417 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418 no_libcrt: true,
1419 nocrt: true,
1420 stl: "none",
1421 system_shared_libs: [],
1422 srcs: [""],
1423 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001424 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001425
1426 sanitize: {
1427 never: true,
1428 },
Paul Duffina02cae32021-03-09 01:44:06 +00001429 } `)
1430 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001431
1432 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1433 "lib64/bionic/libc.so",
1434 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1435 })
1436
Colin Cross4c4c1be2022-02-10 11:41:18 -08001437 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001438
1439 installed := hwasan.Description("install libclang_rt.hwasan")
1440 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1441
1442 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1443 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1444 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1445}
1446
1447func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001448 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001449 prepareForTestOfRuntimeApexWithHwasan,
1450 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1451 variables.SanitizeDevice = []string{"hwaddress"}
1452 }),
1453 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 cc_library {
1455 name: "libc",
1456 no_libcrt: true,
1457 nocrt: true,
1458 stl: "none",
1459 system_shared_libs: [],
1460 stubs: { versions: ["1"] },
1461 apex_available: ["com.android.runtime"],
1462 }
1463
1464 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001465 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001466 no_libcrt: true,
1467 nocrt: true,
1468 stl: "none",
1469 system_shared_libs: [],
1470 srcs: [""],
1471 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001472 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001473
1474 sanitize: {
1475 never: true,
1476 },
1477 }
Paul Duffina02cae32021-03-09 01:44:06 +00001478 `)
1479 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001480
1481 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1482 "lib64/bionic/libc.so",
1483 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1484 })
1485
Colin Cross4c4c1be2022-02-10 11:41:18 -08001486 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001487
1488 installed := hwasan.Description("install libclang_rt.hwasan")
1489 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1490
1491 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1492 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1493 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1494}
1495
Jooyung Han61b66e92020-03-21 14:21:46 +00001496func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1497 testcases := []struct {
1498 name string
1499 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001500 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001501 shouldLink string
1502 shouldNotLink []string
1503 }{
1504 {
Jiyong Park55549df2021-02-26 23:57:23 +09001505 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001506 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001507 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001508 shouldLink: "current",
1509 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001510 },
1511 {
Jiyong Park55549df2021-02-26 23:57:23 +09001512 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001513 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001514 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001515 shouldLink: "current",
1516 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001517 },
1518 }
1519 for _, tc := range testcases {
1520 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001521 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 apex {
1523 name: "myapex",
1524 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001526 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001527 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001529
Jooyung Han61b66e92020-03-21 14:21:46 +00001530 apex_key {
1531 name: "myapex.key",
1532 public_key: "testkey.avbpubkey",
1533 private_key: "testkey.pem",
1534 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001535
Jooyung Han61b66e92020-03-21 14:21:46 +00001536 cc_library {
1537 name: "mylib",
1538 srcs: ["mylib.cpp"],
1539 vendor_available: true,
1540 shared_libs: ["libbar"],
1541 system_shared_libs: [],
1542 stl: "none",
1543 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001544 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001546
Jooyung Han61b66e92020-03-21 14:21:46 +00001547 cc_library {
1548 name: "libbar",
1549 srcs: ["mylib.cpp"],
1550 system_shared_libs: [],
1551 stl: "none",
1552 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001553 llndk: {
1554 symbol_file: "libbar.map.txt",
1555 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001556 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001557 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001558 withUnbundledBuild,
1559 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001560
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 // Ensure that LLNDK dep is not included
1562 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1563 "lib64/mylib.so",
1564 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001565
Jooyung Han61b66e92020-03-21 14:21:46 +00001566 // Ensure that LLNDK dep is required
1567 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1568 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1569 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001570
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1572 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001573 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001575 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001576
Steven Moreland2c4000c2021-04-27 02:08:49 +00001577 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001578 ver := tc.shouldLink
1579 if tc.shouldLink == "current" {
1580 ver = strconv.Itoa(android.FutureApiLevelInt)
1581 }
1582 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001583 })
1584 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001585}
1586
Jiyong Park25fc6a92018-11-18 18:02:45 +09001587func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001588 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001589 apex {
1590 name: "myapex",
1591 key: "myapex.key",
1592 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001593 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001594 }
1595
1596 apex_key {
1597 name: "myapex.key",
1598 public_key: "testkey.avbpubkey",
1599 private_key: "testkey.pem",
1600 }
1601
1602 cc_library {
1603 name: "mylib",
1604 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001605 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 shared_libs: ["libdl#27"],
1607 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001608 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001609 }
1610
1611 cc_library_shared {
1612 name: "mylib_shared",
1613 srcs: ["mylib.cpp"],
1614 shared_libs: ["libdl#27"],
1615 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001616 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001617 }
1618
1619 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001620 name: "libBootstrap",
1621 srcs: ["mylib.cpp"],
1622 stl: "none",
1623 bootstrap: true,
1624 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 `)
1626
Sundong Ahnabb64432019-10-22 13:58:29 +09001627 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001628 copyCmds := apexRule.Args["copy_commands"]
1629
1630 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001631 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001632 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1633 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
1635 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001636 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637
Colin Crossaede88c2020-08-11 12:17:01 -07001638 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1639 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1640 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641
1642 // For dependency to libc
1643 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001644 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001645 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001646 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001648 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1649 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650
1651 // For dependency to libm
1652 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001653 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001655 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001656 // ... and is not compiling with the stub
1657 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1658 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1659
1660 // For dependency to libdl
1661 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001662 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1665 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001667 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668 // ... Cflags from stub is correctly exported to mylib
1669 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1670 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001671
1672 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001673 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1674 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1675 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1676 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001678
Jooyung Han749dc692020-04-15 11:03:39 +09001679func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 // there are three links between liba --> libz.
1681 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001682 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001683 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001684 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001685 apex {
1686 name: "myapex",
1687 key: "myapex.key",
1688 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001689 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001690 }
1691
1692 apex {
1693 name: "otherapex",
1694 key: "myapex.key",
1695 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001696 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001697 }
1698
1699 apex_key {
1700 name: "myapex.key",
1701 public_key: "testkey.avbpubkey",
1702 private_key: "testkey.pem",
1703 }
1704
1705 cc_library {
1706 name: "libx",
1707 shared_libs: ["liba"],
1708 system_shared_libs: [],
1709 stl: "none",
1710 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001711 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001712 }
1713
1714 cc_library {
1715 name: "liby",
1716 shared_libs: ["liba"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001721 }
1722
1723 cc_library {
1724 name: "liba",
1725 shared_libs: ["libz"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 apex_available: [
1729 "//apex_available:anyapex",
1730 "//apex_available:platform",
1731 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001732 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001733 }
1734
1735 cc_library {
1736 name: "libz",
1737 system_shared_libs: [],
1738 stl: "none",
1739 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001740 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001741 },
1742 }
Jooyung Han749dc692020-04-15 11:03:39 +09001743 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001744
1745 expectLink := func(from, from_variant, to, to_variant string) {
1746 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1747 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1748 }
1749 expectNoLink := func(from, from_variant, to, to_variant string) {
1750 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1751 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1752 }
1753 // platform liba is linked to non-stub version
1754 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001755 // liba in myapex is linked to current
1756 expectLink("liba", "shared_apex29", "libz", "shared_current")
1757 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001758 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001759 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001760 // liba in otherapex is linked to current
1761 expectLink("liba", "shared_apex30", "libz", "shared_current")
1762 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001763 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1764 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001765}
1766
Jooyung Hanaed150d2020-04-02 01:41:41 +09001767func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001768 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001769 apex {
1770 name: "myapex",
1771 key: "myapex.key",
1772 native_shared_libs: ["libx"],
1773 min_sdk_version: "R",
1774 }
1775
1776 apex_key {
1777 name: "myapex.key",
1778 public_key: "testkey.avbpubkey",
1779 private_key: "testkey.pem",
1780 }
1781
1782 cc_library {
1783 name: "libx",
1784 shared_libs: ["libz"],
1785 system_shared_libs: [],
1786 stl: "none",
1787 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001788 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001789 }
1790
1791 cc_library {
1792 name: "libz",
1793 system_shared_libs: [],
1794 stl: "none",
1795 stubs: {
1796 versions: ["29", "R"],
1797 },
1798 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001799 `,
1800 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1801 variables.Platform_version_active_codenames = []string{"R"}
1802 }),
1803 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001804
1805 expectLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
1809 expectNoLink := func(from, from_variant, to, to_variant string) {
1810 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1811 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1812 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001813 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1814 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001815 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1816 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001817}
1818
Jooyung Han4c4da062021-06-23 10:23:16 +09001819func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1820 testApex(t, `
1821 apex {
1822 name: "myapex",
1823 key: "myapex.key",
1824 java_libs: ["libx"],
1825 min_sdk_version: "S",
1826 }
1827
1828 apex_key {
1829 name: "myapex.key",
1830 public_key: "testkey.avbpubkey",
1831 private_key: "testkey.pem",
1832 }
1833
1834 java_library {
1835 name: "libx",
1836 srcs: ["a.java"],
1837 apex_available: [ "myapex" ],
1838 sdk_version: "current",
1839 min_sdk_version: "S", // should be okay
1840 }
1841 `,
1842 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1843 variables.Platform_version_active_codenames = []string{"S"}
1844 variables.Platform_sdk_codename = proptools.StringPtr("S")
1845 }),
1846 )
1847}
1848
Jooyung Han749dc692020-04-15 11:03:39 +09001849func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001850 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001851 apex {
1852 name: "myapex",
1853 key: "myapex.key",
1854 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001855 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001856 }
1857
1858 apex_key {
1859 name: "myapex.key",
1860 public_key: "testkey.avbpubkey",
1861 private_key: "testkey.pem",
1862 }
1863
1864 cc_library {
1865 name: "libx",
1866 shared_libs: ["libz"],
1867 system_shared_libs: [],
1868 stl: "none",
1869 apex_available: [ "myapex" ],
1870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
1877 versions: ["1", "2"],
1878 },
1879 }
1880 `)
1881
1882 expectLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
1886 expectNoLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001891 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001892 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001893 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001894}
1895
Jiyong Park5df7bd32021-08-25 16:18:46 +09001896func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1897 ctx := testApex(t, `
1898 apex {
1899 name: "myapex",
1900 key: "myapex.key",
1901 native_shared_libs: ["mylib"],
1902 updatable: false,
1903 vendor: true,
1904 min_sdk_version: "29",
1905 }
1906
1907 apex_key {
1908 name: "myapex.key",
1909 public_key: "testkey.avbpubkey",
1910 private_key: "testkey.pem",
1911 }
1912
1913 cc_library {
1914 name: "mylib",
1915 vendor_available: true,
1916 system_shared_libs: [],
1917 stl: "none",
1918 apex_available: [ "myapex" ],
1919 min_sdk_version: "29",
1920 }
1921 `)
1922
1923 vendorVariant := "android_vendor.29_arm64_armv8-a"
1924
1925 // First check that the correct variant of crtbegin_so is used.
1926 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1927 crtBegin := names(ldRule.Args["crtBegin"])
1928 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1929
1930 // Ensure that the crtbegin_so used by the APEX is targeting 29
1931 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1932 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1933}
1934
Jooyung Han03b51852020-02-26 22:45:42 +09001935func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001936 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001937 apex {
1938 name: "myapex",
1939 key: "myapex.key",
1940 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001941 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001942 }
1943
1944 apex_key {
1945 name: "myapex.key",
1946 public_key: "testkey.avbpubkey",
1947 private_key: "testkey.pem",
1948 }
1949
1950 cc_library {
1951 name: "libx",
1952 system_shared_libs: [],
1953 stl: "none",
1954 apex_available: [ "myapex" ],
1955 stubs: {
1956 versions: ["1", "2"],
1957 },
1958 }
1959
1960 cc_library {
1961 name: "libz",
1962 shared_libs: ["libx"],
1963 system_shared_libs: [],
1964 stl: "none",
1965 }
1966 `)
1967
1968 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001969 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001970 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1971 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1972 }
1973 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001974 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001975 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1976 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1977 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001978 expectLink("libz", "shared", "libx", "shared_current")
1979 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001980 expectNoLink("libz", "shared", "libz", "shared_1")
1981 expectNoLink("libz", "shared", "libz", "shared")
1982}
1983
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001984var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1985 func(variables android.FixtureProductVariables) {
1986 variables.SanitizeDevice = []string{"hwaddress"}
1987 },
1988)
1989
Jooyung Han75568392020-03-20 04:29:24 +09001990func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001991 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001992 apex {
1993 name: "myapex",
1994 key: "myapex.key",
1995 native_shared_libs: ["libx"],
1996 min_sdk_version: "29",
1997 }
1998
1999 apex_key {
2000 name: "myapex.key",
2001 public_key: "testkey.avbpubkey",
2002 private_key: "testkey.pem",
2003 }
2004
2005 cc_library {
2006 name: "libx",
2007 shared_libs: ["libbar"],
2008 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002009 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002010 }
2011
2012 cc_library {
2013 name: "libbar",
2014 stubs: {
2015 versions: ["29", "30"],
2016 },
2017 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002018 `,
2019 prepareForTestWithSantitizeHwaddress,
2020 )
Jooyung Han03b51852020-02-26 22:45:42 +09002021 expectLink := func(from, from_variant, to, to_variant string) {
2022 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2023 libFlags := ld.Args["libFlags"]
2024 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2025 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002026 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002027}
2028
Jooyung Han75568392020-03-20 04:29:24 +09002029func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002030 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002031 apex {
2032 name: "myapex",
2033 key: "myapex.key",
2034 native_shared_libs: ["libx"],
2035 min_sdk_version: "29",
2036 }
2037
2038 apex_key {
2039 name: "myapex.key",
2040 public_key: "testkey.avbpubkey",
2041 private_key: "testkey.pem",
2042 }
2043
2044 cc_library {
2045 name: "libx",
2046 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002047 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002048 }
Jooyung Han75568392020-03-20 04:29:24 +09002049 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002050
2051 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002052 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054 // note that platform variant is not.
2055 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002056 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002057}
2058
Jooyung Han749dc692020-04-15 11:03:39 +09002059func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2060 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002061 apex {
2062 name: "myapex",
2063 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002064 native_shared_libs: ["mylib"],
2065 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002066 }
2067
2068 apex_key {
2069 name: "myapex.key",
2070 public_key: "testkey.avbpubkey",
2071 private_key: "testkey.pem",
2072 }
Jooyung Han749dc692020-04-15 11:03:39 +09002073
2074 cc_library {
2075 name: "mylib",
2076 srcs: ["mylib.cpp"],
2077 system_shared_libs: [],
2078 stl: "none",
2079 apex_available: [
2080 "myapex",
2081 ],
2082 min_sdk_version: "30",
2083 }
2084 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002085
2086 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2087 apex {
2088 name: "myapex",
2089 key: "myapex.key",
2090 native_shared_libs: ["libfoo.ffi"],
2091 min_sdk_version: "29",
2092 }
2093
2094 apex_key {
2095 name: "myapex.key",
2096 public_key: "testkey.avbpubkey",
2097 private_key: "testkey.pem",
2098 }
2099
2100 rust_ffi_shared {
2101 name: "libfoo.ffi",
2102 srcs: ["foo.rs"],
2103 crate_name: "foo",
2104 apex_available: [
2105 "myapex",
2106 ],
2107 min_sdk_version: "30",
2108 }
2109 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002110
2111 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2112 apex {
2113 name: "myapex",
2114 key: "myapex.key",
2115 java_libs: ["libfoo"],
2116 min_sdk_version: "29",
2117 }
2118
2119 apex_key {
2120 name: "myapex.key",
2121 public_key: "testkey.avbpubkey",
2122 private_key: "testkey.pem",
2123 }
2124
2125 java_import {
2126 name: "libfoo",
2127 jars: ["libfoo.jar"],
2128 apex_available: [
2129 "myapex",
2130 ],
2131 min_sdk_version: "30",
2132 }
2133 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002134}
2135
2136func TestApexMinSdkVersion_Okay(t *testing.T) {
2137 testApex(t, `
2138 apex {
2139 name: "myapex",
2140 key: "myapex.key",
2141 native_shared_libs: ["libfoo"],
2142 java_libs: ["libbar"],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex_key {
2147 name: "myapex.key",
2148 public_key: "testkey.avbpubkey",
2149 private_key: "testkey.pem",
2150 }
2151
2152 cc_library {
2153 name: "libfoo",
2154 srcs: ["mylib.cpp"],
2155 shared_libs: ["libfoo_dep"],
2156 apex_available: ["myapex"],
2157 min_sdk_version: "29",
2158 }
2159
2160 cc_library {
2161 name: "libfoo_dep",
2162 srcs: ["mylib.cpp"],
2163 apex_available: ["myapex"],
2164 min_sdk_version: "29",
2165 }
2166
2167 java_library {
2168 name: "libbar",
2169 sdk_version: "current",
2170 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002171 static_libs: [
2172 "libbar_dep",
2173 "libbar_import_dep",
2174 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 apex_available: ["myapex"],
2176 min_sdk_version: "29",
2177 }
2178
2179 java_library {
2180 name: "libbar_dep",
2181 sdk_version: "current",
2182 srcs: ["a.java"],
2183 apex_available: ["myapex"],
2184 min_sdk_version: "29",
2185 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002186
2187 java_import {
2188 name: "libbar_import_dep",
2189 jars: ["libbar.jar"],
2190 apex_available: ["myapex"],
2191 min_sdk_version: "29",
2192 }
Jooyung Han03b51852020-02-26 22:45:42 +09002193 `)
2194}
2195
Artur Satayev8cf899a2020-04-15 17:29:42 +01002196func TestJavaStableSdkVersion(t *testing.T) {
2197 testCases := []struct {
2198 name string
2199 expectedError string
2200 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002201 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002202 }{
2203 {
2204 name: "Non-updatable apex with non-stable dep",
2205 bp: `
2206 apex {
2207 name: "myapex",
2208 java_libs: ["myjar"],
2209 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002210 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002211 }
2212 apex_key {
2213 name: "myapex.key",
2214 public_key: "testkey.avbpubkey",
2215 private_key: "testkey.pem",
2216 }
2217 java_library {
2218 name: "myjar",
2219 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002220 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002221 apex_available: ["myapex"],
2222 }
2223 `,
2224 },
2225 {
2226 name: "Updatable apex with stable dep",
2227 bp: `
2228 apex {
2229 name: "myapex",
2230 java_libs: ["myjar"],
2231 key: "myapex.key",
2232 updatable: true,
2233 min_sdk_version: "29",
2234 }
2235 apex_key {
2236 name: "myapex.key",
2237 public_key: "testkey.avbpubkey",
2238 private_key: "testkey.pem",
2239 }
2240 java_library {
2241 name: "myjar",
2242 srcs: ["foo/bar/MyClass.java"],
2243 sdk_version: "current",
2244 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002245 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002246 }
2247 `,
2248 },
2249 {
2250 name: "Updatable apex with non-stable dep",
2251 expectedError: "cannot depend on \"myjar\"",
2252 bp: `
2253 apex {
2254 name: "myapex",
2255 java_libs: ["myjar"],
2256 key: "myapex.key",
2257 updatable: true,
2258 }
2259 apex_key {
2260 name: "myapex.key",
2261 public_key: "testkey.avbpubkey",
2262 private_key: "testkey.pem",
2263 }
2264 java_library {
2265 name: "myjar",
2266 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002267 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002268 apex_available: ["myapex"],
2269 }
2270 `,
2271 },
2272 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002273 name: "Updatable apex with non-stable legacy core platform dep",
2274 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2275 bp: `
2276 apex {
2277 name: "myapex",
2278 java_libs: ["myjar-uses-legacy"],
2279 key: "myapex.key",
2280 updatable: true,
2281 }
2282 apex_key {
2283 name: "myapex.key",
2284 public_key: "testkey.avbpubkey",
2285 private_key: "testkey.pem",
2286 }
2287 java_library {
2288 name: "myjar-uses-legacy",
2289 srcs: ["foo/bar/MyClass.java"],
2290 sdk_version: "core_platform",
2291 apex_available: ["myapex"],
2292 }
2293 `,
2294 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2295 },
2296 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002297 name: "Updatable apex with non-stable transitive dep",
2298 // This is not actually detecting that the transitive dependency is unstable, rather it is
2299 // detecting that the transitive dependency is building against a wider API surface than the
2300 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002301 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002302 bp: `
2303 apex {
2304 name: "myapex",
2305 java_libs: ["myjar"],
2306 key: "myapex.key",
2307 updatable: true,
2308 }
2309 apex_key {
2310 name: "myapex.key",
2311 public_key: "testkey.avbpubkey",
2312 private_key: "testkey.pem",
2313 }
2314 java_library {
2315 name: "myjar",
2316 srcs: ["foo/bar/MyClass.java"],
2317 sdk_version: "current",
2318 apex_available: ["myapex"],
2319 static_libs: ["transitive-jar"],
2320 }
2321 java_library {
2322 name: "transitive-jar",
2323 srcs: ["foo/bar/MyClass.java"],
2324 sdk_version: "core_platform",
2325 apex_available: ["myapex"],
2326 }
2327 `,
2328 },
2329 }
2330
2331 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002332 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2333 continue
2334 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002335 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002336 errorHandler := android.FixtureExpectsNoErrors
2337 if test.expectedError != "" {
2338 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002339 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002340 android.GroupFixturePreparers(
2341 java.PrepareForTestWithJavaDefaultModules,
2342 PrepareForTestWithApexBuildComponents,
2343 prepareForTestWithMyapex,
2344 android.OptionalFixturePreparer(test.preparer),
2345 ).
2346 ExtendWithErrorHandler(errorHandler).
2347 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002348 })
2349 }
2350}
2351
Jooyung Han749dc692020-04-15 11:03:39 +09002352func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2353 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2354 apex {
2355 name: "myapex",
2356 key: "myapex.key",
2357 native_shared_libs: ["mylib"],
2358 min_sdk_version: "29",
2359 }
2360
2361 apex_key {
2362 name: "myapex.key",
2363 public_key: "testkey.avbpubkey",
2364 private_key: "testkey.pem",
2365 }
2366
2367 cc_library {
2368 name: "mylib",
2369 srcs: ["mylib.cpp"],
2370 shared_libs: ["mylib2"],
2371 system_shared_libs: [],
2372 stl: "none",
2373 apex_available: [
2374 "myapex",
2375 ],
2376 min_sdk_version: "29",
2377 }
2378
2379 // indirect part of the apex
2380 cc_library {
2381 name: "mylib2",
2382 srcs: ["mylib.cpp"],
2383 system_shared_libs: [],
2384 stl: "none",
2385 apex_available: [
2386 "myapex",
2387 ],
2388 min_sdk_version: "30",
2389 }
2390 `)
2391}
2392
2393func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2394 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2395 apex {
2396 name: "myapex",
2397 key: "myapex.key",
2398 apps: ["AppFoo"],
2399 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002400 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002401 }
2402
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408
2409 android_app {
2410 name: "AppFoo",
2411 srcs: ["foo/bar/MyClass.java"],
2412 sdk_version: "current",
2413 min_sdk_version: "29",
2414 system_modules: "none",
2415 stl: "none",
2416 static_libs: ["bar"],
2417 apex_available: [ "myapex" ],
2418 }
2419
2420 java_library {
2421 name: "bar",
2422 sdk_version: "current",
2423 srcs: ["a.java"],
2424 apex_available: [ "myapex" ],
2425 }
2426 `)
2427}
2428
2429func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002430 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002431 apex {
2432 name: "myapex",
2433 key: "myapex.key",
2434 native_shared_libs: ["mylib"],
2435 min_sdk_version: "29",
2436 }
2437
2438 apex_key {
2439 name: "myapex.key",
2440 public_key: "testkey.avbpubkey",
2441 private_key: "testkey.pem",
2442 }
2443
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002444 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002445 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2446 cc_library {
2447 name: "mylib",
2448 srcs: ["mylib.cpp"],
2449 shared_libs: ["mylib2"],
2450 system_shared_libs: [],
2451 stl: "none",
2452 apex_available: ["myapex", "otherapex"],
2453 min_sdk_version: "29",
2454 }
2455
2456 cc_library {
2457 name: "mylib2",
2458 srcs: ["mylib.cpp"],
2459 system_shared_libs: [],
2460 stl: "none",
2461 apex_available: ["otherapex"],
2462 stubs: { versions: ["29", "30"] },
2463 min_sdk_version: "30",
2464 }
2465
2466 apex {
2467 name: "otherapex",
2468 key: "myapex.key",
2469 native_shared_libs: ["mylib", "mylib2"],
2470 min_sdk_version: "30",
2471 }
2472 `)
2473 expectLink := func(from, from_variant, to, to_variant string) {
2474 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2475 libFlags := ld.Args["libFlags"]
2476 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2477 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002478 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002479 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002480}
2481
Jooyung Haned124c32021-01-26 11:43:46 +09002482func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002483 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2484 func(variables android.FixtureProductVariables) {
2485 variables.Platform_sdk_codename = proptools.StringPtr("S")
2486 variables.Platform_version_active_codenames = []string{"S"}
2487 },
2488 )
Jooyung Haned124c32021-01-26 11:43:46 +09002489 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2490 apex {
2491 name: "myapex",
2492 key: "myapex.key",
2493 native_shared_libs: ["libfoo"],
2494 min_sdk_version: "S",
2495 }
2496 apex_key {
2497 name: "myapex.key",
2498 public_key: "testkey.avbpubkey",
2499 private_key: "testkey.pem",
2500 }
2501 cc_library {
2502 name: "libfoo",
2503 shared_libs: ["libbar"],
2504 apex_available: ["myapex"],
2505 min_sdk_version: "29",
2506 }
2507 cc_library {
2508 name: "libbar",
2509 apex_available: ["myapex"],
2510 }
2511 `, withSAsActiveCodeNames)
2512}
2513
2514func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002515 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2516 variables.Platform_sdk_codename = proptools.StringPtr("S")
2517 variables.Platform_version_active_codenames = []string{"S", "T"}
2518 })
Colin Cross1c460562021-02-16 17:55:47 -08002519 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002520 apex {
2521 name: "myapex",
2522 key: "myapex.key",
2523 native_shared_libs: ["libfoo"],
2524 min_sdk_version: "S",
2525 }
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531 cc_library {
2532 name: "libfoo",
2533 shared_libs: ["libbar"],
2534 apex_available: ["myapex"],
2535 min_sdk_version: "S",
2536 }
2537 cc_library {
2538 name: "libbar",
2539 stubs: {
2540 symbol_file: "libbar.map.txt",
2541 versions: ["30", "S", "T"],
2542 },
2543 }
2544 `, withSAsActiveCodeNames)
2545
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002546 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002547 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2548 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002549 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002550}
2551
Jiyong Park7c2ee712018-12-07 00:42:25 +09002552func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002553 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002554 apex {
2555 name: "myapex",
2556 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002557 native_shared_libs: ["mylib"],
2558 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002559 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002560 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002561 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002562 }
2563
2564 apex_key {
2565 name: "myapex.key",
2566 public_key: "testkey.avbpubkey",
2567 private_key: "testkey.pem",
2568 }
2569
2570 prebuilt_etc {
2571 name: "myetc",
2572 src: "myprebuilt",
2573 sub_dir: "foo/bar",
2574 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002575
2576 cc_library {
2577 name: "mylib",
2578 srcs: ["mylib.cpp"],
2579 relative_install_path: "foo/bar",
2580 system_shared_libs: [],
2581 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002582 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002583 }
2584
2585 cc_binary {
2586 name: "mybin",
2587 srcs: ["mylib.cpp"],
2588 relative_install_path: "foo/bar",
2589 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002590 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002591 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002592 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002593 `)
2594
Sundong Ahnabb64432019-10-22 13:58:29 +09002595 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002596 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002597
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002598 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002599 ensureContains(t, cmd, "/etc ")
2600 ensureContains(t, cmd, "/etc/foo ")
2601 ensureContains(t, cmd, "/etc/foo/bar ")
2602 ensureContains(t, cmd, "/lib64 ")
2603 ensureContains(t, cmd, "/lib64/foo ")
2604 ensureContains(t, cmd, "/lib64/foo/bar ")
2605 ensureContains(t, cmd, "/lib ")
2606 ensureContains(t, cmd, "/lib/foo ")
2607 ensureContains(t, cmd, "/lib/foo/bar ")
2608 ensureContains(t, cmd, "/bin ")
2609 ensureContains(t, cmd, "/bin/foo ")
2610 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002611}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002612
Jooyung Han35155c42020-02-06 17:33:20 +09002613func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002614 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002615 apex {
2616 name: "myapex",
2617 key: "myapex.key",
2618 multilib: {
2619 both: {
2620 native_shared_libs: ["mylib"],
2621 binaries: ["mybin"],
2622 },
2623 },
2624 compile_multilib: "both",
2625 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002626 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002627 }
2628
2629 apex_key {
2630 name: "myapex.key",
2631 public_key: "testkey.avbpubkey",
2632 private_key: "testkey.pem",
2633 }
2634
2635 cc_library {
2636 name: "mylib",
2637 relative_install_path: "foo/bar",
2638 system_shared_libs: [],
2639 stl: "none",
2640 apex_available: [ "myapex" ],
2641 native_bridge_supported: true,
2642 }
2643
2644 cc_binary {
2645 name: "mybin",
2646 relative_install_path: "foo/bar",
2647 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002648 stl: "none",
2649 apex_available: [ "myapex" ],
2650 native_bridge_supported: true,
2651 compile_multilib: "both", // default is "first" for binary
2652 multilib: {
2653 lib64: {
2654 suffix: "64",
2655 },
2656 },
2657 }
2658 `, withNativeBridgeEnabled)
2659 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2660 "bin/foo/bar/mybin",
2661 "bin/foo/bar/mybin64",
2662 "bin/arm/foo/bar/mybin",
2663 "bin/arm64/foo/bar/mybin64",
2664 "lib/foo/bar/mylib.so",
2665 "lib/arm/foo/bar/mylib.so",
2666 "lib64/foo/bar/mylib.so",
2667 "lib64/arm64/foo/bar/mylib.so",
2668 })
2669}
2670
Jooyung Han85d61762020-06-24 23:50:26 +09002671func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002672 result := android.GroupFixturePreparers(
2673 prepareForApexTest,
2674 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2675 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 binaries: ["mybin"],
2680 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002681 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002682 }
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688 cc_binary {
2689 name: "mybin",
2690 vendor: true,
2691 shared_libs: ["libfoo"],
2692 }
2693 cc_library {
2694 name: "libfoo",
2695 proprietary: true,
2696 }
2697 `)
2698
Colin Crossc68db4b2021-11-11 18:59:15 -08002699 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002700 "bin/mybin",
2701 "lib64/libfoo.so",
2702 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2703 "lib64/libc++.so",
2704 })
2705
Colin Crossc68db4b2021-11-11 18:59:15 -08002706 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2707 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002708 name := apexBundle.BaseModuleName()
2709 prefix := "TARGET_"
2710 var builder strings.Builder
2711 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002712 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002713 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002714 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002715
Colin Crossc68db4b2021-11-11 18:59:15 -08002716 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002717 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2718 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002719}
2720
Jooyung Hanc5a96762022-02-04 11:54:50 +09002721func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2722 testApexError(t, `Trying to include a VNDK library`, `
2723 apex {
2724 name: "myapex",
2725 key: "myapex.key",
2726 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2727 vendor: true,
2728 use_vndk_as_stable: true,
2729 updatable: false,
2730 }
2731 apex_key {
2732 name: "myapex.key",
2733 public_key: "testkey.avbpubkey",
2734 private_key: "testkey.pem",
2735 }`)
2736}
2737
Jooyung Handf78e212020-07-22 15:54:47 +09002738func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002739 // myapex myapex2
2740 // | |
2741 // mybin ------. mybin2
2742 // \ \ / |
2743 // (stable) .---\--------` |
2744 // \ / \ |
2745 // \ / \ /
2746 // libvndk libvendor
2747 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002748 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002749 apex {
2750 name: "myapex",
2751 key: "myapex.key",
2752 binaries: ["mybin"],
2753 vendor: true,
2754 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002755 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002756 }
2757 apex_key {
2758 name: "myapex.key",
2759 public_key: "testkey.avbpubkey",
2760 private_key: "testkey.pem",
2761 }
2762 cc_binary {
2763 name: "mybin",
2764 vendor: true,
2765 shared_libs: ["libvndk", "libvendor"],
2766 }
2767 cc_library {
2768 name: "libvndk",
2769 vndk: {
2770 enabled: true,
2771 },
2772 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002773 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002774 }
2775 cc_library {
2776 name: "libvendor",
2777 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002778 stl: "none",
2779 }
2780 apex {
2781 name: "myapex2",
2782 key: "myapex.key",
2783 binaries: ["mybin2"],
2784 vendor: true,
2785 use_vndk_as_stable: false,
2786 updatable: false,
2787 }
2788 cc_binary {
2789 name: "mybin2",
2790 vendor: true,
2791 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002792 }
2793 `)
2794
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002795 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002796
Jooyung Han91f92032022-02-04 12:36:33 +09002797 for _, tc := range []struct {
2798 name string
2799 apexName string
2800 moduleName string
2801 moduleVariant string
2802 libs []string
2803 contents []string
2804 requireVndkNamespace bool
2805 }{
2806 {
2807 name: "use_vndk_as_stable",
2808 apexName: "myapex",
2809 moduleName: "mybin",
2810 moduleVariant: vendorVariant + "_apex10000",
2811 libs: []string{
2812 // should link with vendor variants of VNDK libs(libvndk/libc++)
2813 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2814 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2815 // unstable Vendor libs as APEX variant
2816 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2817 },
2818 contents: []string{
2819 "bin/mybin",
2820 "lib64/libvendor.so",
2821 // VNDK libs (libvndk/libc++) are not included
2822 },
2823 requireVndkNamespace: true,
2824 },
2825 {
2826 name: "!use_vndk_as_stable",
2827 apexName: "myapex2",
2828 moduleName: "mybin2",
2829 moduleVariant: vendorVariant + "_myapex2",
2830 libs: []string{
2831 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2832 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2833 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2834 // unstable vendor libs have "merged" APEX variants
2835 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2836 },
2837 contents: []string{
2838 "bin/mybin2",
2839 "lib64/libvendor.so",
2840 // VNDK libs are included as well
2841 "lib64/libvndk.so",
2842 "lib64/libc++.so",
2843 },
2844 requireVndkNamespace: false,
2845 },
2846 } {
2847 t.Run(tc.name, func(t *testing.T) {
2848 // Check linked libs
2849 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2850 libs := names(ldRule.Args["libFlags"])
2851 for _, lib := range tc.libs {
2852 ensureListContains(t, libs, lib)
2853 }
2854 // Check apex contents
2855 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002856
Jooyung Han91f92032022-02-04 12:36:33 +09002857 // Check "requireNativeLibs"
2858 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2859 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2860 if tc.requireVndkNamespace {
2861 ensureListContains(t, requireNativeLibs, ":vndk")
2862 } else {
2863 ensureListNotContains(t, requireNativeLibs, ":vndk")
2864 }
2865 })
2866 }
Jooyung Handf78e212020-07-22 15:54:47 +09002867}
2868
Justin Yun13decfb2021-03-08 19:25:55 +09002869func TestProductVariant(t *testing.T) {
2870 ctx := testApex(t, `
2871 apex {
2872 name: "myapex",
2873 key: "myapex.key",
2874 updatable: false,
2875 product_specific: true,
2876 binaries: ["foo"],
2877 }
2878
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884
2885 cc_binary {
2886 name: "foo",
2887 product_available: true,
2888 apex_available: ["myapex"],
2889 srcs: ["foo.cpp"],
2890 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002891 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2892 variables.ProductVndkVersion = proptools.StringPtr("current")
2893 }),
2894 )
Justin Yun13decfb2021-03-08 19:25:55 +09002895
2896 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002897 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002898 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2899 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2900 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2901 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2902}
2903
Jooyung Han8e5685d2020-09-21 11:02:57 +09002904func TestApex_withPrebuiltFirmware(t *testing.T) {
2905 testCases := []struct {
2906 name string
2907 additionalProp string
2908 }{
2909 {"system apex with prebuilt_firmware", ""},
2910 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2911 }
2912 for _, tc := range testCases {
2913 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002914 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002919 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002920 `+tc.additionalProp+`
2921 }
2922 apex_key {
2923 name: "myapex.key",
2924 public_key: "testkey.avbpubkey",
2925 private_key: "testkey.pem",
2926 }
2927 prebuilt_firmware {
2928 name: "myfirmware",
2929 src: "myfirmware.bin",
2930 filename_from_src: true,
2931 `+tc.additionalProp+`
2932 }
2933 `)
2934 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2935 "etc/firmware/myfirmware.bin",
2936 })
2937 })
2938 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002939}
2940
Jooyung Hanefb184e2020-06-25 17:14:25 +09002941func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 vendor: true,
2947 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002949 }
2950
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956
2957 cc_library {
2958 name: "mylib",
2959 vendor_available: true,
2960 }
2961 `)
2962
2963 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002964 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002965 name := apexBundle.BaseModuleName()
2966 prefix := "TARGET_"
2967 var builder strings.Builder
2968 data.Custom(&builder, name, prefix, "", data)
2969 androidMk := builder.String()
2970 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2971}
2972
Jooyung Han2ed99d02020-06-24 23:26:26 +09002973func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002974 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002975 apex {
2976 name: "myapex",
2977 key: "myapex.key",
2978 vintf_fragments: ["fragment.xml"],
2979 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002980 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002981 }
2982 apex_key {
2983 name: "myapex.key",
2984 public_key: "testkey.avbpubkey",
2985 private_key: "testkey.pem",
2986 }
2987 cc_binary {
2988 name: "mybin",
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002999 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003000 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003001}
3002
Jiyong Park16e91a02018-12-20 18:18:08 +09003003func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003004 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003005 apex {
3006 name: "myapex",
3007 key: "myapex.key",
3008 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003010 }
3011
3012 apex_key {
3013 name: "myapex.key",
3014 public_key: "testkey.avbpubkey",
3015 private_key: "testkey.pem",
3016 }
3017
3018 cc_library {
3019 name: "mylib",
3020 srcs: ["mylib.cpp"],
3021 system_shared_libs: [],
3022 stl: "none",
3023 stubs: {
3024 versions: ["1", "2", "3"],
3025 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003026 apex_available: [
3027 "//apex_available:platform",
3028 "myapex",
3029 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003030 }
3031
3032 cc_binary {
3033 name: "not_in_apex",
3034 srcs: ["mylib.cpp"],
3035 static_libs: ["mylib"],
3036 static_executable: true,
3037 system_shared_libs: [],
3038 stl: "none",
3039 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003040 `)
3041
Colin Cross7113d202019-11-20 16:39:12 -08003042 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003043
3044 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003045 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003046}
Jiyong Park9335a262018-12-24 11:31:58 +09003047
3048func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003049 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003050 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003051 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003052 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003053 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003054 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003055 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003056 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003057 }
3058
3059 cc_library {
3060 name: "mylib",
3061 srcs: ["mylib.cpp"],
3062 system_shared_libs: [],
3063 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003064 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003065 }
3066
3067 apex_key {
3068 name: "myapex.key",
3069 public_key: "testkey.avbpubkey",
3070 private_key: "testkey.pem",
3071 }
3072
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003073 android_app_certificate {
3074 name: "myapex.certificate",
3075 certificate: "testkey",
3076 }
3077
3078 android_app_certificate {
3079 name: "myapex.certificate.override",
3080 certificate: "testkey.override",
3081 }
3082
Jiyong Park9335a262018-12-24 11:31:58 +09003083 `)
3084
3085 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003086 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003087
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003088 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3089 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003090 "vendor/foo/devkeys/testkey.avbpubkey")
3091 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003092 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3093 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003094 "vendor/foo/devkeys/testkey.pem")
3095 }
3096
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003097 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003098 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003099 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003100 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003101 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003102 }
3103}
Jiyong Park58e364a2019-01-19 19:24:06 +09003104
Jooyung Hanf121a652019-12-17 14:30:11 +09003105func TestCertificate(t *testing.T) {
3106 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003107 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003108 apex {
3109 name: "myapex",
3110 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003111 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003112 }
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }`)
3118 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3119 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3120 if actual := rule.Args["certificates"]; actual != expected {
3121 t.Errorf("certificates should be %q, not %q", expected, actual)
3122 }
3123 })
3124 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003125 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003126 apex {
3127 name: "myapex_keytest",
3128 key: "myapex.key",
3129 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003130 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003131 }
3132 apex_key {
3133 name: "myapex.key",
3134 public_key: "testkey.avbpubkey",
3135 private_key: "testkey.pem",
3136 }
3137 android_app_certificate {
3138 name: "myapex.certificate.override",
3139 certificate: "testkey.override",
3140 }`)
3141 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3142 expected := "testkey.override.x509.pem testkey.override.pk8"
3143 if actual := rule.Args["certificates"]; actual != expected {
3144 t.Errorf("certificates should be %q, not %q", expected, actual)
3145 }
3146 })
3147 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003148 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003149 apex {
3150 name: "myapex",
3151 key: "myapex.key",
3152 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003153 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003154 }
3155 apex_key {
3156 name: "myapex.key",
3157 public_key: "testkey.avbpubkey",
3158 private_key: "testkey.pem",
3159 }
3160 android_app_certificate {
3161 name: "myapex.certificate",
3162 certificate: "testkey",
3163 }`)
3164 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3165 expected := "testkey.x509.pem testkey.pk8"
3166 if actual := rule.Args["certificates"]; actual != expected {
3167 t.Errorf("certificates should be %q, not %q", expected, actual)
3168 }
3169 })
3170 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003171 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003172 apex {
3173 name: "myapex_keytest",
3174 key: "myapex.key",
3175 file_contexts: ":myapex-file_contexts",
3176 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003177 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 }
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184 android_app_certificate {
3185 name: "myapex.certificate.override",
3186 certificate: "testkey.override",
3187 }`)
3188 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3189 expected := "testkey.override.x509.pem testkey.override.pk8"
3190 if actual := rule.Args["certificates"]; actual != expected {
3191 t.Errorf("certificates should be %q, not %q", expected, actual)
3192 }
3193 })
3194 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003195 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003196 apex {
3197 name: "myapex",
3198 key: "myapex.key",
3199 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003200 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 }
3202 apex_key {
3203 name: "myapex.key",
3204 public_key: "testkey.avbpubkey",
3205 private_key: "testkey.pem",
3206 }`)
3207 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3208 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3209 if actual := rule.Args["certificates"]; actual != expected {
3210 t.Errorf("certificates should be %q, not %q", expected, actual)
3211 }
3212 })
3213 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003214 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003215 apex {
3216 name: "myapex_keytest",
3217 key: "myapex.key",
3218 file_contexts: ":myapex-file_contexts",
3219 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003220 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003221 }
3222 apex_key {
3223 name: "myapex.key",
3224 public_key: "testkey.avbpubkey",
3225 private_key: "testkey.pem",
3226 }
3227 android_app_certificate {
3228 name: "myapex.certificate.override",
3229 certificate: "testkey.override",
3230 }`)
3231 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3232 expected := "testkey.override.x509.pem testkey.override.pk8"
3233 if actual := rule.Args["certificates"]; actual != expected {
3234 t.Errorf("certificates should be %q, not %q", expected, actual)
3235 }
3236 })
3237}
3238
Jiyong Park58e364a2019-01-19 19:24:06 +09003239func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003240 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003241 apex {
3242 name: "myapex",
3243 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003244 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003245 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003246 }
3247
3248 apex {
3249 name: "otherapex",
3250 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003251 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003252 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003253 }
3254
3255 apex_key {
3256 name: "myapex.key",
3257 public_key: "testkey.avbpubkey",
3258 private_key: "testkey.pem",
3259 }
3260
3261 cc_library {
3262 name: "mylib",
3263 srcs: ["mylib.cpp"],
3264 system_shared_libs: [],
3265 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003266 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003267 "myapex",
3268 "otherapex",
3269 ],
Jooyung Han24282772020-03-21 23:20:55 +09003270 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003271 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003272 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 cc_library {
3274 name: "mylib2",
3275 srcs: ["mylib.cpp"],
3276 system_shared_libs: [],
3277 stl: "none",
3278 apex_available: [
3279 "myapex",
3280 "otherapex",
3281 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003282 static_libs: ["mylib3"],
3283 recovery_available: true,
3284 min_sdk_version: "29",
3285 }
3286 cc_library {
3287 name: "mylib3",
3288 srcs: ["mylib.cpp"],
3289 system_shared_libs: [],
3290 stl: "none",
3291 apex_available: [
3292 "myapex",
3293 "otherapex",
3294 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003295 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003296 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003297 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003298 `)
3299
Jooyung Hanc87a0592020-03-02 17:44:33 +09003300 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003301 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003302 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003303 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003304
Jooyung Hanccce2f22020-03-07 03:45:53 +09003305 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003306 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003307 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003308 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003309
Jooyung Hanccce2f22020-03-07 03:45:53 +09003310 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003311 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003312 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003313 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003314
Colin Crossaede88c2020-08-11 12:17:01 -07003315 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3316 // each variant defines additional macros to distinguish which apex variant it is built for
3317
3318 // non-APEX variant does not have __ANDROID_APEX__ defined
3319 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3321
Dan Albertb19953d2020-11-17 15:29:36 -08003322 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003323 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3324 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003325 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003326
Jooyung Hanc87a0592020-03-02 17:44:33 +09003327 // non-APEX variant does not have __ANDROID_APEX__ defined
3328 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3329 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3330
Dan Albertb19953d2020-11-17 15:29:36 -08003331 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003332 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003333 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003334 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003335}
Jiyong Park7e636d02019-01-28 16:16:54 +09003336
3337func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003338 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003339 apex {
3340 name: "myapex",
3341 key: "myapex.key",
3342 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003343 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003344 }
3345
3346 apex_key {
3347 name: "myapex.key",
3348 public_key: "testkey.avbpubkey",
3349 private_key: "testkey.pem",
3350 }
3351
3352 cc_library_headers {
3353 name: "mylib_headers",
3354 export_include_dirs: ["my_include"],
3355 system_shared_libs: [],
3356 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003357 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003358 }
3359
3360 cc_library {
3361 name: "mylib",
3362 srcs: ["mylib.cpp"],
3363 system_shared_libs: [],
3364 stl: "none",
3365 header_libs: ["mylib_headers"],
3366 export_header_lib_headers: ["mylib_headers"],
3367 stubs: {
3368 versions: ["1", "2", "3"],
3369 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003370 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003371 }
3372
3373 cc_library {
3374 name: "otherlib",
3375 srcs: ["mylib.cpp"],
3376 system_shared_libs: [],
3377 stl: "none",
3378 shared_libs: ["mylib"],
3379 }
3380 `)
3381
Colin Cross7113d202019-11-20 16:39:12 -08003382 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003383
3384 // Ensure that the include path of the header lib is exported to 'otherlib'
3385 ensureContains(t, cFlags, "-Imy_include")
3386}
Alex Light9670d332019-01-29 18:07:33 -08003387
Jiyong Park7cd10e32020-01-14 09:22:18 +09003388type fileInApex struct {
3389 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003390 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003391 isLink bool
3392}
3393
Jooyung Hana57af4a2020-01-23 05:36:59 +00003394func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003395 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003396 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003397 copyCmds := apexRule.Args["copy_commands"]
3398 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003399 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003400 for _, cmd := range strings.Split(copyCmds, "&&") {
3401 cmd = strings.TrimSpace(cmd)
3402 if cmd == "" {
3403 continue
3404 }
3405 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003406 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003407 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003408 switch terms[0] {
3409 case "mkdir":
3410 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003411 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003412 t.Fatal("copyCmds contains invalid cp command", cmd)
3413 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003414 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003415 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003416 isLink = false
3417 case "ln":
3418 if len(terms) != 3 && len(terms) != 4 {
3419 // ln LINK TARGET or ln -s LINK TARGET
3420 t.Fatal("copyCmds contains invalid ln command", cmd)
3421 }
3422 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003423 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003424 isLink = true
3425 default:
3426 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3427 }
3428 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 index := strings.Index(dst, imageApexDir)
3430 if index == -1 {
3431 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3432 }
3433 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003434 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003435 }
3436 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003437 return ret
3438}
3439
Jooyung Hana57af4a2020-01-23 05:36:59 +00003440func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3441 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003442 var failed bool
3443 var surplus []string
3444 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003445 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003446 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003447 for _, expected := range files {
3448 if matched, _ := path.Match(expected, file.path); matched {
3449 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003450 mactchFound = true
3451 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003452 }
3453 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003454 if !mactchFound {
3455 surplus = append(surplus, file.path)
3456 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003457 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003458
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003460 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003461 t.Log("surplus files", surplus)
3462 failed = true
3463 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003464
3465 if len(files) > len(filesMatched) {
3466 var missing []string
3467 for _, expected := range files {
3468 if !filesMatched[expected] {
3469 missing = append(missing, expected)
3470 }
3471 }
3472 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003473 t.Log("missing files", missing)
3474 failed = true
3475 }
3476 if failed {
3477 t.Fail()
3478 }
3479}
3480
Jooyung Han344d5432019-08-23 11:17:39 +09003481func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003482 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003484 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003485 "etc/llndk.libraries.29.txt",
3486 "etc/vndkcore.libraries.29.txt",
3487 "etc/vndksp.libraries.29.txt",
3488 "etc/vndkprivate.libraries.29.txt",
3489 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003490 }
3491 testCases := []struct {
3492 vndkVersion string
3493 expectedFiles []string
3494 }{
3495 {
3496 vndkVersion: "current",
3497 expectedFiles: append(commonFiles,
3498 "lib/libvndk.so",
3499 "lib/libvndksp.so",
3500 "lib64/libvndk.so",
3501 "lib64/libvndksp.so"),
3502 },
3503 {
3504 vndkVersion: "",
3505 expectedFiles: append(commonFiles,
3506 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3507 "lib/libvndksp.so",
3508 "lib64/libvndksp.so"),
3509 },
3510 }
3511 for _, tc := range testCases {
3512 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3513 ctx := testApex(t, `
3514 apex_vndk {
3515 name: "com.android.vndk.current",
3516 key: "com.android.vndk.current.key",
3517 updatable: false,
3518 }
3519
3520 apex_key {
3521 name: "com.android.vndk.current.key",
3522 public_key: "testkey.avbpubkey",
3523 private_key: "testkey.pem",
3524 }
3525
3526 cc_library {
3527 name: "libvndk",
3528 srcs: ["mylib.cpp"],
3529 vendor_available: true,
3530 product_available: true,
3531 vndk: {
3532 enabled: true,
3533 },
3534 system_shared_libs: [],
3535 stl: "none",
3536 apex_available: [ "com.android.vndk.current" ],
3537 }
3538
3539 cc_library {
3540 name: "libvndksp",
3541 srcs: ["mylib.cpp"],
3542 vendor_available: true,
3543 product_available: true,
3544 vndk: {
3545 enabled: true,
3546 support_system_process: true,
3547 },
3548 system_shared_libs: [],
3549 stl: "none",
3550 apex_available: [ "com.android.vndk.current" ],
3551 }
3552
3553 // VNDK-Ext should not cause any problems
3554
3555 cc_library {
3556 name: "libvndk.ext",
3557 srcs: ["mylib2.cpp"],
3558 vendor: true,
3559 vndk: {
3560 enabled: true,
3561 extends: "libvndk",
3562 },
3563 system_shared_libs: [],
3564 stl: "none",
3565 }
3566
3567 cc_library {
3568 name: "libvndksp.ext",
3569 srcs: ["mylib2.cpp"],
3570 vendor: true,
3571 vndk: {
3572 enabled: true,
3573 support_system_process: true,
3574 extends: "libvndksp",
3575 },
3576 system_shared_libs: [],
3577 stl: "none",
3578 }
3579 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3580 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3581 }))
3582 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3583 })
3584 }
Jooyung Han344d5432019-08-23 11:17:39 +09003585}
3586
3587func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003588 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003589 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003590 name: "com.android.vndk.current",
3591 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003592 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003593 }
3594
3595 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003596 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003597 public_key: "testkey.avbpubkey",
3598 private_key: "testkey.pem",
3599 }
3600
3601 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003602 name: "libvndk",
3603 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003604 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003605 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003606 vndk: {
3607 enabled: true,
3608 },
3609 system_shared_libs: [],
3610 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003611 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003612 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003613
3614 cc_prebuilt_library_shared {
3615 name: "libvndk.arm",
3616 srcs: ["libvndk.arm.so"],
3617 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003618 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003619 vndk: {
3620 enabled: true,
3621 },
3622 enabled: false,
3623 arch: {
3624 arm: {
3625 enabled: true,
3626 },
3627 },
3628 system_shared_libs: [],
3629 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003630 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003632 `+vndkLibrariesTxtFiles("current"),
3633 withFiles(map[string][]byte{
3634 "libvndk.so": nil,
3635 "libvndk.arm.so": nil,
3636 }))
Colin Cross2807f002021-03-02 10:15:29 -08003637 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003638 "lib/libvndk.so",
3639 "lib/libvndk.arm.so",
3640 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003641 "lib/libc++.so",
3642 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003644 })
Jooyung Han344d5432019-08-23 11:17:39 +09003645}
3646
Jooyung Han39edb6c2019-11-06 16:53:07 +09003647func vndkLibrariesTxtFiles(vers ...string) (result string) {
3648 for _, v := range vers {
3649 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003650 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003651 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003652 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003653 name: "` + txt + `.libraries.txt",
3654 }
3655 `
3656 }
3657 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003658 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003659 result += `
3660 prebuilt_etc {
3661 name: "` + txt + `.libraries.` + v + `.txt",
3662 src: "dummy.txt",
3663 }
3664 `
3665 }
3666 }
3667 }
3668 return
3669}
3670
Jooyung Han344d5432019-08-23 11:17:39 +09003671func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003672 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003673 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003674 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003675 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003676 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003677 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003678 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003679 }
3680
3681 apex_key {
3682 name: "myapex.key",
3683 public_key: "testkey.avbpubkey",
3684 private_key: "testkey.pem",
3685 }
3686
Jooyung Han31c470b2019-10-18 16:26:59 +09003687 vndk_prebuilt_shared {
3688 name: "libvndk27",
3689 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003690 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003691 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003692 vndk: {
3693 enabled: true,
3694 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003695 target_arch: "arm64",
3696 arch: {
3697 arm: {
3698 srcs: ["libvndk27_arm.so"],
3699 },
3700 arm64: {
3701 srcs: ["libvndk27_arm64.so"],
3702 },
3703 },
Colin Cross2807f002021-03-02 10:15:29 -08003704 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003705 }
3706
3707 vndk_prebuilt_shared {
3708 name: "libvndk27",
3709 version: "27",
3710 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003711 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003712 vndk: {
3713 enabled: true,
3714 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 target_arch: "x86_64",
3716 arch: {
3717 x86: {
3718 srcs: ["libvndk27_x86.so"],
3719 },
3720 x86_64: {
3721 srcs: ["libvndk27_x86_64.so"],
3722 },
3723 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003724 }
3725 `+vndkLibrariesTxtFiles("27"),
3726 withFiles(map[string][]byte{
3727 "libvndk27_arm.so": nil,
3728 "libvndk27_arm64.so": nil,
3729 "libvndk27_x86.so": nil,
3730 "libvndk27_x86_64.so": nil,
3731 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003732
Colin Cross2807f002021-03-02 10:15:29 -08003733 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003734 "lib/libvndk27_arm.so",
3735 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003736 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003737 })
Jooyung Han344d5432019-08-23 11:17:39 +09003738}
3739
Jooyung Han90eee022019-10-01 20:02:42 +09003740func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003741 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003742 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003743 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003744 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003745 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003746 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003747 }
3748 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003749 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003750 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003751 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003752 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003753 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003754 }
3755 apex_key {
3756 name: "myapex.key",
3757 public_key: "testkey.avbpubkey",
3758 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003759 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003760
3761 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003762 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003763 actual := proptools.String(bundle.properties.Apex_name)
3764 if !reflect.DeepEqual(actual, expected) {
3765 t.Errorf("Got '%v', expected '%v'", actual, expected)
3766 }
3767 }
3768
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003769 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003770 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003771}
3772
Jooyung Han344d5432019-08-23 11:17:39 +09003773func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003774 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003775 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003776 name: "com.android.vndk.current",
3777 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003778 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003779 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003780 }
3781
3782 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003783 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003784 public_key: "testkey.avbpubkey",
3785 private_key: "testkey.pem",
3786 }
3787
3788 cc_library {
3789 name: "libvndk",
3790 srcs: ["mylib.cpp"],
3791 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003792 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003793 native_bridge_supported: true,
3794 host_supported: true,
3795 vndk: {
3796 enabled: true,
3797 },
3798 system_shared_libs: [],
3799 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003800 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003801 }
Colin Cross2807f002021-03-02 10:15:29 -08003802 `+vndkLibrariesTxtFiles("current"),
3803 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003804
Colin Cross2807f002021-03-02 10:15:29 -08003805 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 "lib/libvndk.so",
3807 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003808 "lib/libc++.so",
3809 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003810 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 })
Jooyung Han344d5432019-08-23 11:17:39 +09003812}
3813
3814func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003815 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003816 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003817 name: "com.android.vndk.current",
3818 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003819 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003820 native_bridge_supported: true,
3821 }
3822
3823 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003824 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003825 public_key: "testkey.avbpubkey",
3826 private_key: "testkey.pem",
3827 }
3828
3829 cc_library {
3830 name: "libvndk",
3831 srcs: ["mylib.cpp"],
3832 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003833 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003834 native_bridge_supported: true,
3835 host_supported: true,
3836 vndk: {
3837 enabled: true,
3838 },
3839 system_shared_libs: [],
3840 stl: "none",
3841 }
3842 `)
3843}
3844
Jooyung Han31c470b2019-10-18 16:26:59 +09003845func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003846 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003848 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003850 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003852 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 }
3854
3855 apex_key {
3856 name: "myapex.key",
3857 public_key: "testkey.avbpubkey",
3858 private_key: "testkey.pem",
3859 }
3860
3861 vndk_prebuilt_shared {
3862 name: "libvndk27",
3863 version: "27",
3864 target_arch: "arm",
3865 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003866 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 vndk: {
3868 enabled: true,
3869 },
3870 arch: {
3871 arm: {
3872 srcs: ["libvndk27.so"],
3873 }
3874 },
3875 }
3876
3877 vndk_prebuilt_shared {
3878 name: "libvndk27",
3879 version: "27",
3880 target_arch: "arm",
3881 binder32bit: true,
3882 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003883 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 vndk: {
3885 enabled: true,
3886 },
3887 arch: {
3888 arm: {
3889 srcs: ["libvndk27binder32.so"],
3890 }
3891 },
Colin Cross2807f002021-03-02 10:15:29 -08003892 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003894 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003895 withFiles(map[string][]byte{
3896 "libvndk27.so": nil,
3897 "libvndk27binder32.so": nil,
3898 }),
3899 withBinder32bit,
3900 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003901 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003902 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3903 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 },
3905 }),
3906 )
3907
Colin Cross2807f002021-03-02 10:15:29 -08003908 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 })
3912}
3913
Jooyung Han45a96772020-06-15 14:59:42 +09003914func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003915 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003916 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003917 name: "com.android.vndk.current",
3918 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003919 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003920 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003921 }
3922
3923 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003924 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003925 public_key: "testkey.avbpubkey",
3926 private_key: "testkey.pem",
3927 }
3928
3929 cc_library {
3930 name: "libz",
3931 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003932 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003933 vndk: {
3934 enabled: true,
3935 },
3936 stubs: {
3937 symbol_file: "libz.map.txt",
3938 versions: ["30"],
3939 }
3940 }
3941 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3942 "libz.map.txt": nil,
3943 }))
3944
Colin Cross2807f002021-03-02 10:15:29 -08003945 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003946 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3947 ensureListEmpty(t, provideNativeLibs)
3948}
3949
Jooyung Hane1633032019-08-01 17:41:43 +09003950func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003951 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003952 apex {
3953 name: "myapex_nodep",
3954 key: "myapex.key",
3955 native_shared_libs: ["lib_nodep"],
3956 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003957 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003959 }
3960
3961 apex {
3962 name: "myapex_dep",
3963 key: "myapex.key",
3964 native_shared_libs: ["lib_dep"],
3965 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003966 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003967 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003968 }
3969
3970 apex {
3971 name: "myapex_provider",
3972 key: "myapex.key",
3973 native_shared_libs: ["libfoo"],
3974 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003975 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003976 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003977 }
3978
3979 apex {
3980 name: "myapex_selfcontained",
3981 key: "myapex.key",
3982 native_shared_libs: ["lib_dep", "libfoo"],
3983 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003984 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003985 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003986 }
3987
3988 apex_key {
3989 name: "myapex.key",
3990 public_key: "testkey.avbpubkey",
3991 private_key: "testkey.pem",
3992 }
3993
3994 cc_library {
3995 name: "lib_nodep",
3996 srcs: ["mylib.cpp"],
3997 system_shared_libs: [],
3998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003999 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004000 }
4001
4002 cc_library {
4003 name: "lib_dep",
4004 srcs: ["mylib.cpp"],
4005 shared_libs: ["libfoo"],
4006 system_shared_libs: [],
4007 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004008 apex_available: [
4009 "myapex_dep",
4010 "myapex_provider",
4011 "myapex_selfcontained",
4012 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004013 }
4014
4015 cc_library {
4016 name: "libfoo",
4017 srcs: ["mytest.cpp"],
4018 stubs: {
4019 versions: ["1"],
4020 },
4021 system_shared_libs: [],
4022 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004023 apex_available: [
4024 "myapex_provider",
4025 "myapex_selfcontained",
4026 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004027 }
4028 `)
4029
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004030 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004031 var provideNativeLibs, requireNativeLibs []string
4032
Sundong Ahnabb64432019-10-22 13:58:29 +09004033 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004034 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4035 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004036 ensureListEmpty(t, provideNativeLibs)
4037 ensureListEmpty(t, requireNativeLibs)
4038
Sundong Ahnabb64432019-10-22 13:58:29 +09004039 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004040 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4041 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004042 ensureListEmpty(t, provideNativeLibs)
4043 ensureListContains(t, requireNativeLibs, "libfoo.so")
4044
Sundong Ahnabb64432019-10-22 13:58:29 +09004045 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004046 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4047 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004048 ensureListContains(t, provideNativeLibs, "libfoo.so")
4049 ensureListEmpty(t, requireNativeLibs)
4050
Sundong Ahnabb64432019-10-22 13:58:29 +09004051 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004052 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4053 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004054 ensureListContains(t, provideNativeLibs, "libfoo.so")
4055 ensureListEmpty(t, requireNativeLibs)
4056}
4057
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004058func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004059 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004060 apex {
4061 name: "myapex",
4062 key: "myapex.key",
4063 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004064 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004065 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004066 }
4067
4068 apex_key {
4069 name: "myapex.key",
4070 public_key: "testkey.avbpubkey",
4071 private_key: "testkey.pem",
4072 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004073
4074 cc_library {
4075 name: "mylib",
4076 srcs: ["mylib.cpp"],
4077 system_shared_libs: [],
4078 stl: "none",
4079 apex_available: [
4080 "//apex_available:platform",
4081 "myapex",
4082 ],
4083 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004084 `)
4085
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004086 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087 apexManifestRule := module.Rule("apexManifestRule")
4088 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4089 apexRule := module.Rule("apexRule")
4090 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004091
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004092 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004093 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004094 name := apexBundle.BaseModuleName()
4095 prefix := "TARGET_"
4096 var builder strings.Builder
4097 data.Custom(&builder, name, prefix, "", data)
4098 androidMk := builder.String()
4099 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4100 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004101}
4102
Alex Light0851b882019-02-07 13:20:53 -08004103func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004104 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004105 apex {
4106 name: "myapex",
4107 key: "myapex.key",
4108 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004109 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004110 }
4111
4112 apex_key {
4113 name: "myapex.key",
4114 public_key: "testkey.avbpubkey",
4115 private_key: "testkey.pem",
4116 }
4117
4118 cc_library {
4119 name: "mylib_common",
4120 srcs: ["mylib.cpp"],
4121 system_shared_libs: [],
4122 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004123 apex_available: [
4124 "//apex_available:platform",
4125 "myapex",
4126 ],
Alex Light0851b882019-02-07 13:20:53 -08004127 }
4128 `)
4129
Sundong Ahnabb64432019-10-22 13:58:29 +09004130 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004131 apexRule := module.Rule("apexRule")
4132 copyCmds := apexRule.Args["copy_commands"]
4133
4134 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4135 t.Log("Apex was a test apex!")
4136 t.Fail()
4137 }
4138 // Ensure that main rule creates an output
4139 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4140
4141 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004142 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004143
4144 // Ensure that both direct and indirect deps are copied into apex
4145 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4146
Colin Cross7113d202019-11-20 16:39:12 -08004147 // Ensure that the platform variant ends with _shared
4148 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004149
Colin Cross56a83212020-09-15 18:30:11 -07004150 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004151 t.Log("Found mylib_common not in any apex!")
4152 t.Fail()
4153 }
4154}
4155
4156func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004157 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004158 apex_test {
4159 name: "myapex",
4160 key: "myapex.key",
4161 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004162 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004163 }
4164
4165 apex_key {
4166 name: "myapex.key",
4167 public_key: "testkey.avbpubkey",
4168 private_key: "testkey.pem",
4169 }
4170
4171 cc_library {
4172 name: "mylib_common_test",
4173 srcs: ["mylib.cpp"],
4174 system_shared_libs: [],
4175 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004176 // TODO: remove //apex_available:platform
4177 apex_available: [
4178 "//apex_available:platform",
4179 "myapex",
4180 ],
Alex Light0851b882019-02-07 13:20:53 -08004181 }
4182 `)
4183
Sundong Ahnabb64432019-10-22 13:58:29 +09004184 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004185 apexRule := module.Rule("apexRule")
4186 copyCmds := apexRule.Args["copy_commands"]
4187
4188 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4189 t.Log("Apex was not a test apex!")
4190 t.Fail()
4191 }
4192 // Ensure that main rule creates an output
4193 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4194
4195 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004196 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004197
4198 // Ensure that both direct and indirect deps are copied into apex
4199 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4200
Colin Cross7113d202019-11-20 16:39:12 -08004201 // Ensure that the platform variant ends with _shared
4202 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004203}
4204
Alex Light9670d332019-01-29 18:07:33 -08004205func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004206 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004207 apex {
4208 name: "myapex",
4209 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004210 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004211 multilib: {
4212 first: {
4213 native_shared_libs: ["mylib_common"],
4214 }
4215 },
4216 target: {
4217 android: {
4218 multilib: {
4219 first: {
4220 native_shared_libs: ["mylib"],
4221 }
4222 }
4223 },
4224 host: {
4225 multilib: {
4226 first: {
4227 native_shared_libs: ["mylib2"],
4228 }
4229 }
4230 }
4231 }
4232 }
4233
4234 apex_key {
4235 name: "myapex.key",
4236 public_key: "testkey.avbpubkey",
4237 private_key: "testkey.pem",
4238 }
4239
4240 cc_library {
4241 name: "mylib",
4242 srcs: ["mylib.cpp"],
4243 system_shared_libs: [],
4244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004245 // TODO: remove //apex_available:platform
4246 apex_available: [
4247 "//apex_available:platform",
4248 "myapex",
4249 ],
Alex Light9670d332019-01-29 18:07:33 -08004250 }
4251
4252 cc_library {
4253 name: "mylib_common",
4254 srcs: ["mylib.cpp"],
4255 system_shared_libs: [],
4256 stl: "none",
4257 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004258 // TODO: remove //apex_available:platform
4259 apex_available: [
4260 "//apex_available:platform",
4261 "myapex",
4262 ],
Alex Light9670d332019-01-29 18:07:33 -08004263 }
4264
4265 cc_library {
4266 name: "mylib2",
4267 srcs: ["mylib.cpp"],
4268 system_shared_libs: [],
4269 stl: "none",
4270 compile_multilib: "first",
4271 }
4272 `)
4273
Sundong Ahnabb64432019-10-22 13:58:29 +09004274 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004275 copyCmds := apexRule.Args["copy_commands"]
4276
4277 // Ensure that main rule creates an output
4278 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4279
4280 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004281 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4282 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4283 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004284
4285 // Ensure that both direct and indirect deps are copied into apex
4286 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4287 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4288 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4289
Colin Cross7113d202019-11-20 16:39:12 -08004290 // Ensure that the platform variant ends with _shared
4291 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4292 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4293 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004294}
Jiyong Park04480cf2019-02-06 00:16:29 +09004295
Jiyong Park59140302020-12-14 18:44:04 +09004296func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004297 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004298 apex {
4299 name: "myapex",
4300 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004301 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004302 arch: {
4303 arm64: {
4304 native_shared_libs: ["mylib.arm64"],
4305 },
4306 x86_64: {
4307 native_shared_libs: ["mylib.x64"],
4308 },
4309 }
4310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 cc_library {
4319 name: "mylib.arm64",
4320 srcs: ["mylib.cpp"],
4321 system_shared_libs: [],
4322 stl: "none",
4323 // TODO: remove //apex_available:platform
4324 apex_available: [
4325 "//apex_available:platform",
4326 "myapex",
4327 ],
4328 }
4329
4330 cc_library {
4331 name: "mylib.x64",
4332 srcs: ["mylib.cpp"],
4333 system_shared_libs: [],
4334 stl: "none",
4335 // TODO: remove //apex_available:platform
4336 apex_available: [
4337 "//apex_available:platform",
4338 "myapex",
4339 ],
4340 }
4341 `)
4342
4343 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4344 copyCmds := apexRule.Args["copy_commands"]
4345
4346 // Ensure that apex variant is created for the direct dep
4347 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4348 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4349
4350 // Ensure that both direct and indirect deps are copied into apex
4351 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4352 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4353}
4354
Jiyong Park04480cf2019-02-06 00:16:29 +09004355func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004356 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004357 apex {
4358 name: "myapex",
4359 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004360 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004361 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004362 }
4363
4364 apex_key {
4365 name: "myapex.key",
4366 public_key: "testkey.avbpubkey",
4367 private_key: "testkey.pem",
4368 }
4369
4370 sh_binary {
4371 name: "myscript",
4372 src: "mylib.cpp",
4373 filename: "myscript.sh",
4374 sub_dir: "script",
4375 }
4376 `)
4377
Sundong Ahnabb64432019-10-22 13:58:29 +09004378 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004379 copyCmds := apexRule.Args["copy_commands"]
4380
4381 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4382}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004383
Jooyung Han91df2082019-11-20 01:49:42 +09004384func TestApexInVariousPartition(t *testing.T) {
4385 testcases := []struct {
4386 propName, parition, flattenedPartition string
4387 }{
4388 {"", "system", "system_ext"},
4389 {"product_specific: true", "product", "product"},
4390 {"soc_specific: true", "vendor", "vendor"},
4391 {"proprietary: true", "vendor", "vendor"},
4392 {"vendor: true", "vendor", "vendor"},
4393 {"system_ext_specific: true", "system_ext", "system_ext"},
4394 }
4395 for _, tc := range testcases {
4396 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004397 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004398 apex {
4399 name: "myapex",
4400 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004401 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004402 `+tc.propName+`
4403 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004404
Jooyung Han91df2082019-11-20 01:49:42 +09004405 apex_key {
4406 name: "myapex.key",
4407 public_key: "testkey.avbpubkey",
4408 private_key: "testkey.pem",
4409 }
4410 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004411
Jooyung Han91df2082019-11-20 01:49:42 +09004412 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004413 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4414 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004415 if actual != expected {
4416 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4417 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004418
Jooyung Han91df2082019-11-20 01:49:42 +09004419 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004420 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4421 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004422 if actual != expected {
4423 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4424 }
4425 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004426 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004427}
Jiyong Park67882562019-03-21 01:11:21 +09004428
Jooyung Han580eb4f2020-06-24 19:33:06 +09004429func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004430 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004431 apex {
4432 name: "myapex",
4433 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004434 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004436
Jooyung Han580eb4f2020-06-24 19:33:06 +09004437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004442 `)
4443 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004444 rule := module.Output("file_contexts")
4445 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4446}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004447
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004449 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004450 apex {
4451 name: "myapex",
4452 key: "myapex.key",
4453 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004454 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004455 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004456
Jooyung Han580eb4f2020-06-24 19:33:06 +09004457 apex_key {
4458 name: "myapex.key",
4459 public_key: "testkey.avbpubkey",
4460 private_key: "testkey.pem",
4461 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004462 `, withFiles(map[string][]byte{
4463 "my_own_file_contexts": nil,
4464 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004465}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004466
Jooyung Han580eb4f2020-06-24 19:33:06 +09004467func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004468 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004469 apex {
4470 name: "myapex",
4471 key: "myapex.key",
4472 product_specific: true,
4473 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004474 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004475 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004476
Jooyung Han580eb4f2020-06-24 19:33:06 +09004477 apex_key {
4478 name: "myapex.key",
4479 public_key: "testkey.avbpubkey",
4480 private_key: "testkey.pem",
4481 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004482 `)
4483
Colin Cross1c460562021-02-16 17:55:47 -08004484 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004485 apex {
4486 name: "myapex",
4487 key: "myapex.key",
4488 product_specific: true,
4489 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004490 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004491 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004492
Jooyung Han580eb4f2020-06-24 19:33:06 +09004493 apex_key {
4494 name: "myapex.key",
4495 public_key: "testkey.avbpubkey",
4496 private_key: "testkey.pem",
4497 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004498 `, withFiles(map[string][]byte{
4499 "product_specific_file_contexts": nil,
4500 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004501 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4502 rule := module.Output("file_contexts")
4503 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4504}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004505
Jooyung Han580eb4f2020-06-24 19:33:06 +09004506func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004507 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004508 apex {
4509 name: "myapex",
4510 key: "myapex.key",
4511 product_specific: true,
4512 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004513 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004514 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004515
Jooyung Han580eb4f2020-06-24 19:33:06 +09004516 apex_key {
4517 name: "myapex.key",
4518 public_key: "testkey.avbpubkey",
4519 private_key: "testkey.pem",
4520 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004521
Jooyung Han580eb4f2020-06-24 19:33:06 +09004522 filegroup {
4523 name: "my-file-contexts",
4524 srcs: ["product_specific_file_contexts"],
4525 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004526 `, withFiles(map[string][]byte{
4527 "product_specific_file_contexts": nil,
4528 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004529 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4530 rule := module.Output("file_contexts")
4531 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004532}
4533
Jiyong Park67882562019-03-21 01:11:21 +09004534func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004535 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004536 apex_key {
4537 name: "myapex.key",
4538 public_key: ":my.avbpubkey",
4539 private_key: ":my.pem",
4540 product_specific: true,
4541 }
4542
4543 filegroup {
4544 name: "my.avbpubkey",
4545 srcs: ["testkey2.avbpubkey"],
4546 }
4547
4548 filegroup {
4549 name: "my.pem",
4550 srcs: ["testkey2.pem"],
4551 }
4552 `)
4553
4554 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4555 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004556 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004557 if actual_pubkey != expected_pubkey {
4558 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4559 }
4560 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004561 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004562 if actual_privkey != expected_privkey {
4563 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4564 }
4565}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004566
4567func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004568 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004569 prebuilt_apex {
4570 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004571 arch: {
4572 arm64: {
4573 src: "myapex-arm64.apex",
4574 },
4575 arm: {
4576 src: "myapex-arm.apex",
4577 },
4578 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004579 }
4580 `)
4581
Wei Li340ee8e2022-03-18 17:33:24 -07004582 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4583 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004584
Jiyong Parkc95714e2019-03-29 14:23:10 +09004585 expectedInput := "myapex-arm64.apex"
4586 if prebuilt.inputApex.String() != expectedInput {
4587 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4588 }
Wei Li340ee8e2022-03-18 17:33:24 -07004589 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4590 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4591 rule := testingModule.Rule("genProvenanceMetaData")
4592 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4593 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4594 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4595 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004596}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004597
Paul Duffinc0609c62021-03-01 17:27:16 +00004598func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004599 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004600 prebuilt_apex {
4601 name: "myapex",
4602 }
4603 `)
4604}
4605
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004606func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004607 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004608 prebuilt_apex {
4609 name: "myapex",
4610 src: "myapex-arm.apex",
4611 filename: "notmyapex.apex",
4612 }
4613 `)
4614
Wei Li340ee8e2022-03-18 17:33:24 -07004615 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4616 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004617
4618 expected := "notmyapex.apex"
4619 if p.installFilename != expected {
4620 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4621 }
Wei Li340ee8e2022-03-18 17:33:24 -07004622 rule := testingModule.Rule("genProvenanceMetaData")
4623 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4624 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4625 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4626 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004627}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004628
Samiul Islam7c02e262021-09-08 17:48:28 +01004629func TestApexSetFilenameOverride(t *testing.T) {
4630 testApex(t, `
4631 apex_set {
4632 name: "com.company.android.myapex",
4633 apex_name: "com.android.myapex",
4634 set: "company-myapex.apks",
4635 filename: "com.company.android.myapex.apex"
4636 }
4637 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4638
4639 testApex(t, `
4640 apex_set {
4641 name: "com.company.android.myapex",
4642 apex_name: "com.android.myapex",
4643 set: "company-myapex.apks",
4644 filename: "com.company.android.myapex.capex"
4645 }
4646 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4647
4648 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4649 apex_set {
4650 name: "com.company.android.myapex",
4651 apex_name: "com.android.myapex",
4652 set: "company-myapex.apks",
4653 filename: "some-random-suffix"
4654 }
4655 `)
4656}
4657
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004658func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004659 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004660 prebuilt_apex {
4661 name: "myapex.prebuilt",
4662 src: "myapex-arm.apex",
4663 overrides: [
4664 "myapex",
4665 ],
4666 }
4667 `)
4668
Wei Li340ee8e2022-03-18 17:33:24 -07004669 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4670 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004671
4672 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004673 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004674 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004675 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004676 }
Wei Li340ee8e2022-03-18 17:33:24 -07004677 rule := testingModule.Rule("genProvenanceMetaData")
4678 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4679 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4680 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4681 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004682}
4683
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004684func TestPrebuiltApexName(t *testing.T) {
4685 testApex(t, `
4686 prebuilt_apex {
4687 name: "com.company.android.myapex",
4688 apex_name: "com.android.myapex",
4689 src: "company-myapex-arm.apex",
4690 }
4691 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4692
4693 testApex(t, `
4694 apex_set {
4695 name: "com.company.android.myapex",
4696 apex_name: "com.android.myapex",
4697 set: "company-myapex.apks",
4698 }
4699 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4700}
4701
4702func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4703 _ = android.GroupFixturePreparers(
4704 java.PrepareForTestWithJavaDefaultModules,
4705 PrepareForTestWithApexBuildComponents,
4706 android.FixtureWithRootAndroidBp(`
4707 platform_bootclasspath {
4708 name: "platform-bootclasspath",
4709 fragments: [
4710 {
4711 apex: "com.android.art",
4712 module: "art-bootclasspath-fragment",
4713 },
4714 ],
4715 }
4716
4717 prebuilt_apex {
4718 name: "com.company.android.art",
4719 apex_name: "com.android.art",
4720 src: "com.company.android.art-arm.apex",
4721 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4722 }
4723
4724 prebuilt_bootclasspath_fragment {
4725 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004726 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004727 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004728 hidden_api: {
4729 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4730 metadata: "my-bootclasspath-fragment/metadata.csv",
4731 index: "my-bootclasspath-fragment/index.csv",
4732 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4733 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4734 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004735 }
4736
4737 java_import {
4738 name: "core-oj",
4739 jars: ["prebuilt.jar"],
4740 }
4741 `),
4742 ).RunTest(t)
4743}
4744
Paul Duffin092153d2021-01-26 11:42:39 +00004745// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4746// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004747func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004748 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004749
Paul Duffin89886cb2021-02-05 16:44:03 +00004750 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004751 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004752 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004753 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004754 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004755 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004756 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4757 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4758 android.NormalizePathForTesting(dexJarBuildPath))
4759 }
4760
4761 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004762 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004763 // Make sure the import has been given the correct path to the dex jar.
4764 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4765 dexJarBuildPath := p.DexJarInstallPath()
4766 stem := android.RemoveOptionalPrebuiltPrefix(name)
4767 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4768 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4769 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004770 }
4771
Paul Duffin39853512021-02-26 11:09:39 +00004772 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004773 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004774 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004775 android.AssertArrayString(t, "Check if there is no source variant",
4776 []string{"android_common"},
4777 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004778 }
4779
4780 t.Run("prebuilt only", func(t *testing.T) {
4781 bp := `
4782 prebuilt_apex {
4783 name: "myapex",
4784 arch: {
4785 arm64: {
4786 src: "myapex-arm64.apex",
4787 },
4788 arm: {
4789 src: "myapex-arm.apex",
4790 },
4791 },
Paul Duffin39853512021-02-26 11:09:39 +00004792 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004793 }
4794
4795 java_import {
4796 name: "libfoo",
4797 jars: ["libfoo.jar"],
4798 }
Paul Duffin39853512021-02-26 11:09:39 +00004799
4800 java_sdk_library_import {
4801 name: "libbar",
4802 public: {
4803 jars: ["libbar.jar"],
4804 },
4805 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004806 `
4807
4808 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4809 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4810
Martin Stjernholm44825602021-09-17 01:44:12 +01004811 deapexerName := deapexerModuleName("myapex")
4812 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4813
Paul Duffinf6932af2021-02-26 18:21:56 +00004814 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004815 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004816 rule := deapexer.Rule("deapexer")
4817 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4818 t.Errorf("expected: %q, found: %q", expected, actual)
4819 }
4820
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004821 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004822 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004823 rule = prebuiltApex.Rule("android/soong/android.Cp")
4824 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4825 t.Errorf("expected: %q, found: %q", expected, actual)
4826 }
4827
Paul Duffin89886cb2021-02-05 16:44:03 +00004828 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004829 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004830
4831 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004832 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004833 })
4834
4835 t.Run("prebuilt with source preferred", func(t *testing.T) {
4836
4837 bp := `
4838 prebuilt_apex {
4839 name: "myapex",
4840 arch: {
4841 arm64: {
4842 src: "myapex-arm64.apex",
4843 },
4844 arm: {
4845 src: "myapex-arm.apex",
4846 },
4847 },
Paul Duffin39853512021-02-26 11:09:39 +00004848 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004849 }
4850
4851 java_import {
4852 name: "libfoo",
4853 jars: ["libfoo.jar"],
4854 }
4855
4856 java_library {
4857 name: "libfoo",
4858 }
Paul Duffin39853512021-02-26 11:09:39 +00004859
4860 java_sdk_library_import {
4861 name: "libbar",
4862 public: {
4863 jars: ["libbar.jar"],
4864 },
4865 }
4866
4867 java_sdk_library {
4868 name: "libbar",
4869 srcs: ["foo/bar/MyClass.java"],
4870 unsafe_ignore_missing_latest_api: true,
4871 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004872 `
4873
4874 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4875 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4876
Paul Duffin89886cb2021-02-05 16:44:03 +00004877 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004878 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004879 ensureNoSourceVariant(t, ctx, "libfoo")
4880
4881 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004882 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004883 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004884 })
4885
4886 t.Run("prebuilt preferred with source", func(t *testing.T) {
4887 bp := `
4888 prebuilt_apex {
4889 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004890 arch: {
4891 arm64: {
4892 src: "myapex-arm64.apex",
4893 },
4894 arm: {
4895 src: "myapex-arm.apex",
4896 },
4897 },
Paul Duffin39853512021-02-26 11:09:39 +00004898 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004899 }
4900
4901 java_import {
4902 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004903 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004904 jars: ["libfoo.jar"],
4905 }
4906
4907 java_library {
4908 name: "libfoo",
4909 }
Paul Duffin39853512021-02-26 11:09:39 +00004910
4911 java_sdk_library_import {
4912 name: "libbar",
4913 prefer: true,
4914 public: {
4915 jars: ["libbar.jar"],
4916 },
4917 }
4918
4919 java_sdk_library {
4920 name: "libbar",
4921 srcs: ["foo/bar/MyClass.java"],
4922 unsafe_ignore_missing_latest_api: true,
4923 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004924 `
4925
4926 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4927 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4928
Paul Duffin89886cb2021-02-05 16:44:03 +00004929 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004930 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004931 ensureNoSourceVariant(t, ctx, "libfoo")
4932
4933 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004934 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004935 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004936 })
4937}
4938
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004939func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004940 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004941 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004942 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4943 // is disabled.
4944 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4945 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004946
Paul Duffin37856732021-02-26 14:24:15 +00004947 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4948 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004949 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004950 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004951 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004952 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004953 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004954 foundLibfooJar = true
4955 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004956 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004957 }
4958 }
4959 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004960 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004961 }
4962 }
4963
Paul Duffin40a3f652021-07-19 13:11:24 +01004964 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004965 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004966 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004967 var rule android.TestingBuildParams
4968
4969 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4970 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004971 }
4972
Paul Duffin40a3f652021-07-19 13:11:24 +01004973 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4974 t.Helper()
4975 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4976 var rule android.TestingBuildParams
4977
4978 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4979 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4980 }
4981
Paul Duffin89f570a2021-06-16 01:42:33 +01004982 fragment := java.ApexVariantReference{
4983 Apex: proptools.StringPtr("myapex"),
4984 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4985 }
4986
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004987 t.Run("prebuilt only", func(t *testing.T) {
4988 bp := `
4989 prebuilt_apex {
4990 name: "myapex",
4991 arch: {
4992 arm64: {
4993 src: "myapex-arm64.apex",
4994 },
4995 arm: {
4996 src: "myapex-arm.apex",
4997 },
4998 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004999 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5000 }
5001
5002 prebuilt_bootclasspath_fragment {
5003 name: "my-bootclasspath-fragment",
5004 contents: ["libfoo", "libbar"],
5005 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005006 hidden_api: {
5007 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5008 metadata: "my-bootclasspath-fragment/metadata.csv",
5009 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005010 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5011 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5012 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005013 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005014 }
5015
5016 java_import {
5017 name: "libfoo",
5018 jars: ["libfoo.jar"],
5019 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005020 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005021 }
Paul Duffin37856732021-02-26 14:24:15 +00005022
5023 java_sdk_library_import {
5024 name: "libbar",
5025 public: {
5026 jars: ["libbar.jar"],
5027 },
5028 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005029 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005030 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005031 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005032 `
5033
Paul Duffin89f570a2021-06-16 01:42:33 +01005034 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005035 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5036 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005037
Paul Duffin537ea3d2021-05-14 10:38:00 +01005038 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005039 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005040 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005041 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005042 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5043 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005044 })
5045
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005046 t.Run("apex_set only", func(t *testing.T) {
5047 bp := `
5048 apex_set {
5049 name: "myapex",
5050 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005051 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5052 }
5053
5054 prebuilt_bootclasspath_fragment {
5055 name: "my-bootclasspath-fragment",
5056 contents: ["libfoo", "libbar"],
5057 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005058 hidden_api: {
5059 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5060 metadata: "my-bootclasspath-fragment/metadata.csv",
5061 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005062 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5063 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5064 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005065 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005066 }
5067
5068 java_import {
5069 name: "libfoo",
5070 jars: ["libfoo.jar"],
5071 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005072 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005073 }
5074
5075 java_sdk_library_import {
5076 name: "libbar",
5077 public: {
5078 jars: ["libbar.jar"],
5079 },
5080 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005081 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005082 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005083 }
5084 `
5085
Paul Duffin89f570a2021-06-16 01:42:33 +01005086 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005087 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5088 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5089
Paul Duffin537ea3d2021-05-14 10:38:00 +01005090 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005091 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005092 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005093 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005094 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5095 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005096 })
5097
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005098 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5099 bp := `
5100 prebuilt_apex {
5101 name: "myapex",
5102 arch: {
5103 arm64: {
5104 src: "myapex-arm64.apex",
5105 },
5106 arm: {
5107 src: "myapex-arm.apex",
5108 },
5109 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005110 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5111 }
5112
5113 prebuilt_bootclasspath_fragment {
5114 name: "my-bootclasspath-fragment",
5115 contents: ["libfoo", "libbar"],
5116 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005117 hidden_api: {
5118 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5119 metadata: "my-bootclasspath-fragment/metadata.csv",
5120 index: "my-bootclasspath-fragment/index.csv",
5121 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5122 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5123 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005124 }
5125
5126 java_import {
5127 name: "libfoo",
5128 jars: ["libfoo.jar"],
5129 apex_available: ["myapex"],
5130 }
5131
5132 java_library {
5133 name: "libfoo",
5134 srcs: ["foo/bar/MyClass.java"],
5135 apex_available: ["myapex"],
5136 }
Paul Duffin37856732021-02-26 14:24:15 +00005137
5138 java_sdk_library_import {
5139 name: "libbar",
5140 public: {
5141 jars: ["libbar.jar"],
5142 },
5143 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005144 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005145 }
5146
5147 java_sdk_library {
5148 name: "libbar",
5149 srcs: ["foo/bar/MyClass.java"],
5150 unsafe_ignore_missing_latest_api: true,
5151 apex_available: ["myapex"],
5152 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005153 `
5154
5155 // In this test the source (java_library) libfoo is active since the
5156 // prebuilt (java_import) defaults to prefer:false. However the
5157 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5158 // find the dex boot jar in it. We either need to disable the source libfoo
5159 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005160 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005161 // dexbootjar check is skipped if AllowMissingDependencies is true
5162 preparerAllowMissingDeps := android.GroupFixturePreparers(
5163 preparer,
5164 android.PrepareForTestWithAllowMissingDependencies,
5165 )
5166 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005167 })
5168
5169 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5170 bp := `
5171 prebuilt_apex {
5172 name: "myapex",
5173 arch: {
5174 arm64: {
5175 src: "myapex-arm64.apex",
5176 },
5177 arm: {
5178 src: "myapex-arm.apex",
5179 },
5180 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005181 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5182 }
5183
5184 prebuilt_bootclasspath_fragment {
5185 name: "my-bootclasspath-fragment",
5186 contents: ["libfoo", "libbar"],
5187 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005188 hidden_api: {
5189 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5190 metadata: "my-bootclasspath-fragment/metadata.csv",
5191 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005192 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5193 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5194 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005195 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005196 }
5197
5198 java_import {
5199 name: "libfoo",
5200 prefer: true,
5201 jars: ["libfoo.jar"],
5202 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005203 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005204 }
5205
5206 java_library {
5207 name: "libfoo",
5208 srcs: ["foo/bar/MyClass.java"],
5209 apex_available: ["myapex"],
5210 }
Paul Duffin37856732021-02-26 14:24:15 +00005211
5212 java_sdk_library_import {
5213 name: "libbar",
5214 prefer: true,
5215 public: {
5216 jars: ["libbar.jar"],
5217 },
5218 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005219 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005220 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005221 }
5222
5223 java_sdk_library {
5224 name: "libbar",
5225 srcs: ["foo/bar/MyClass.java"],
5226 unsafe_ignore_missing_latest_api: true,
5227 apex_available: ["myapex"],
5228 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005229 `
5230
Paul Duffin89f570a2021-06-16 01:42:33 +01005231 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005232 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5233 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005234
Paul Duffin537ea3d2021-05-14 10:38:00 +01005235 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005236 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005237 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005238 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005239 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5240 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005241 })
5242
5243 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5244 bp := `
5245 apex {
5246 name: "myapex",
5247 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005248 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005249 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005250 }
5251
5252 apex_key {
5253 name: "myapex.key",
5254 public_key: "testkey.avbpubkey",
5255 private_key: "testkey.pem",
5256 }
5257
5258 prebuilt_apex {
5259 name: "myapex",
5260 arch: {
5261 arm64: {
5262 src: "myapex-arm64.apex",
5263 },
5264 arm: {
5265 src: "myapex-arm.apex",
5266 },
5267 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005268 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5269 }
5270
5271 prebuilt_bootclasspath_fragment {
5272 name: "my-bootclasspath-fragment",
5273 contents: ["libfoo", "libbar"],
5274 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005275 hidden_api: {
5276 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5277 metadata: "my-bootclasspath-fragment/metadata.csv",
5278 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005279 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5280 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5281 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005282 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 }
5284
5285 java_import {
5286 name: "libfoo",
5287 jars: ["libfoo.jar"],
5288 apex_available: ["myapex"],
5289 }
5290
5291 java_library {
5292 name: "libfoo",
5293 srcs: ["foo/bar/MyClass.java"],
5294 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005295 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005296 }
Paul Duffin37856732021-02-26 14:24:15 +00005297
5298 java_sdk_library_import {
5299 name: "libbar",
5300 public: {
5301 jars: ["libbar.jar"],
5302 },
5303 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005304 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005305 }
5306
5307 java_sdk_library {
5308 name: "libbar",
5309 srcs: ["foo/bar/MyClass.java"],
5310 unsafe_ignore_missing_latest_api: true,
5311 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005312 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005313 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005314 `
5315
Paul Duffin89f570a2021-06-16 01:42:33 +01005316 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005317 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5318 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005319
Paul Duffin537ea3d2021-05-14 10:38:00 +01005320 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005321 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005322 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005323 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005324 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5325 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 })
5327
5328 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5329 bp := `
5330 apex {
5331 name: "myapex",
5332 enabled: false,
5333 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005334 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005335 }
5336
5337 apex_key {
5338 name: "myapex.key",
5339 public_key: "testkey.avbpubkey",
5340 private_key: "testkey.pem",
5341 }
5342
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005353 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5354 }
5355
5356 prebuilt_bootclasspath_fragment {
5357 name: "my-bootclasspath-fragment",
5358 contents: ["libfoo", "libbar"],
5359 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005360 hidden_api: {
5361 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5362 metadata: "my-bootclasspath-fragment/metadata.csv",
5363 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005364 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5365 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5366 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005367 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005368 }
5369
5370 java_import {
5371 name: "libfoo",
5372 prefer: true,
5373 jars: ["libfoo.jar"],
5374 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005375 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005376 }
5377
5378 java_library {
5379 name: "libfoo",
5380 srcs: ["foo/bar/MyClass.java"],
5381 apex_available: ["myapex"],
5382 }
Paul Duffin37856732021-02-26 14:24:15 +00005383
5384 java_sdk_library_import {
5385 name: "libbar",
5386 prefer: true,
5387 public: {
5388 jars: ["libbar.jar"],
5389 },
5390 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005391 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005392 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005393 }
5394
5395 java_sdk_library {
5396 name: "libbar",
5397 srcs: ["foo/bar/MyClass.java"],
5398 unsafe_ignore_missing_latest_api: true,
5399 apex_available: ["myapex"],
5400 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005401 `
5402
Paul Duffin89f570a2021-06-16 01:42:33 +01005403 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005404 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5405 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005406
Paul Duffin537ea3d2021-05-14 10:38:00 +01005407 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005408 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005409 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005410 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005411 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5412 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005413 })
5414}
5415
Roland Levillain630846d2019-06-26 12:48:34 +01005416func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005417 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005418 apex_test {
5419 name: "myapex",
5420 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005421 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005422 tests: [
5423 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005424 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005425 ],
5426 }
5427
5428 apex_key {
5429 name: "myapex.key",
5430 public_key: "testkey.avbpubkey",
5431 private_key: "testkey.pem",
5432 }
5433
Liz Kammer1c14a212020-05-12 15:26:55 -07005434 filegroup {
5435 name: "fg",
5436 srcs: [
5437 "baz",
5438 "bar/baz"
5439 ],
5440 }
5441
Roland Levillain630846d2019-06-26 12:48:34 +01005442 cc_test {
5443 name: "mytest",
5444 gtest: false,
5445 srcs: ["mytest.cpp"],
5446 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005447 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005448 system_shared_libs: [],
5449 static_executable: true,
5450 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005451 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005452 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005453
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005454 cc_library {
5455 name: "mylib",
5456 srcs: ["mylib.cpp"],
5457 system_shared_libs: [],
5458 stl: "none",
5459 }
5460
Liz Kammer5bd365f2020-05-27 15:15:11 -07005461 filegroup {
5462 name: "fg2",
5463 srcs: [
5464 "testdata/baz"
5465 ],
5466 }
5467
Roland Levillain9b5fde92019-06-28 15:41:19 +01005468 cc_test {
5469 name: "mytests",
5470 gtest: false,
5471 srcs: [
5472 "mytest1.cpp",
5473 "mytest2.cpp",
5474 "mytest3.cpp",
5475 ],
5476 test_per_src: true,
5477 relative_install_path: "test",
5478 system_shared_libs: [],
5479 static_executable: true,
5480 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005481 data: [
5482 ":fg",
5483 ":fg2",
5484 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005485 }
Roland Levillain630846d2019-06-26 12:48:34 +01005486 `)
5487
Sundong Ahnabb64432019-10-22 13:58:29 +09005488 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005489 copyCmds := apexRule.Args["copy_commands"]
5490
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005491 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005492 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005493 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005494
Liz Kammer1c14a212020-05-12 15:26:55 -07005495 //Ensure that test data are copied into apex.
5496 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5497 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5498
Roland Levillain9b5fde92019-06-28 15:41:19 +01005499 // Ensure that test deps built with `test_per_src` are copied into apex.
5500 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5501 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5502 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005503
5504 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005505 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005506 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005507 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005508 prefix := "TARGET_"
5509 var builder strings.Builder
5510 data.Custom(&builder, name, prefix, "", data)
5511 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005512 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5513 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5514 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5515 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005516 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005517 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005518 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005519
5520 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005521 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005522 data.Custom(&builder, name, prefix, "", data)
5523 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005524 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5525 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005526}
5527
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005528func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005529 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005530 apex {
5531 name: "myapex",
5532 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005533 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005534 }
5535 apex_key {
5536 name: "myapex.key",
5537 public_key: "testkey.avbpubkey",
5538 private_key: "testkey.pem",
5539 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005540 `,
5541 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5542 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5543 }),
5544 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005545 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005546 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005547 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005548 var builder strings.Builder
5549 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5550 androidMk := builder.String()
5551 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5552}
5553
Jooyung Hand48f3c32019-08-23 11:18:57 +09005554func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5555 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5556 apex {
5557 name: "myapex",
5558 key: "myapex.key",
5559 native_shared_libs: ["libfoo"],
5560 }
5561
5562 apex_key {
5563 name: "myapex.key",
5564 public_key: "testkey.avbpubkey",
5565 private_key: "testkey.pem",
5566 }
5567
5568 cc_library {
5569 name: "libfoo",
5570 stl: "none",
5571 system_shared_libs: [],
5572 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005573 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005574 }
5575 `)
5576 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5577 apex {
5578 name: "myapex",
5579 key: "myapex.key",
5580 java_libs: ["myjar"],
5581 }
5582
5583 apex_key {
5584 name: "myapex.key",
5585 public_key: "testkey.avbpubkey",
5586 private_key: "testkey.pem",
5587 }
5588
5589 java_library {
5590 name: "myjar",
5591 srcs: ["foo/bar/MyClass.java"],
5592 sdk_version: "none",
5593 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005594 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005595 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005596 }
5597 `)
5598}
5599
Bill Peckhama41a6962021-01-11 10:58:54 -08005600func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005601 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005602 apex {
5603 name: "myapex",
5604 key: "myapex.key",
5605 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005606 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005607 }
5608
5609 apex_key {
5610 name: "myapex.key",
5611 public_key: "testkey.avbpubkey",
5612 private_key: "testkey.pem",
5613 }
5614
5615 java_import {
5616 name: "myjavaimport",
5617 apex_available: ["myapex"],
5618 jars: ["my.jar"],
5619 compile_dex: true,
5620 }
5621 `)
5622
5623 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5624 apexRule := module.Rule("apexRule")
5625 copyCmds := apexRule.Args["copy_commands"]
5626 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5627}
5628
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005629func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005630 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005631 apex {
5632 name: "myapex",
5633 key: "myapex.key",
5634 apps: [
5635 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005636 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005637 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005638 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005639 }
5640
5641 apex_key {
5642 name: "myapex.key",
5643 public_key: "testkey.avbpubkey",
5644 private_key: "testkey.pem",
5645 }
5646
5647 android_app {
5648 name: "AppFoo",
5649 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005650 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005651 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005652 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005653 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005654 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005655 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005656
5657 android_app {
5658 name: "AppFooPriv",
5659 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005660 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005661 system_modules: "none",
5662 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005663 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005664 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005665 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005666
5667 cc_library_shared {
5668 name: "libjni",
5669 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005670 shared_libs: ["libfoo"],
5671 stl: "none",
5672 system_shared_libs: [],
5673 apex_available: [ "myapex" ],
5674 sdk_version: "current",
5675 }
5676
5677 cc_library_shared {
5678 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005679 stl: "none",
5680 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005681 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005682 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005683 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005684 `)
5685
Sundong Ahnabb64432019-10-22 13:58:29 +09005686 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005687 apexRule := module.Rule("apexRule")
5688 copyCmds := apexRule.Args["copy_commands"]
5689
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005690 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5691 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005692
Colin Crossaede88c2020-08-11 12:17:01 -07005693 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005694 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005695 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005696 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005697 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005698 // JNI libraries including transitive deps are
5699 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005700 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005701 // ... embedded inside APK (jnilibs.zip)
5702 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5703 // ... and not directly inside the APEX
5704 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5705 }
Dario Frenicde2a032019-10-27 00:29:22 +01005706}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005707
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005708func TestApexWithAppImportBuildId(t *testing.T) {
5709 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5710 for _, id := range invalidBuildIds {
5711 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5712 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5713 variables.BuildId = proptools.StringPtr(id)
5714 })
5715 testApexError(t, message, `apex {
5716 name: "myapex",
5717 key: "myapex.key",
5718 apps: ["AppFooPrebuilt"],
5719 updatable: false,
5720 }
5721
5722 apex_key {
5723 name: "myapex.key",
5724 public_key: "testkey.avbpubkey",
5725 private_key: "testkey.pem",
5726 }
5727
5728 android_app_import {
5729 name: "AppFooPrebuilt",
5730 apk: "PrebuiltAppFoo.apk",
5731 presigned: true,
5732 apex_available: ["myapex"],
5733 }
5734 `, fixture)
5735 }
5736}
5737
Dario Frenicde2a032019-10-27 00:29:22 +01005738func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005739 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005740 apex {
5741 name: "myapex",
5742 key: "myapex.key",
5743 apps: [
5744 "AppFooPrebuilt",
5745 "AppFooPrivPrebuilt",
5746 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005747 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005748 }
5749
5750 apex_key {
5751 name: "myapex.key",
5752 public_key: "testkey.avbpubkey",
5753 private_key: "testkey.pem",
5754 }
5755
5756 android_app_import {
5757 name: "AppFooPrebuilt",
5758 apk: "PrebuiltAppFoo.apk",
5759 presigned: true,
5760 dex_preopt: {
5761 enabled: false,
5762 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005763 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005764 }
5765
5766 android_app_import {
5767 name: "AppFooPrivPrebuilt",
5768 apk: "PrebuiltAppFooPriv.apk",
5769 privileged: true,
5770 presigned: true,
5771 dex_preopt: {
5772 enabled: false,
5773 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005774 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005775 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005776 }
5777 `)
5778
Sundong Ahnabb64432019-10-22 13:58:29 +09005779 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005780 apexRule := module.Rule("apexRule")
5781 copyCmds := apexRule.Args["copy_commands"]
5782
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005783 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5784 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005785}
5786
5787func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005788 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005789 apex {
5790 name: "myapex",
5791 key: "myapex.key",
5792 apps: [
5793 "AppFoo",
5794 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005795 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005796 }
5797
5798 apex_key {
5799 name: "myapex.key",
5800 public_key: "testkey.avbpubkey",
5801 private_key: "testkey.pem",
5802 }
5803
5804 android_app {
5805 name: "AppFoo",
5806 srcs: ["foo/bar/MyClass.java"],
5807 sdk_version: "none",
5808 system_modules: "none",
5809 apex_available: [ "myapex" ],
5810 }
5811
5812 android_app_import {
5813 name: "AppFoo",
5814 apk: "AppFooPrebuilt.apk",
5815 filename: "AppFooPrebuilt.apk",
5816 presigned: true,
5817 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005818 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005819 }
5820 `, withFiles(map[string][]byte{
5821 "AppFooPrebuilt.apk": nil,
5822 }))
5823
5824 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005825 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005826 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005827}
5828
Dario Freni6f3937c2019-12-20 22:58:03 +00005829func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005830 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005831 apex {
5832 name: "myapex",
5833 key: "myapex.key",
5834 apps: [
5835 "TesterHelpAppFoo",
5836 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005837 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005838 }
5839
5840 apex_key {
5841 name: "myapex.key",
5842 public_key: "testkey.avbpubkey",
5843 private_key: "testkey.pem",
5844 }
5845
5846 android_test_helper_app {
5847 name: "TesterHelpAppFoo",
5848 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005849 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005850 }
5851
5852 `)
5853
5854 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5855 apexRule := module.Rule("apexRule")
5856 copyCmds := apexRule.Args["copy_commands"]
5857
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005858 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005859}
5860
Jooyung Han18020ea2019-11-13 10:50:48 +09005861func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5862 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005863 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005864 apex {
5865 name: "myapex",
5866 key: "myapex.key",
5867 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005868 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005869 }
5870
5871 apex_key {
5872 name: "myapex.key",
5873 public_key: "testkey.avbpubkey",
5874 private_key: "testkey.pem",
5875 }
5876
5877 apex {
5878 name: "otherapex",
5879 key: "myapex.key",
5880 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005881 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005882 }
5883
5884 cc_defaults {
5885 name: "libfoo-defaults",
5886 apex_available: ["otherapex"],
5887 }
5888
5889 cc_library {
5890 name: "libfoo",
5891 defaults: ["libfoo-defaults"],
5892 stl: "none",
5893 system_shared_libs: [],
5894 }`)
5895}
5896
Paul Duffine52e66f2020-03-30 17:54:29 +01005897func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005898 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005899 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005900 apex {
5901 name: "myapex",
5902 key: "myapex.key",
5903 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005904 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005905 }
5906
5907 apex_key {
5908 name: "myapex.key",
5909 public_key: "testkey.avbpubkey",
5910 private_key: "testkey.pem",
5911 }
5912
5913 apex {
5914 name: "otherapex",
5915 key: "otherapex.key",
5916 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005917 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005918 }
5919
5920 apex_key {
5921 name: "otherapex.key",
5922 public_key: "testkey.avbpubkey",
5923 private_key: "testkey.pem",
5924 }
5925
5926 cc_library {
5927 name: "libfoo",
5928 stl: "none",
5929 system_shared_libs: [],
5930 apex_available: ["otherapex"],
5931 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005932}
Jiyong Park127b40b2019-09-30 16:04:35 +09005933
Paul Duffine52e66f2020-03-30 17:54:29 +01005934func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005935 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005936 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00005937.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01005938.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005939.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005940.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005941.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005942.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005943 apex {
5944 name: "myapex",
5945 key: "myapex.key",
5946 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005947 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005948 }
5949
5950 apex_key {
5951 name: "myapex.key",
5952 public_key: "testkey.avbpubkey",
5953 private_key: "testkey.pem",
5954 }
5955
Jiyong Park127b40b2019-09-30 16:04:35 +09005956 cc_library {
5957 name: "libfoo",
5958 stl: "none",
5959 shared_libs: ["libbar"],
5960 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005961 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005962 }
5963
5964 cc_library {
5965 name: "libbar",
5966 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005967 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005968 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005969 apex_available: ["myapex"],
5970 }
5971
5972 cc_library {
5973 name: "libbaz",
5974 stl: "none",
5975 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005976 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005977}
Jiyong Park127b40b2019-09-30 16:04:35 +09005978
Paul Duffine52e66f2020-03-30 17:54:29 +01005979func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005980 testApexError(t, "\"otherapex\" is not a valid module name", `
5981 apex {
5982 name: "myapex",
5983 key: "myapex.key",
5984 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005985 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005986 }
5987
5988 apex_key {
5989 name: "myapex.key",
5990 public_key: "testkey.avbpubkey",
5991 private_key: "testkey.pem",
5992 }
5993
5994 cc_library {
5995 name: "libfoo",
5996 stl: "none",
5997 system_shared_libs: [],
5998 apex_available: ["otherapex"],
5999 }`)
6000
Paul Duffine52e66f2020-03-30 17:54:29 +01006001 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006002 apex {
6003 name: "myapex",
6004 key: "myapex.key",
6005 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006006 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006007 }
6008
6009 apex_key {
6010 name: "myapex.key",
6011 public_key: "testkey.avbpubkey",
6012 private_key: "testkey.pem",
6013 }
6014
6015 cc_library {
6016 name: "libfoo",
6017 stl: "none",
6018 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006019 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006020 apex_available: ["myapex"],
6021 }
6022
6023 cc_library {
6024 name: "libbar",
6025 stl: "none",
6026 system_shared_libs: [],
6027 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006028 }
6029
6030 cc_library {
6031 name: "libbaz",
6032 stl: "none",
6033 system_shared_libs: [],
6034 stubs: {
6035 versions: ["10", "20", "30"],
6036 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006037 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006038}
Jiyong Park127b40b2019-09-30 16:04:35 +09006039
Jiyong Park89e850a2020-04-07 16:37:39 +09006040func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006041 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006042 apex {
6043 name: "myapex",
6044 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006045 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006046 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006047 }
6048
6049 apex_key {
6050 name: "myapex.key",
6051 public_key: "testkey.avbpubkey",
6052 private_key: "testkey.pem",
6053 }
6054
6055 cc_library {
6056 name: "libfoo",
6057 stl: "none",
6058 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006059 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006060 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006061 }
6062
6063 cc_library {
6064 name: "libfoo2",
6065 stl: "none",
6066 system_shared_libs: [],
6067 shared_libs: ["libbaz"],
6068 apex_available: ["//apex_available:platform"],
6069 }
6070
6071 cc_library {
6072 name: "libbar",
6073 stl: "none",
6074 system_shared_libs: [],
6075 apex_available: ["myapex"],
6076 }
6077
6078 cc_library {
6079 name: "libbaz",
6080 stl: "none",
6081 system_shared_libs: [],
6082 apex_available: ["myapex"],
6083 stubs: {
6084 versions: ["1"],
6085 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006086 }`)
6087
Jiyong Park89e850a2020-04-07 16:37:39 +09006088 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6089 // because it depends on libbar which isn't available to platform
6090 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6091 if libfoo.NotAvailableForPlatform() != true {
6092 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6093 }
6094
6095 // libfoo2 however can be available to platform because it depends on libbaz which provides
6096 // stubs
6097 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6098 if libfoo2.NotAvailableForPlatform() == true {
6099 t.Errorf("%q should be available to platform", libfoo2.String())
6100 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006101}
Jiyong Parka90ca002019-10-07 15:47:24 +09006102
Paul Duffine52e66f2020-03-30 17:54:29 +01006103func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006104 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006105 apex {
6106 name: "myapex",
6107 key: "myapex.key",
6108 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006109 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006110 }
6111
6112 apex_key {
6113 name: "myapex.key",
6114 public_key: "testkey.avbpubkey",
6115 private_key: "testkey.pem",
6116 }
6117
6118 cc_library {
6119 name: "libfoo",
6120 stl: "none",
6121 system_shared_libs: [],
6122 apex_available: ["myapex"],
6123 static: {
6124 apex_available: ["//apex_available:platform"],
6125 },
6126 }`)
6127
Jiyong Park89e850a2020-04-07 16:37:39 +09006128 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6129 if libfooShared.NotAvailableForPlatform() != true {
6130 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6131 }
6132 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6133 if libfooStatic.NotAvailableForPlatform() != false {
6134 t.Errorf("%q should be available to platform", libfooStatic.String())
6135 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006136}
6137
Jiyong Park5d790c32019-11-15 18:40:32 +09006138func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006139 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006144 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006145 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006146 bootclasspath_fragments: ["mybootclasspath_fragment"],
6147 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6148 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006149 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006150 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006151 }
6152
6153 override_apex {
6154 name: "override_myapex",
6155 base: "myapex",
6156 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006157 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006158 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006159 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6160 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6161 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006162 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006163 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006164 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006165 key: "mynewapex.key",
6166 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006167 }
6168
6169 apex_key {
6170 name: "myapex.key",
6171 public_key: "testkey.avbpubkey",
6172 private_key: "testkey.pem",
6173 }
6174
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006175 apex_key {
6176 name: "mynewapex.key",
6177 public_key: "testkey2.avbpubkey",
6178 private_key: "testkey2.pem",
6179 }
6180
6181 android_app_certificate {
6182 name: "myapex.certificate",
6183 certificate: "testkey",
6184 }
6185
Jiyong Park5d790c32019-11-15 18:40:32 +09006186 android_app {
6187 name: "app",
6188 srcs: ["foo/bar/MyClass.java"],
6189 package_name: "foo",
6190 sdk_version: "none",
6191 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006192 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006193 }
6194
6195 override_android_app {
6196 name: "override_app",
6197 base: "app",
6198 package_name: "bar",
6199 }
markchien7c803b82021-08-26 22:10:06 +08006200
6201 bpf {
6202 name: "bpf",
6203 srcs: ["bpf.c"],
6204 }
6205
6206 bpf {
6207 name: "override_bpf",
6208 srcs: ["override_bpf.c"],
6209 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006210
6211 prebuilt_etc {
6212 name: "myetc",
6213 src: "myprebuilt",
6214 }
6215
6216 prebuilt_etc {
6217 name: "override_myetc",
6218 src: "override_myprebuilt",
6219 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006220
6221 java_library {
6222 name: "bcplib",
6223 srcs: ["a.java"],
6224 compile_dex: true,
6225 apex_available: ["myapex"],
6226 permitted_packages: ["bcp.lib"],
6227 }
6228
6229 bootclasspath_fragment {
6230 name: "mybootclasspath_fragment",
6231 contents: ["bcplib"],
6232 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006233 hidden_api: {
6234 split_packages: ["*"],
6235 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006236 }
6237
6238 java_library {
6239 name: "override_bcplib",
6240 srcs: ["a.java"],
6241 compile_dex: true,
6242 apex_available: ["myapex"],
6243 permitted_packages: ["override.bcp.lib"],
6244 }
6245
6246 bootclasspath_fragment {
6247 name: "override_bootclasspath_fragment",
6248 contents: ["override_bcplib"],
6249 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006250 hidden_api: {
6251 split_packages: ["*"],
6252 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006253 }
6254
6255 java_library {
6256 name: "systemserverlib",
6257 srcs: ["a.java"],
6258 apex_available: ["myapex"],
6259 }
6260
6261 systemserverclasspath_fragment {
6262 name: "mysystemserverclasspath_fragment",
6263 standalone_contents: ["systemserverlib"],
6264 apex_available: ["myapex"],
6265 }
6266
6267 java_library {
6268 name: "override_systemserverlib",
6269 srcs: ["a.java"],
6270 apex_available: ["myapex"],
6271 }
6272
6273 systemserverclasspath_fragment {
6274 name: "override_systemserverclasspath_fragment",
6275 standalone_contents: ["override_systemserverlib"],
6276 apex_available: ["myapex"],
6277 }
6278
6279 java_library {
6280 name: "myjava_library",
6281 srcs: ["a.java"],
6282 compile_dex: true,
6283 apex_available: ["myapex"],
6284 }
6285
6286 java_library {
6287 name: "override_java_library",
6288 srcs: ["a.java"],
6289 compile_dex: true,
6290 apex_available: ["myapex"],
6291 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006292 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006293
Jiyong Park317645e2019-12-05 13:20:58 +09006294 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6295 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6296 if originalVariant.GetOverriddenBy() != "" {
6297 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6298 }
6299 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6300 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6301 }
6302
Jiyong Park5d790c32019-11-15 18:40:32 +09006303 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6304 apexRule := module.Rule("apexRule")
6305 copyCmds := apexRule.Args["copy_commands"]
6306
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006307 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6308 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006309
markchien7c803b82021-08-26 22:10:06 +08006310 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6311 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6312
Daniel Norman5a3ce132021-08-26 15:44:43 -07006313 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6314 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6315
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006316 apexBundle := module.Module().(*apexBundle)
6317 name := apexBundle.Name()
6318 if name != "override_myapex" {
6319 t.Errorf("name should be \"override_myapex\", but was %q", name)
6320 }
6321
Baligh Uddin004d7172020-02-19 21:29:28 -08006322 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6323 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6324 }
6325
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006326 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6327 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6328 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6329 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6330 android.AssertArrayString(t, "Java_libs does not match",
6331 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6332
Jiyong Park20bacab2020-03-03 11:45:41 +09006333 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006334 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006335 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6336
6337 signApkRule := module.Rule("signapk")
6338 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006339
Colin Crossaa255532020-07-03 13:18:24 -07006340 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006341 var builder strings.Builder
6342 data.Custom(&builder, name, "TARGET_", "", data)
6343 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006344 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006345 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006346 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006347 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6348 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6349 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006350 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006351 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006352 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006353 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006354 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006355 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006356 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6357 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6358 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006359 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006360}
6361
Albert Martineefabcf2022-03-21 20:11:16 +00006362func TestMinSdkVersionOverride(t *testing.T) {
6363 // Override from 29 to 31
6364 minSdkOverride31 := "31"
6365 ctx := testApex(t, `
6366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 native_shared_libs: ["mylib"],
6370 updatable: true,
6371 min_sdk_version: "29"
6372 }
6373
6374 override_apex {
6375 name: "override_myapex",
6376 base: "myapex",
6377 logging_parent: "com.foo.bar",
6378 package_name: "test.overridden.package"
6379 }
6380
6381 apex_key {
6382 name: "myapex.key",
6383 public_key: "testkey.avbpubkey",
6384 private_key: "testkey.pem",
6385 }
6386
6387 cc_library {
6388 name: "mylib",
6389 srcs: ["mylib.cpp"],
6390 runtime_libs: ["libbar"],
6391 system_shared_libs: [],
6392 stl: "none",
6393 apex_available: [ "myapex" ],
6394 min_sdk_version: "apex_inherit"
6395 }
6396
6397 cc_library {
6398 name: "libbar",
6399 srcs: ["mylib.cpp"],
6400 system_shared_libs: [],
6401 stl: "none",
6402 apex_available: [ "myapex" ],
6403 min_sdk_version: "apex_inherit"
6404 }
6405
6406 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6407
6408 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6409 copyCmds := apexRule.Args["copy_commands"]
6410
6411 // Ensure that direct non-stubs dep is always included
6412 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6413
6414 // Ensure that runtime_libs dep in included
6415 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6416
6417 // Ensure libraries target overridden min_sdk_version value
6418 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6419}
6420
6421func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6422 // Attempt to override from 31 to 29, should be a NOOP
6423 minSdkOverride29 := "29"
6424 ctx := testApex(t, `
6425 apex {
6426 name: "myapex",
6427 key: "myapex.key",
6428 native_shared_libs: ["mylib"],
6429 updatable: true,
6430 min_sdk_version: "31"
6431 }
6432
6433 override_apex {
6434 name: "override_myapex",
6435 base: "myapex",
6436 logging_parent: "com.foo.bar",
6437 package_name: "test.overridden.package"
6438 }
6439
6440 apex_key {
6441 name: "myapex.key",
6442 public_key: "testkey.avbpubkey",
6443 private_key: "testkey.pem",
6444 }
6445
6446 cc_library {
6447 name: "mylib",
6448 srcs: ["mylib.cpp"],
6449 runtime_libs: ["libbar"],
6450 system_shared_libs: [],
6451 stl: "none",
6452 apex_available: [ "myapex" ],
6453 min_sdk_version: "apex_inherit"
6454 }
6455
6456 cc_library {
6457 name: "libbar",
6458 srcs: ["mylib.cpp"],
6459 system_shared_libs: [],
6460 stl: "none",
6461 apex_available: [ "myapex" ],
6462 min_sdk_version: "apex_inherit"
6463 }
6464
6465 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6466
6467 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6468 copyCmds := apexRule.Args["copy_commands"]
6469
6470 // Ensure that direct non-stubs dep is always included
6471 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6472
6473 // Ensure that runtime_libs dep in included
6474 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6475
6476 // Ensure libraries target the original min_sdk_version value rather than the overridden
6477 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6478}
6479
Jooyung Han214bf372019-11-12 13:03:50 +09006480func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006481 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006482 apex {
6483 name: "myapex",
6484 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006485 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006486 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006487 }
6488
6489 apex_key {
6490 name: "myapex.key",
6491 public_key: "testkey.avbpubkey",
6492 private_key: "testkey.pem",
6493 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006494
6495 cc_library {
6496 name: "mylib",
6497 srcs: ["mylib.cpp"],
6498 stl: "libc++",
6499 system_shared_libs: [],
6500 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006501 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006502 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006503 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006504
6505 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6506 args := module.Rule("apexRule").Args
6507 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006508 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006509
6510 // The copies of the libraries in the apex should have one more dependency than
6511 // the ones outside the apex, namely the unwinder. Ideally we should check
6512 // the dependency names directly here but for some reason the names are blank in
6513 // this test.
6514 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006515 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006516 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6517 if len(apexImplicits) != len(nonApexImplicits)+1 {
6518 t.Errorf("%q missing unwinder dep", lib)
6519 }
6520 }
Jooyung Han214bf372019-11-12 13:03:50 +09006521}
6522
Paul Duffine05480a2021-03-08 15:07:14 +00006523var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006524 "api/current.txt": nil,
6525 "api/removed.txt": nil,
6526 "api/system-current.txt": nil,
6527 "api/system-removed.txt": nil,
6528 "api/test-current.txt": nil,
6529 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006530
Anton Hanssondff2c782020-12-21 17:10:01 +00006531 "100/public/api/foo.txt": nil,
6532 "100/public/api/foo-removed.txt": nil,
6533 "100/system/api/foo.txt": nil,
6534 "100/system/api/foo-removed.txt": nil,
6535
Paul Duffineedc5d52020-06-12 17:46:39 +01006536 // For java_sdk_library_import
6537 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006538}
6539
Jooyung Han58f26ab2019-12-18 15:34:32 +09006540func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006541 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006542 apex {
6543 name: "myapex",
6544 key: "myapex.key",
6545 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006546 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006547 }
6548
6549 apex_key {
6550 name: "myapex.key",
6551 public_key: "testkey.avbpubkey",
6552 private_key: "testkey.pem",
6553 }
6554
6555 java_sdk_library {
6556 name: "foo",
6557 srcs: ["a.java"],
6558 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006559 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006560 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006561
6562 prebuilt_apis {
6563 name: "sdk",
6564 api_dirs: ["100"],
6565 }
Paul Duffin9b879592020-05-26 13:21:35 +01006566 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006567
6568 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006569 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006570 "javalib/foo.jar",
6571 "etc/permissions/foo.xml",
6572 })
6573 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006574 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006575 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09006576}
6577
Paul Duffin9b879592020-05-26 13:21:35 +01006578func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006579 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006580 apex {
6581 name: "myapex",
6582 key: "myapex.key",
6583 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006584 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006585 }
6586
6587 apex_key {
6588 name: "myapex.key",
6589 public_key: "testkey.avbpubkey",
6590 private_key: "testkey.pem",
6591 }
6592
6593 java_sdk_library {
6594 name: "foo",
6595 srcs: ["a.java"],
6596 api_packages: ["foo"],
6597 apex_available: ["myapex"],
6598 sdk_version: "none",
6599 system_modules: "none",
6600 }
6601
6602 java_library {
6603 name: "bar",
6604 srcs: ["a.java"],
6605 libs: ["foo"],
6606 apex_available: ["myapex"],
6607 sdk_version: "none",
6608 system_modules: "none",
6609 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006610
6611 prebuilt_apis {
6612 name: "sdk",
6613 api_dirs: ["100"],
6614 }
Paul Duffin9b879592020-05-26 13:21:35 +01006615 `, withFiles(filesForSdkLibrary))
6616
6617 // java_sdk_library installs both impl jar and permission XML
6618 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6619 "javalib/bar.jar",
6620 "javalib/foo.jar",
6621 "etc/permissions/foo.xml",
6622 })
6623
6624 // The bar library should depend on the implementation jar.
6625 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006626 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006627 t.Errorf("expected %q, found %#q", expected, actual)
6628 }
6629}
6630
6631func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006632 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006633 apex {
6634 name: "myapex",
6635 key: "myapex.key",
6636 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006637 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006638 }
6639
6640 apex_key {
6641 name: "myapex.key",
6642 public_key: "testkey.avbpubkey",
6643 private_key: "testkey.pem",
6644 }
6645
6646 java_sdk_library {
6647 name: "foo",
6648 srcs: ["a.java"],
6649 api_packages: ["foo"],
6650 apex_available: ["myapex"],
6651 sdk_version: "none",
6652 system_modules: "none",
6653 }
6654
6655 java_library {
6656 name: "bar",
6657 srcs: ["a.java"],
6658 libs: ["foo"],
6659 sdk_version: "none",
6660 system_modules: "none",
6661 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006662
6663 prebuilt_apis {
6664 name: "sdk",
6665 api_dirs: ["100"],
6666 }
Paul Duffin9b879592020-05-26 13:21:35 +01006667 `, withFiles(filesForSdkLibrary))
6668
6669 // java_sdk_library installs both impl jar and permission XML
6670 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6671 "javalib/foo.jar",
6672 "etc/permissions/foo.xml",
6673 })
6674
6675 // The bar library should depend on the stubs jar.
6676 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006677 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006678 t.Errorf("expected %q, found %#q", expected, actual)
6679 }
6680}
6681
Paul Duffineedc5d52020-06-12 17:46:39 +01006682func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006683 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006684 prebuilt_apis {
6685 name: "sdk",
6686 api_dirs: ["100"],
6687 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006688 withFiles(map[string][]byte{
6689 "apex/a.java": nil,
6690 "apex/apex_manifest.json": nil,
6691 "apex/Android.bp": []byte(`
6692 package {
6693 default_visibility: ["//visibility:private"],
6694 }
6695
6696 apex {
6697 name: "myapex",
6698 key: "myapex.key",
6699 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006700 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006701 }
6702
6703 apex_key {
6704 name: "myapex.key",
6705 public_key: "testkey.avbpubkey",
6706 private_key: "testkey.pem",
6707 }
6708
6709 java_library {
6710 name: "bar",
6711 srcs: ["a.java"],
6712 libs: ["foo"],
6713 apex_available: ["myapex"],
6714 sdk_version: "none",
6715 system_modules: "none",
6716 }
6717`),
6718 "source/a.java": nil,
6719 "source/api/current.txt": nil,
6720 "source/api/removed.txt": nil,
6721 "source/Android.bp": []byte(`
6722 package {
6723 default_visibility: ["//visibility:private"],
6724 }
6725
6726 java_sdk_library {
6727 name: "foo",
6728 visibility: ["//apex"],
6729 srcs: ["a.java"],
6730 api_packages: ["foo"],
6731 apex_available: ["myapex"],
6732 sdk_version: "none",
6733 system_modules: "none",
6734 public: {
6735 enabled: true,
6736 },
6737 }
6738`),
6739 "prebuilt/a.jar": nil,
6740 "prebuilt/Android.bp": []byte(`
6741 package {
6742 default_visibility: ["//visibility:private"],
6743 }
6744
6745 java_sdk_library_import {
6746 name: "foo",
6747 visibility: ["//apex", "//source"],
6748 apex_available: ["myapex"],
6749 prefer: true,
6750 public: {
6751 jars: ["a.jar"],
6752 },
6753 }
6754`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006755 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006756 )
6757
6758 // java_sdk_library installs both impl jar and permission XML
6759 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6760 "javalib/bar.jar",
6761 "javalib/foo.jar",
6762 "etc/permissions/foo.xml",
6763 })
6764
6765 // The bar library should depend on the implementation jar.
6766 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006767 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006768 t.Errorf("expected %q, found %#q", expected, actual)
6769 }
6770}
6771
6772func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6773 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6774 apex {
6775 name: "myapex",
6776 key: "myapex.key",
6777 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006778 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006779 }
6780
6781 apex_key {
6782 name: "myapex.key",
6783 public_key: "testkey.avbpubkey",
6784 private_key: "testkey.pem",
6785 }
6786
6787 java_sdk_library_import {
6788 name: "foo",
6789 apex_available: ["myapex"],
6790 prefer: true,
6791 public: {
6792 jars: ["a.jar"],
6793 },
6794 }
6795
6796 `, withFiles(filesForSdkLibrary))
6797}
6798
atrost6e126252020-01-27 17:01:16 +00006799func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006800 result := android.GroupFixturePreparers(
6801 prepareForApexTest,
6802 java.PrepareForTestWithPlatformCompatConfig,
6803 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006807 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006808 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006809 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006810 }
6811
6812 apex_key {
6813 name: "myapex.key",
6814 public_key: "testkey.avbpubkey",
6815 private_key: "testkey.pem",
6816 }
6817
6818 platform_compat_config {
6819 name: "myjar-platform-compat-config",
6820 src: ":myjar",
6821 }
6822
6823 java_library {
6824 name: "myjar",
6825 srcs: ["foo/bar/MyClass.java"],
6826 sdk_version: "none",
6827 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006828 apex_available: [ "myapex" ],
6829 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006830
6831 // Make sure that a preferred prebuilt does not affect the apex contents.
6832 prebuilt_platform_compat_config {
6833 name: "myjar-platform-compat-config",
6834 metadata: "compat-config/metadata.xml",
6835 prefer: true,
6836 }
atrost6e126252020-01-27 17:01:16 +00006837 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006838 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006839 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6840 "etc/compatconfig/myjar-platform-compat-config.xml",
6841 "javalib/myjar.jar",
6842 })
6843}
6844
Jiyong Park479321d2019-12-16 11:47:12 +09006845func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6846 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6847 apex {
6848 name: "myapex",
6849 key: "myapex.key",
6850 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006851 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006852 }
6853
6854 apex_key {
6855 name: "myapex.key",
6856 public_key: "testkey.avbpubkey",
6857 private_key: "testkey.pem",
6858 }
6859
6860 java_library {
6861 name: "myjar",
6862 srcs: ["foo/bar/MyClass.java"],
6863 sdk_version: "none",
6864 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006865 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006866 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006867 }
6868 `)
6869}
6870
Jiyong Park7afd1072019-12-30 16:56:33 +09006871func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006872 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006873 apex {
6874 name: "myapex",
6875 key: "myapex.key",
6876 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006877 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006878 }
6879
6880 apex_key {
6881 name: "myapex.key",
6882 public_key: "testkey.avbpubkey",
6883 private_key: "testkey.pem",
6884 }
6885
6886 cc_library {
6887 name: "mylib",
6888 srcs: ["mylib.cpp"],
6889 system_shared_libs: [],
6890 stl: "none",
6891 required: ["a", "b"],
6892 host_required: ["c", "d"],
6893 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006894 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006895 }
6896 `)
6897
6898 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006899 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006900 name := apexBundle.BaseModuleName()
6901 prefix := "TARGET_"
6902 var builder strings.Builder
6903 data.Custom(&builder, name, prefix, "", data)
6904 androidMk := builder.String()
6905 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6906 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6907 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6908}
6909
Jiyong Park7cd10e32020-01-14 09:22:18 +09006910func TestSymlinksFromApexToSystem(t *testing.T) {
6911 bp := `
6912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
6915 native_shared_libs: ["mylib"],
6916 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006917 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006918 }
6919
Jiyong Park9d677202020-02-19 16:29:35 +09006920 apex {
6921 name: "myapex.updatable",
6922 key: "myapex.key",
6923 native_shared_libs: ["mylib"],
6924 java_libs: ["myjar"],
6925 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006926 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006927 }
6928
Jiyong Park7cd10e32020-01-14 09:22:18 +09006929 apex_key {
6930 name: "myapex.key",
6931 public_key: "testkey.avbpubkey",
6932 private_key: "testkey.pem",
6933 }
6934
6935 cc_library {
6936 name: "mylib",
6937 srcs: ["mylib.cpp"],
6938 shared_libs: ["myotherlib"],
6939 system_shared_libs: [],
6940 stl: "none",
6941 apex_available: [
6942 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006943 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006944 "//apex_available:platform",
6945 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006946 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006947 }
6948
6949 cc_library {
6950 name: "myotherlib",
6951 srcs: ["mylib.cpp"],
6952 system_shared_libs: [],
6953 stl: "none",
6954 apex_available: [
6955 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006956 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006957 "//apex_available:platform",
6958 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006959 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006960 }
6961
6962 java_library {
6963 name: "myjar",
6964 srcs: ["foo/bar/MyClass.java"],
6965 sdk_version: "none",
6966 system_modules: "none",
6967 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006968 apex_available: [
6969 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006970 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006971 "//apex_available:platform",
6972 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006973 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006974 }
6975
6976 java_library {
6977 name: "myotherjar",
6978 srcs: ["foo/bar/MyClass.java"],
6979 sdk_version: "none",
6980 system_modules: "none",
6981 apex_available: [
6982 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006983 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006984 "//apex_available:platform",
6985 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006986 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006987 }
6988 `
6989
6990 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6991 for _, f := range files {
6992 if f.path == file {
6993 if f.isLink {
6994 t.Errorf("%q is not a real file", file)
6995 }
6996 return
6997 }
6998 }
6999 t.Errorf("%q is not found", file)
7000 }
7001
7002 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7003 for _, f := range files {
7004 if f.path == file {
7005 if !f.isLink {
7006 t.Errorf("%q is not a symlink", file)
7007 }
7008 return
7009 }
7010 }
7011 t.Errorf("%q is not found", file)
7012 }
7013
Jiyong Park9d677202020-02-19 16:29:35 +09007014 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7015 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007016 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007017 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007018 ensureRealfileExists(t, files, "javalib/myjar.jar")
7019 ensureRealfileExists(t, files, "lib64/mylib.so")
7020 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7021
Jiyong Park9d677202020-02-19 16:29:35 +09007022 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7023 ensureRealfileExists(t, files, "javalib/myjar.jar")
7024 ensureRealfileExists(t, files, "lib64/mylib.so")
7025 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7026
7027 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007028 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007029 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007030 ensureRealfileExists(t, files, "javalib/myjar.jar")
7031 ensureRealfileExists(t, files, "lib64/mylib.so")
7032 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007033
7034 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7035 ensureRealfileExists(t, files, "javalib/myjar.jar")
7036 ensureRealfileExists(t, files, "lib64/mylib.so")
7037 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007038}
7039
Yo Chiange8128052020-07-23 20:09:18 +08007040func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007041 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007042 apex {
7043 name: "myapex",
7044 key: "myapex.key",
7045 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007046 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007047 }
7048
7049 apex_key {
7050 name: "myapex.key",
7051 public_key: "testkey.avbpubkey",
7052 private_key: "testkey.pem",
7053 }
7054
7055 cc_library_shared {
7056 name: "mylib",
7057 srcs: ["mylib.cpp"],
7058 shared_libs: ["myotherlib"],
7059 system_shared_libs: [],
7060 stl: "none",
7061 apex_available: [
7062 "myapex",
7063 "//apex_available:platform",
7064 ],
7065 }
7066
7067 cc_prebuilt_library_shared {
7068 name: "myotherlib",
7069 srcs: ["prebuilt.so"],
7070 system_shared_libs: [],
7071 stl: "none",
7072 apex_available: [
7073 "myapex",
7074 "//apex_available:platform",
7075 ],
7076 }
7077 `)
7078
7079 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007080 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007081 var builder strings.Builder
7082 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7083 androidMk := builder.String()
7084 // `myotherlib` is added to `myapex` as symlink
7085 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7086 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7087 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7088 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007089 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 +08007090}
7091
Jooyung Han643adc42020-02-27 13:50:06 +09007092func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007093 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007094 apex {
7095 name: "myapex",
7096 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007097 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007098 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007099 }
7100
7101 apex_key {
7102 name: "myapex.key",
7103 public_key: "testkey.avbpubkey",
7104 private_key: "testkey.pem",
7105 }
7106
7107 cc_library {
7108 name: "mylib",
7109 srcs: ["mylib.cpp"],
7110 shared_libs: ["mylib2"],
7111 system_shared_libs: [],
7112 stl: "none",
7113 apex_available: [ "myapex" ],
7114 }
7115
7116 cc_library {
7117 name: "mylib2",
7118 srcs: ["mylib.cpp"],
7119 system_shared_libs: [],
7120 stl: "none",
7121 apex_available: [ "myapex" ],
7122 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007123
7124 rust_ffi_shared {
7125 name: "libfoo.rust",
7126 crate_name: "foo",
7127 srcs: ["foo.rs"],
7128 shared_libs: ["libfoo.shared_from_rust"],
7129 prefer_rlib: true,
7130 apex_available: ["myapex"],
7131 }
7132
7133 cc_library_shared {
7134 name: "libfoo.shared_from_rust",
7135 srcs: ["mylib.cpp"],
7136 system_shared_libs: [],
7137 stl: "none",
7138 stubs: {
7139 versions: ["10", "11", "12"],
7140 },
7141 }
7142
Jooyung Han643adc42020-02-27 13:50:06 +09007143 `)
7144
7145 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7146 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007147 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007148 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7149 "lib64/mylib.so",
7150 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007151 "lib64/libfoo.rust.so",
7152 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7153 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007154 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007155
7156 // b/220397949
7157 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007158}
7159
Jooyung Han49f67012020-04-17 13:43:10 +09007160func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007161 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007162 apex {
7163 name: "myapex",
7164 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007165 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007166 }
7167 apex_key {
7168 name: "myapex.key",
7169 public_key: "testkey.avbpubkey",
7170 private_key: "testkey.pem",
7171 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007172 `,
7173 android.FixtureModifyConfig(func(config android.Config) {
7174 delete(config.Targets, android.Android)
7175 config.AndroidCommonTarget = android.Target{}
7176 }),
7177 )
Jooyung Han49f67012020-04-17 13:43:10 +09007178
7179 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7180 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7181 }
7182}
7183
Jiyong Parkbd159612020-02-28 15:22:21 +09007184func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007185 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007186 apex {
7187 name: "myapex",
7188 key: "myapex.key",
7189 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007190 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007191 }
7192
7193 apex_key {
7194 name: "myapex.key",
7195 public_key: "testkey.avbpubkey",
7196 private_key: "testkey.pem",
7197 }
7198
7199 android_app {
7200 name: "AppFoo",
7201 srcs: ["foo/bar/MyClass.java"],
7202 sdk_version: "none",
7203 system_modules: "none",
7204 apex_available: [ "myapex" ],
7205 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007206 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007207
Colin Crosscf371cc2020-11-13 11:48:42 -08007208 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007209 content := bundleConfigRule.Args["content"]
7210
7211 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007212 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09007213}
7214
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007215func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007216 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007217 apex {
7218 name: "myapex",
7219 key: "myapex.key",
7220 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007221 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007222 }
7223
7224 apex_key {
7225 name: "myapex.key",
7226 public_key: "testkey.avbpubkey",
7227 private_key: "testkey.pem",
7228 }
7229
7230 android_app_set {
7231 name: "AppSet",
7232 set: "AppSet.apks",
7233 }`)
7234 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007235 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007236 content := bundleConfigRule.Args["content"]
7237 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7238 s := mod.Rule("apexRule").Args["copy_commands"]
7239 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7240 if len(copyCmds) != 3 {
7241 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7242 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007243 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7244 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
7245 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007246}
7247
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007248func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007249 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007250 apex_set {
7251 name: "myapex",
7252 filename: "foo_v2.apex",
7253 sanitized: {
7254 none: { set: "myapex.apks", },
7255 hwaddress: { set: "myapex.hwasan.apks", },
7256 },
Paul Duffin24704672021-04-06 16:09:30 +01007257 }
7258 `
7259 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007260
Paul Duffin24704672021-04-06 16:09:30 +01007261 // Check that the extractor produces the correct output file from the correct input file.
7262 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007263
Paul Duffin24704672021-04-06 16:09:30 +01007264 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7265 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007266
Paul Duffin24704672021-04-06 16:09:30 +01007267 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7268
7269 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007270 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7271 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007272
7273 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007274}
7275
Paul Duffin89f570a2021-06-16 01:42:33 +01007276func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007277 t.Helper()
7278
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007279 bp := `
7280 java_library {
7281 name: "some-updatable-apex-lib",
7282 srcs: ["a.java"],
7283 sdk_version: "current",
7284 apex_available: [
7285 "some-updatable-apex",
7286 ],
satayevabcd5972021-08-06 17:49:46 +01007287 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007288 }
7289
7290 java_library {
7291 name: "some-non-updatable-apex-lib",
7292 srcs: ["a.java"],
7293 apex_available: [
7294 "some-non-updatable-apex",
7295 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007296 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007297 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007298 }
7299
7300 bootclasspath_fragment {
7301 name: "some-non-updatable-fragment",
7302 contents: ["some-non-updatable-apex-lib"],
7303 apex_available: [
7304 "some-non-updatable-apex",
7305 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007306 hidden_api: {
7307 split_packages: ["*"],
7308 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007309 }
7310
7311 java_library {
7312 name: "some-platform-lib",
7313 srcs: ["a.java"],
7314 sdk_version: "current",
7315 installable: true,
7316 }
7317
7318 java_library {
7319 name: "some-art-lib",
7320 srcs: ["a.java"],
7321 sdk_version: "current",
7322 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007323 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007324 ],
7325 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007326 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007327 }
7328
7329 apex {
7330 name: "some-updatable-apex",
7331 key: "some-updatable-apex.key",
7332 java_libs: ["some-updatable-apex-lib"],
7333 updatable: true,
7334 min_sdk_version: "current",
7335 }
7336
7337 apex {
7338 name: "some-non-updatable-apex",
7339 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007340 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007341 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007342 }
7343
7344 apex_key {
7345 name: "some-updatable-apex.key",
7346 }
7347
7348 apex_key {
7349 name: "some-non-updatable-apex.key",
7350 }
7351
7352 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007353 name: "com.android.art.debug",
7354 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007355 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007356 updatable: true,
7357 min_sdk_version: "current",
7358 }
7359
Paul Duffinf23bc472021-04-27 12:42:20 +01007360 bootclasspath_fragment {
7361 name: "art-bootclasspath-fragment",
7362 image_name: "art",
7363 contents: ["some-art-lib"],
7364 apex_available: [
7365 "com.android.art.debug",
7366 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007367 hidden_api: {
7368 split_packages: ["*"],
7369 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007370 }
7371
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007372 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007373 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007374 }
7375
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007376 filegroup {
7377 name: "some-updatable-apex-file_contexts",
7378 srcs: [
7379 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7380 ],
7381 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007382
7383 filegroup {
7384 name: "some-non-updatable-apex-file_contexts",
7385 srcs: [
7386 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7387 ],
7388 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007389 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007390
Paul Duffin89f570a2021-06-16 01:42:33 +01007391 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007392}
7393
Paul Duffin89f570a2021-06-16 01:42:33 +01007394func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007395 t.Helper()
7396
Paul Duffin55607122021-03-30 23:32:51 +01007397 fs := android.MockFS{
7398 "a.java": nil,
7399 "a.jar": nil,
7400 "apex_manifest.json": nil,
7401 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007402 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007403 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7404 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7405 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007406 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007407 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007408
Paul Duffin55607122021-03-30 23:32:51 +01007409 errorHandler := android.FixtureExpectsNoErrors
7410 if errmsg != "" {
7411 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007412 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007413
Paul Duffin55607122021-03-30 23:32:51 +01007414 result := android.GroupFixturePreparers(
7415 cc.PrepareForTestWithCcDefaultModules,
7416 java.PrepareForTestWithHiddenApiBuildComponents,
7417 java.PrepareForTestWithJavaDefaultModules,
7418 java.PrepareForTestWithJavaSdkLibraryFiles,
7419 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007420 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007421 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007422 android.FixtureModifyMockFS(func(fs android.MockFS) {
7423 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7424 insert := ""
7425 for _, fragment := range fragments {
7426 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7427 }
7428 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7429 platform_bootclasspath {
7430 name: "platform-bootclasspath",
7431 fragments: [
7432 %s
7433 ],
7434 }
7435 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007436 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007437 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007438 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007439 ).
7440 ExtendWithErrorHandler(errorHandler).
7441 RunTestWithBp(t, bp)
7442
7443 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007444}
7445
Paul Duffin5556c5f2022-06-09 17:32:21 +00007446func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007447 preparers := android.GroupFixturePreparers(
7448 java.PrepareForTestWithJavaDefaultModules,
7449 PrepareForTestWithApexBuildComponents,
7450 ).
7451 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7452 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7453
7454 bpBase := `
7455 apex_set {
7456 name: "com.android.myapex",
7457 installable: true,
7458 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7459 set: "myapex.apks",
7460 }
7461
7462 apex_set {
7463 name: "com.mycompany.android.myapex",
7464 apex_name: "com.android.myapex",
7465 installable: true,
7466 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7467 set: "company-myapex.apks",
7468 }
7469
7470 prebuilt_bootclasspath_fragment {
7471 name: "my-bootclasspath-fragment",
7472 apex_available: ["com.android.myapex"],
7473 %s
7474 }
7475 `
7476
7477 t.Run("java_import", func(t *testing.T) {
7478 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7479 java_import {
7480 name: "libfoo",
7481 jars: ["libfoo.jar"],
7482 apex_available: ["com.android.myapex"],
7483 }
7484 `)
7485 })
7486
7487 t.Run("java_sdk_library_import", func(t *testing.T) {
7488 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7489 java_sdk_library_import {
7490 name: "libfoo",
7491 public: {
7492 jars: ["libbar.jar"],
7493 },
7494 apex_available: ["com.android.myapex"],
7495 }
7496 `)
7497 })
7498
7499 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7500 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7501 image_name: "art",
7502 contents: ["libfoo"],
7503 `)+`
7504 java_sdk_library_import {
7505 name: "libfoo",
7506 public: {
7507 jars: ["libbar.jar"],
7508 },
7509 apex_available: ["com.android.myapex"],
7510 }
7511 `)
7512 })
7513}
7514
Paul Duffin5556c5f2022-06-09 17:32:21 +00007515func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7516 preparers := android.GroupFixturePreparers(
7517 java.PrepareForTestWithJavaDefaultModules,
7518 PrepareForTestWithApexBuildComponents,
7519 )
7520
7521 bpBase := `
7522 apex_set {
7523 name: "com.android.myapex",
7524 installable: true,
7525 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7526 set: "myapex.apks",
7527 }
7528
7529 apex_set {
7530 name: "com.android.myapex_compressed",
7531 apex_name: "com.android.myapex",
7532 installable: true,
7533 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7534 set: "myapex_compressed.apks",
7535 }
7536
7537 prebuilt_bootclasspath_fragment {
7538 name: "my-bootclasspath-fragment",
7539 apex_available: [
7540 "com.android.myapex",
7541 "com.android.myapex_compressed",
7542 ],
7543 hidden_api: {
7544 annotation_flags: "annotation-flags.csv",
7545 metadata: "metadata.csv",
7546 index: "index.csv",
7547 signature_patterns: "signature_patterns.csv",
7548 },
7549 %s
7550 }
7551 `
7552
7553 t.Run("java_import", func(t *testing.T) {
7554 result := preparers.RunTestWithBp(t,
7555 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7556 java_import {
7557 name: "libfoo",
7558 jars: ["libfoo.jar"],
7559 apex_available: [
7560 "com.android.myapex",
7561 "com.android.myapex_compressed",
7562 ],
7563 }
7564 `)
7565
7566 module := result.Module("libfoo", "android_common_com.android.myapex")
7567 usesLibraryDep := module.(java.UsesLibraryDependency)
7568 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7569 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7570 usesLibraryDep.DexJarBuildPath().Path())
7571 })
7572
7573 t.Run("java_sdk_library_import", func(t *testing.T) {
7574 result := preparers.RunTestWithBp(t,
7575 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7576 java_sdk_library_import {
7577 name: "libfoo",
7578 public: {
7579 jars: ["libbar.jar"],
7580 },
7581 apex_available: [
7582 "com.android.myapex",
7583 "com.android.myapex_compressed",
7584 ],
7585 compile_dex: true,
7586 }
7587 `)
7588
7589 module := result.Module("libfoo", "android_common_com.android.myapex")
7590 usesLibraryDep := module.(java.UsesLibraryDependency)
7591 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7592 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7593 usesLibraryDep.DexJarBuildPath().Path())
7594 })
7595
7596 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7597 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7598 image_name: "art",
7599 contents: ["libfoo"],
7600 `)+`
7601 java_sdk_library_import {
7602 name: "libfoo",
7603 public: {
7604 jars: ["libbar.jar"],
7605 },
7606 apex_available: [
7607 "com.android.myapex",
7608 "com.android.myapex_compressed",
7609 ],
7610 compile_dex: true,
7611 }
7612 `)
7613 })
7614}
7615
Jooyung Han548640b2020-04-27 12:10:30 +09007616func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7617 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7618 apex {
7619 name: "myapex",
7620 key: "myapex.key",
7621 updatable: true,
7622 }
7623
7624 apex_key {
7625 name: "myapex.key",
7626 public_key: "testkey.avbpubkey",
7627 private_key: "testkey.pem",
7628 }
7629 `)
7630}
7631
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007632func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7633 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7634 apex {
7635 name: "myapex",
7636 key: "myapex.key",
7637 }
7638
7639 apex_key {
7640 name: "myapex.key",
7641 public_key: "testkey.avbpubkey",
7642 private_key: "testkey.pem",
7643 }
7644 `)
7645}
7646
Daniel Norman69109112021-12-02 12:52:42 -08007647func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7648 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7649 apex {
7650 name: "myapex",
7651 key: "myapex.key",
7652 updatable: true,
7653 soc_specific: true,
7654 }
7655
7656 apex_key {
7657 name: "myapex.key",
7658 public_key: "testkey.avbpubkey",
7659 private_key: "testkey.pem",
7660 }
7661 `)
7662}
7663
satayevb98371c2021-06-15 16:49:50 +01007664func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7665 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7666 apex {
7667 name: "myapex",
7668 key: "myapex.key",
7669 systemserverclasspath_fragments: [
7670 "mysystemserverclasspathfragment",
7671 ],
7672 min_sdk_version: "29",
7673 updatable: true,
7674 }
7675
7676 apex_key {
7677 name: "myapex.key",
7678 public_key: "testkey.avbpubkey",
7679 private_key: "testkey.pem",
7680 }
7681
7682 java_library {
7683 name: "foo",
7684 srcs: ["b.java"],
7685 min_sdk_version: "29",
7686 installable: true,
7687 apex_available: [
7688 "myapex",
7689 ],
7690 }
7691
7692 systemserverclasspath_fragment {
7693 name: "mysystemserverclasspathfragment",
7694 generate_classpaths_proto: false,
7695 contents: [
7696 "foo",
7697 ],
7698 apex_available: [
7699 "myapex",
7700 ],
7701 }
satayevabcd5972021-08-06 17:49:46 +01007702 `,
7703 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7704 )
satayevb98371c2021-06-15 16:49:50 +01007705}
7706
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007707func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007708 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7709 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7710 // modules to be included in the BootJars.
7711 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7712 return android.GroupFixturePreparers(
7713 dexpreopt.FixtureSetBootJars(bootJars...),
7714 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7715 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7716 }),
7717 )
7718 }
7719
7720 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7721 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7722 // specified in the ArtApexJars configuration.
7723 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7724 return android.GroupFixturePreparers(
7725 dexpreopt.FixtureSetArtBootJars(bootJars...),
7726 dexpreopt.FixtureSetBootJars(bootJars...),
7727 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7728 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7729 }),
7730 )
7731 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007732
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007733 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007734 preparer := android.GroupFixturePreparers(
7735 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7736 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7737 )
7738 fragments := []java.ApexVariantReference{
7739 {
7740 Apex: proptools.StringPtr("com.android.art.debug"),
7741 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7742 },
7743 {
7744 Apex: proptools.StringPtr("some-non-updatable-apex"),
7745 Module: proptools.StringPtr("some-non-updatable-fragment"),
7746 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007747 }
satayevabcd5972021-08-06 17:49:46 +01007748 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007749 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007750
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007751 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007752 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7753 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007754 preparer := android.GroupFixturePreparers(
7755 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7756 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7757 )
Paul Duffin60264a02021-04-12 20:02:36 +01007758 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007759 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007760
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007761 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007762 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007763 // Update the dexpreopt ArtApexJars directly.
7764 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7765 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007766 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007767
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007768 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007769 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007770 // Update the dexpreopt ArtApexJars directly.
7771 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7772 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007773 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007774
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007775 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007776 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01007777 preparer := android.GroupFixturePreparers(
7778 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7779 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7780 )
Paul Duffin60264a02021-04-12 20:02:36 +01007781 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007782 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007783
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007784 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007785 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007786 fragment := java.ApexVariantReference{
7787 Apex: proptools.StringPtr("some-non-updatable-apex"),
7788 Module: proptools.StringPtr("some-non-updatable-fragment"),
7789 }
7790 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007791 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007792
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007793 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007794 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007795 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7796 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007797 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007798
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007799 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007800 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007801 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7802 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007803 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007804
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007805 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007806 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007807 // Update the dexpreopt ArtApexJars directly.
7808 preparer := prepareSetArtJars("platform:some-platform-lib")
7809 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007810 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007811
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007812 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007813 preparer := android.GroupFixturePreparers(
7814 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7815 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7816 )
7817 fragments := []java.ApexVariantReference{
7818 {
7819 Apex: proptools.StringPtr("some-non-updatable-apex"),
7820 Module: proptools.StringPtr("some-non-updatable-fragment"),
7821 },
7822 }
7823 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007824 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007825}
7826
7827func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007828 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007829 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007830 fragment := java.ApexVariantReference{
7831 Apex: proptools.StringPtr("myapex"),
7832 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7833 }
7834
Paul Duffin064b70c2020-11-02 17:32:38 +00007835 testDexpreoptWithApexes(t, `
7836 prebuilt_apex {
7837 name: "myapex" ,
7838 arch: {
7839 arm64: {
7840 src: "myapex-arm64.apex",
7841 },
7842 arm: {
7843 src: "myapex-arm.apex",
7844 },
7845 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007846 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7847 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007848
Paul Duffin89f570a2021-06-16 01:42:33 +01007849 prebuilt_bootclasspath_fragment {
7850 name: "my-bootclasspath-fragment",
7851 contents: ["libfoo"],
7852 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007853 hidden_api: {
7854 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7855 metadata: "my-bootclasspath-fragment/metadata.csv",
7856 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007857 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7858 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7859 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007860 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007861 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007862
Paul Duffin89f570a2021-06-16 01:42:33 +01007863 java_import {
7864 name: "libfoo",
7865 jars: ["libfoo.jar"],
7866 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007867 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007868 }
7869 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007870 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007871}
7872
Spandan Dasf14e2542021-11-12 00:01:37 +00007873func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007874 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007875 bp += `
7876 apex_key {
7877 name: "myapex.key",
7878 public_key: "testkey.avbpubkey",
7879 private_key: "testkey.pem",
7880 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007881 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007882 "lib1/src/A.java": nil,
7883 "lib2/src/B.java": nil,
7884 "system/sepolicy/apex/myapex-file_contexts": nil,
7885 }
7886
Paul Duffin45338f02021-03-30 23:07:52 +01007887 errorHandler := android.FixtureExpectsNoErrors
7888 if errmsg != "" {
7889 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007890 }
Colin Crossae8600b2020-10-29 17:09:13 -07007891
Paul Duffin45338f02021-03-30 23:07:52 +01007892 android.GroupFixturePreparers(
7893 android.PrepareForTestWithAndroidBuildComponents,
7894 java.PrepareForTestWithJavaBuildComponents,
7895 PrepareForTestWithApexBuildComponents,
7896 android.PrepareForTestWithNeverallowRules(rules),
7897 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007898 apexBootJars := make([]string, 0, len(bootJars))
7899 for _, apexBootJar := range bootJars {
7900 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007901 }
satayevd604b212021-07-21 14:23:52 +01007902 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007903 }),
7904 fs.AddToFixture(),
7905 ).
7906 ExtendWithErrorHandler(errorHandler).
7907 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007908}
7909
7910func TestApexPermittedPackagesRules(t *testing.T) {
7911 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007912 name string
7913 expectedError string
7914 bp string
7915 bootJars []string
7916 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007917 }{
7918
7919 {
7920 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7921 expectedError: "",
7922 bp: `
7923 java_library {
7924 name: "bcp_lib1",
7925 srcs: ["lib1/src/*.java"],
7926 permitted_packages: ["foo.bar"],
7927 apex_available: ["myapex"],
7928 sdk_version: "none",
7929 system_modules: "none",
7930 }
7931 java_library {
7932 name: "nonbcp_lib2",
7933 srcs: ["lib2/src/*.java"],
7934 apex_available: ["myapex"],
7935 permitted_packages: ["a.b"],
7936 sdk_version: "none",
7937 system_modules: "none",
7938 }
7939 apex {
7940 name: "myapex",
7941 key: "myapex.key",
7942 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007943 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007944 }`,
7945 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007946 bcpPermittedPackages: map[string][]string{
7947 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007948 "foo.bar",
7949 },
7950 },
7951 },
7952 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007953 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007954 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01007955 bp: `
7956 java_library {
7957 name: "bcp_lib1",
7958 srcs: ["lib1/src/*.java"],
7959 apex_available: ["myapex"],
7960 permitted_packages: ["foo.bar"],
7961 sdk_version: "none",
7962 system_modules: "none",
7963 }
7964 java_library {
7965 name: "bcp_lib2",
7966 srcs: ["lib2/src/*.java"],
7967 apex_available: ["myapex"],
7968 permitted_packages: ["foo.bar", "bar.baz"],
7969 sdk_version: "none",
7970 system_modules: "none",
7971 }
7972 apex {
7973 name: "myapex",
7974 key: "myapex.key",
7975 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007976 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007977 }
7978 `,
7979 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007980 bcpPermittedPackages: map[string][]string{
7981 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007982 "foo.bar",
7983 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007984 "bcp_lib2": []string{
7985 "foo.bar",
7986 },
7987 },
7988 },
7989 {
7990 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7991 expectedError: "",
7992 bp: `
7993 java_library {
7994 name: "bcp_lib_restricted",
7995 srcs: ["lib1/src/*.java"],
7996 apex_available: ["myapex"],
7997 permitted_packages: ["foo.bar"],
7998 sdk_version: "none",
7999 min_sdk_version: "29",
8000 system_modules: "none",
8001 }
8002 java_library {
8003 name: "bcp_lib_unrestricted",
8004 srcs: ["lib2/src/*.java"],
8005 apex_available: ["myapex"],
8006 permitted_packages: ["foo.bar", "bar.baz"],
8007 sdk_version: "none",
8008 min_sdk_version: "29",
8009 system_modules: "none",
8010 }
8011 apex {
8012 name: "myapex",
8013 key: "myapex.key",
8014 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8015 updatable: true,
8016 min_sdk_version: "29",
8017 }
8018 `,
8019 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8020 bcpPermittedPackages: map[string][]string{
8021 "bcp_lib1_non_updateable": []string{
8022 "foo.bar",
8023 },
8024 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008025 },
8026 },
8027 }
8028 for _, tc := range testcases {
8029 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008030 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8031 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008032 })
8033 }
8034}
8035
Jiyong Park62304bb2020-04-13 16:19:48 +09008036func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008037 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008038 apex {
8039 name: "myapex",
8040 key: "myapex.key",
8041 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008042 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008043 }
8044
8045 apex_key {
8046 name: "myapex.key",
8047 public_key: "testkey.avbpubkey",
8048 private_key: "testkey.pem",
8049 }
8050
8051 cc_library {
8052 name: "mylib",
8053 srcs: ["mylib.cpp"],
8054 system_shared_libs: [],
8055 stl: "none",
8056 stubs: {
8057 versions: ["1"],
8058 },
8059 apex_available: ["myapex"],
8060 }
8061
8062 cc_library {
8063 name: "myprivlib",
8064 srcs: ["mylib.cpp"],
8065 system_shared_libs: [],
8066 stl: "none",
8067 apex_available: ["myapex"],
8068 }
8069
8070
8071 cc_test {
8072 name: "mytest",
8073 gtest: false,
8074 srcs: ["mylib.cpp"],
8075 system_shared_libs: [],
8076 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008077 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008078 test_for: ["myapex"]
8079 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008080
8081 cc_library {
8082 name: "mytestlib",
8083 srcs: ["mylib.cpp"],
8084 system_shared_libs: [],
8085 shared_libs: ["mylib", "myprivlib"],
8086 stl: "none",
8087 test_for: ["myapex"],
8088 }
8089
8090 cc_benchmark {
8091 name: "mybench",
8092 srcs: ["mylib.cpp"],
8093 system_shared_libs: [],
8094 shared_libs: ["mylib", "myprivlib"],
8095 stl: "none",
8096 test_for: ["myapex"],
8097 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008098 `)
8099
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008100 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008101 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008102 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8103 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8104 }
8105
8106 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008107 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008108 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8109 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8110 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8111}
Jiyong Park46a512f2020-12-04 18:02:13 +09008112
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008113func TestIndirectTestFor(t *testing.T) {
8114 ctx := testApex(t, `
8115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
8118 native_shared_libs: ["mylib", "myprivlib"],
8119 updatable: false,
8120 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008121
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008122 apex_key {
8123 name: "myapex.key",
8124 public_key: "testkey.avbpubkey",
8125 private_key: "testkey.pem",
8126 }
8127
8128 cc_library {
8129 name: "mylib",
8130 srcs: ["mylib.cpp"],
8131 system_shared_libs: [],
8132 stl: "none",
8133 stubs: {
8134 versions: ["1"],
8135 },
8136 apex_available: ["myapex"],
8137 }
8138
8139 cc_library {
8140 name: "myprivlib",
8141 srcs: ["mylib.cpp"],
8142 system_shared_libs: [],
8143 stl: "none",
8144 shared_libs: ["mylib"],
8145 apex_available: ["myapex"],
8146 }
8147
8148 cc_library {
8149 name: "mytestlib",
8150 srcs: ["mylib.cpp"],
8151 system_shared_libs: [],
8152 shared_libs: ["myprivlib"],
8153 stl: "none",
8154 test_for: ["myapex"],
8155 }
8156 `)
8157
8158 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008159 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008160 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8161 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8162 }
8163
8164 // The platform variant of mytestlib links to the platform variant of the
8165 // internal myprivlib.
8166 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8167
8168 // The platform variant of myprivlib links to the platform variant of mylib
8169 // and bypasses its stubs.
8170 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 +09008171}
8172
Martin Stjernholmec009002021-03-27 15:18:31 +00008173func TestTestForForLibInOtherApex(t *testing.T) {
8174 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8175 _ = testApex(t, `
8176 apex {
8177 name: "com.android.art",
8178 key: "myapex.key",
8179 native_shared_libs: ["mylib"],
8180 updatable: false,
8181 }
8182
8183 apex {
8184 name: "com.android.art.debug",
8185 key: "myapex.key",
8186 native_shared_libs: ["mylib", "mytestlib"],
8187 updatable: false,
8188 }
8189
8190 apex_key {
8191 name: "myapex.key",
8192 public_key: "testkey.avbpubkey",
8193 private_key: "testkey.pem",
8194 }
8195
8196 cc_library {
8197 name: "mylib",
8198 srcs: ["mylib.cpp"],
8199 system_shared_libs: [],
8200 stl: "none",
8201 stubs: {
8202 versions: ["1"],
8203 },
8204 apex_available: ["com.android.art", "com.android.art.debug"],
8205 }
8206
8207 cc_library {
8208 name: "mytestlib",
8209 srcs: ["mylib.cpp"],
8210 system_shared_libs: [],
8211 shared_libs: ["mylib"],
8212 stl: "none",
8213 apex_available: ["com.android.art.debug"],
8214 test_for: ["com.android.art"],
8215 }
8216 `,
8217 android.MockFS{
8218 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8219 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8220 }.AddToFixture())
8221}
8222
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008223// TODO(jungjw): Move this to proptools
8224func intPtr(i int) *int {
8225 return &i
8226}
8227
8228func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008229 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008230 apex_set {
8231 name: "myapex",
8232 set: "myapex.apks",
8233 filename: "foo_v2.apex",
8234 overrides: ["foo"],
8235 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008236 `,
8237 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8238 variables.Platform_sdk_version = intPtr(30)
8239 }),
8240 android.FixtureModifyConfig(func(config android.Config) {
8241 config.Targets[android.Android] = []android.Target{
8242 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8243 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8244 }
8245 }),
8246 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008247
Paul Duffin24704672021-04-06 16:09:30 +01008248 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008249
8250 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008251 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008252 actual := extractedApex.Args["abis"]
8253 expected := "ARMEABI_V7A,ARM64_V8A"
8254 if actual != expected {
8255 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8256 }
8257 actual = extractedApex.Args["sdk-version"]
8258 expected = "30"
8259 if actual != expected {
8260 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8261 }
8262
Paul Duffin6717d882021-06-15 19:09:41 +01008263 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008264 a := m.Module().(*ApexSet)
8265 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008266 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008267 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8268 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8269 }
8270}
8271
Jiyong Park7d95a512020-05-10 15:16:24 +09008272func TestNoStaticLinkingToStubsLib(t *testing.T) {
8273 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8274 apex {
8275 name: "myapex",
8276 key: "myapex.key",
8277 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008278 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008279 }
8280
8281 apex_key {
8282 name: "myapex.key",
8283 public_key: "testkey.avbpubkey",
8284 private_key: "testkey.pem",
8285 }
8286
8287 cc_library {
8288 name: "mylib",
8289 srcs: ["mylib.cpp"],
8290 static_libs: ["otherlib"],
8291 system_shared_libs: [],
8292 stl: "none",
8293 apex_available: [ "myapex" ],
8294 }
8295
8296 cc_library {
8297 name: "otherlib",
8298 srcs: ["mylib.cpp"],
8299 system_shared_libs: [],
8300 stl: "none",
8301 stubs: {
8302 versions: ["1", "2", "3"],
8303 },
8304 apex_available: [ "myapex" ],
8305 }
8306 `)
8307}
8308
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008309func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008310 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008311 apex {
8312 name: "myapex",
8313 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008314 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008315 custom_sign_tool: "sign_myapex",
8316 }
8317
8318 apex_key {
8319 name: "myapex.key",
8320 public_key: "testkey.avbpubkey",
8321 private_key: "testkey.pem",
8322 }
8323 `)
8324
8325 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8326 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8327 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
8328}
8329
8330func TestApexKeysTxtOverrides(t *testing.T) {
8331 ctx := testApex(t, `
8332 apex {
8333 name: "myapex",
8334 key: "myapex.key",
8335 updatable: false,
8336 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008337 }
8338
8339 apex_key {
8340 name: "myapex.key",
8341 public_key: "testkey.avbpubkey",
8342 private_key: "testkey.pem",
8343 }
8344
8345 prebuilt_apex {
8346 name: "myapex",
8347 prefer: true,
8348 arch: {
8349 arm64: {
8350 src: "myapex-arm64.apex",
8351 },
8352 arm: {
8353 src: "myapex-arm.apex",
8354 },
8355 },
8356 }
8357
8358 apex_set {
8359 name: "myapex_set",
8360 set: "myapex.apks",
8361 filename: "myapex_set.apex",
8362 overrides: ["myapex"],
8363 }
8364 `)
8365
8366 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8367 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8368 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 +09008369 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 +09008370}
8371
Jooyung Han938b5932020-06-20 12:47:47 +09008372func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008373 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008374 apex {
8375 name: "myapex",
8376 key: "myapex.key",
8377 apps: ["app"],
8378 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008379 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008380 }
8381
8382 apex_key {
8383 name: "myapex.key",
8384 public_key: "testkey.avbpubkey",
8385 private_key: "testkey.pem",
8386 }
8387
8388 android_app {
8389 name: "app",
8390 srcs: ["foo/bar/MyClass.java"],
8391 package_name: "foo",
8392 sdk_version: "none",
8393 system_modules: "none",
8394 apex_available: [ "myapex" ],
8395 }
8396 `, withFiles(map[string][]byte{
8397 "sub/Android.bp": []byte(`
8398 override_apex {
8399 name: "override_myapex",
8400 base: "myapex",
8401 apps: ["override_app"],
8402 allowed_files: ":allowed",
8403 }
8404 // Overridable "path" property should be referenced indirectly
8405 filegroup {
8406 name: "allowed",
8407 srcs: ["allowed.txt"],
8408 }
8409 override_android_app {
8410 name: "override_app",
8411 base: "app",
8412 package_name: "bar",
8413 }
8414 `),
8415 }))
8416
8417 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8418 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8419 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8420 }
8421
8422 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8423 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8424 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8425 }
8426}
8427
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008428func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008429 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008430 apex {
8431 name: "myapex",
8432 key: "myapex.key",
8433 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008434 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008435 }
8436
8437 apex_key {
8438 name: "myapex.key",
8439 public_key: "testkey.avbpubkey",
8440 private_key: "testkey.pem",
8441 }
8442
8443 cc_library {
8444 name: "mylib",
8445 srcs: ["mylib.cpp"],
8446 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008447 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008448 },
8449 apex_available: ["myapex"],
8450 }
8451
8452 cc_prebuilt_library_shared {
8453 name: "mylib",
8454 prefer: false,
8455 srcs: ["prebuilt.so"],
8456 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008457 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008458 },
8459 apex_available: ["myapex"],
8460 }
8461 `)
8462}
8463
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008464func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008465 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008466 apex {
8467 name: "myapex",
8468 key: "myapex.key",
8469 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008470 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008471 }
8472 apex_key {
8473 name: "myapex.key",
8474 public_key: "testkey.avbpubkey",
8475 private_key: "testkey.pem",
8476 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008477 `,
8478 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8479 variables.CompressedApex = proptools.BoolPtr(true)
8480 }),
8481 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008482
8483 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8484 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8485
8486 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8487 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8488
8489 // Make sure output of bundle is .capex
8490 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8491 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8492
8493 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008494 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008495 var builder strings.Builder
8496 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8497 androidMk := builder.String()
8498 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8499}
8500
Martin Stjernholm2856c662020-12-02 15:03:42 +00008501func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008502 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008503 apex {
8504 name: "myapex",
8505 key: "myapex.key",
8506 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008507 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008508 }
8509
8510 apex_key {
8511 name: "myapex.key",
8512 public_key: "testkey.avbpubkey",
8513 private_key: "testkey.pem",
8514 }
8515
8516 cc_library {
8517 name: "mylib",
8518 srcs: ["mylib.cpp"],
8519 apex_available: ["myapex"],
8520 shared_libs: ["otherlib"],
8521 system_shared_libs: [],
8522 }
8523
8524 cc_library {
8525 name: "otherlib",
8526 srcs: ["mylib.cpp"],
8527 stubs: {
8528 versions: ["current"],
8529 },
8530 }
8531
8532 cc_prebuilt_library_shared {
8533 name: "otherlib",
8534 prefer: true,
8535 srcs: ["prebuilt.so"],
8536 stubs: {
8537 versions: ["current"],
8538 },
8539 }
8540 `)
8541
8542 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008543 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008544 var builder strings.Builder
8545 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8546 androidMk := builder.String()
8547
8548 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8549 // a thing there.
8550 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8551}
8552
Jiyong Parke3867542020-12-03 17:28:25 +09008553func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008554 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008555 apex {
8556 name: "myapex",
8557 key: "myapex.key",
8558 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008559 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008560 }
8561
8562 apex_key {
8563 name: "myapex.key",
8564 public_key: "testkey.avbpubkey",
8565 private_key: "testkey.pem",
8566 }
8567
8568 cc_library {
8569 name: "mylib",
8570 srcs: ["mylib.cpp"],
8571 system_shared_libs: [],
8572 stl: "none",
8573 apex_available: ["myapex"],
8574 shared_libs: ["mylib2"],
8575 target: {
8576 apex: {
8577 exclude_shared_libs: ["mylib2"],
8578 },
8579 },
8580 }
8581
8582 cc_library {
8583 name: "mylib2",
8584 srcs: ["mylib.cpp"],
8585 system_shared_libs: [],
8586 stl: "none",
8587 }
8588 `)
8589
8590 // Check if mylib is linked to mylib2 for the non-apex target
8591 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8592 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8593
8594 // Make sure that the link doesn't occur for the apex target
8595 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8596 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8597
8598 // It shouldn't appear in the copy cmd as well.
8599 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8600 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8601}
8602
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008603func TestPrebuiltStubLibDep(t *testing.T) {
8604 bpBase := `
8605 apex {
8606 name: "myapex",
8607 key: "myapex.key",
8608 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008609 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008610 }
8611 apex_key {
8612 name: "myapex.key",
8613 public_key: "testkey.avbpubkey",
8614 private_key: "testkey.pem",
8615 }
8616 cc_library {
8617 name: "mylib",
8618 srcs: ["mylib.cpp"],
8619 apex_available: ["myapex"],
8620 shared_libs: ["stublib"],
8621 system_shared_libs: [],
8622 }
8623 apex {
8624 name: "otherapex",
8625 enabled: %s,
8626 key: "myapex.key",
8627 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008628 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008629 }
8630 `
8631
8632 stublibSourceBp := `
8633 cc_library {
8634 name: "stublib",
8635 srcs: ["mylib.cpp"],
8636 apex_available: ["otherapex"],
8637 system_shared_libs: [],
8638 stl: "none",
8639 stubs: {
8640 versions: ["1"],
8641 },
8642 }
8643 `
8644
8645 stublibPrebuiltBp := `
8646 cc_prebuilt_library_shared {
8647 name: "stublib",
8648 srcs: ["prebuilt.so"],
8649 apex_available: ["otherapex"],
8650 stubs: {
8651 versions: ["1"],
8652 },
8653 %s
8654 }
8655 `
8656
8657 tests := []struct {
8658 name string
8659 stublibBp string
8660 usePrebuilt bool
8661 modNames []string // Modules to collect AndroidMkEntries for
8662 otherApexEnabled []string
8663 }{
8664 {
8665 name: "only_source",
8666 stublibBp: stublibSourceBp,
8667 usePrebuilt: false,
8668 modNames: []string{"stublib"},
8669 otherApexEnabled: []string{"true", "false"},
8670 },
8671 {
8672 name: "source_preferred",
8673 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8674 usePrebuilt: false,
8675 modNames: []string{"stublib", "prebuilt_stublib"},
8676 otherApexEnabled: []string{"true", "false"},
8677 },
8678 {
8679 name: "prebuilt_preferred",
8680 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8681 usePrebuilt: true,
8682 modNames: []string{"stublib", "prebuilt_stublib"},
8683 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8684 },
8685 {
8686 name: "only_prebuilt",
8687 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8688 usePrebuilt: true,
8689 modNames: []string{"stublib"},
8690 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8691 },
8692 }
8693
8694 for _, test := range tests {
8695 t.Run(test.name, func(t *testing.T) {
8696 for _, otherApexEnabled := range test.otherApexEnabled {
8697 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008698 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008699
8700 type modAndMkEntries struct {
8701 mod *cc.Module
8702 mkEntries android.AndroidMkEntries
8703 }
8704 entries := []*modAndMkEntries{}
8705
8706 // Gather shared lib modules that are installable
8707 for _, modName := range test.modNames {
8708 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8709 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8710 continue
8711 }
8712 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008713 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008714 continue
8715 }
Colin Crossaa255532020-07-03 13:18:24 -07008716 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008717 if ent.Disabled {
8718 continue
8719 }
8720 entries = append(entries, &modAndMkEntries{
8721 mod: mod,
8722 mkEntries: ent,
8723 })
8724 }
8725 }
8726 }
8727
8728 var entry *modAndMkEntries = nil
8729 for _, ent := range entries {
8730 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8731 if entry != nil {
8732 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8733 } else {
8734 entry = ent
8735 }
8736 }
8737 }
8738
8739 if entry == nil {
8740 t.Errorf("AndroidMk entry for \"stublib\" missing")
8741 } else {
8742 isPrebuilt := entry.mod.Prebuilt() != nil
8743 if isPrebuilt != test.usePrebuilt {
8744 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8745 }
8746 if !entry.mod.IsStubs() {
8747 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8748 }
8749 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8750 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8751 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008752 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008753 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008754 if !android.InList(expected, cflags) {
8755 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8756 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008757 }
8758 })
8759 }
8760 })
8761 }
8762}
8763
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008764func TestHostApexInHostOnlyBuild(t *testing.T) {
8765 testApex(t, `
8766 apex {
8767 name: "myapex",
8768 host_supported: true,
8769 key: "myapex.key",
8770 updatable: false,
8771 payload_type: "zip",
8772 }
8773 apex_key {
8774 name: "myapex.key",
8775 public_key: "testkey.avbpubkey",
8776 private_key: "testkey.pem",
8777 }
8778 `,
8779 android.FixtureModifyConfig(func(config android.Config) {
8780 // We may not have device targets in all builds, e.g. in
8781 // prebuilts/build-tools/build-prebuilts.sh
8782 config.Targets[android.Android] = []android.Target{}
8783 }))
8784}
8785
Colin Crossc33e5212021-05-25 18:16:02 -07008786func TestApexJavaCoverage(t *testing.T) {
8787 bp := `
8788 apex {
8789 name: "myapex",
8790 key: "myapex.key",
8791 java_libs: ["mylib"],
8792 bootclasspath_fragments: ["mybootclasspathfragment"],
8793 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8794 updatable: false,
8795 }
8796
8797 apex_key {
8798 name: "myapex.key",
8799 public_key: "testkey.avbpubkey",
8800 private_key: "testkey.pem",
8801 }
8802
8803 java_library {
8804 name: "mylib",
8805 srcs: ["mylib.java"],
8806 apex_available: ["myapex"],
8807 compile_dex: true,
8808 }
8809
8810 bootclasspath_fragment {
8811 name: "mybootclasspathfragment",
8812 contents: ["mybootclasspathlib"],
8813 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008814 hidden_api: {
8815 split_packages: ["*"],
8816 },
Colin Crossc33e5212021-05-25 18:16:02 -07008817 }
8818
8819 java_library {
8820 name: "mybootclasspathlib",
8821 srcs: ["mybootclasspathlib.java"],
8822 apex_available: ["myapex"],
8823 compile_dex: true,
8824 }
8825
8826 systemserverclasspath_fragment {
8827 name: "mysystemserverclasspathfragment",
8828 contents: ["mysystemserverclasspathlib"],
8829 apex_available: ["myapex"],
8830 }
8831
8832 java_library {
8833 name: "mysystemserverclasspathlib",
8834 srcs: ["mysystemserverclasspathlib.java"],
8835 apex_available: ["myapex"],
8836 compile_dex: true,
8837 }
8838 `
8839
8840 result := android.GroupFixturePreparers(
8841 PrepareForTestWithApexBuildComponents,
8842 prepareForTestWithMyapex,
8843 java.PrepareForTestWithJavaDefaultModules,
8844 android.PrepareForTestWithAndroidBuildComponents,
8845 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008846 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8847 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008848 android.FixtureMergeEnv(map[string]string{
8849 "EMMA_INSTRUMENT": "true",
8850 }),
8851 ).RunTest(t)
8852
8853 // Make sure jacoco ran on both mylib and mybootclasspathlib
8854 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8855 t.Errorf("Failed to find jacoco rule for mylib")
8856 }
8857 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8858 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8859 }
8860 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8861 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8862 }
8863}
8864
Jiyong Park192600a2021-08-03 07:52:17 +00008865func TestProhibitStaticExecutable(t *testing.T) {
8866 testApexError(t, `executable mybin is static`, `
8867 apex {
8868 name: "myapex",
8869 key: "myapex.key",
8870 binaries: ["mybin"],
8871 min_sdk_version: "29",
8872 }
8873
8874 apex_key {
8875 name: "myapex.key",
8876 public_key: "testkey.avbpubkey",
8877 private_key: "testkey.pem",
8878 }
8879
8880 cc_binary {
8881 name: "mybin",
8882 srcs: ["mylib.cpp"],
8883 relative_install_path: "foo/bar",
8884 static_executable: true,
8885 system_shared_libs: [],
8886 stl: "none",
8887 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008888 min_sdk_version: "29",
8889 }
8890 `)
8891
8892 testApexError(t, `executable mybin.rust is static`, `
8893 apex {
8894 name: "myapex",
8895 key: "myapex.key",
8896 binaries: ["mybin.rust"],
8897 min_sdk_version: "29",
8898 }
8899
8900 apex_key {
8901 name: "myapex.key",
8902 public_key: "testkey.avbpubkey",
8903 private_key: "testkey.pem",
8904 }
8905
8906 rust_binary {
8907 name: "mybin.rust",
8908 srcs: ["foo.rs"],
8909 static_executable: true,
8910 apex_available: ["myapex"],
8911 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008912 }
8913 `)
8914}
8915
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008916func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8917 ctx := testApex(t, `
8918 apex {
8919 name: "myapex",
8920 key: "myapex.key",
8921 updatable: false,
8922 java_libs: ["foo"],
8923 }
8924
8925 apex_key {
8926 name: "myapex.key",
8927 public_key: "testkey.avbpubkey",
8928 private_key: "testkey.pem",
8929 }
8930
8931 java_library {
8932 name: "foo",
8933 srcs: ["foo.java"],
8934 apex_available: ["myapex"],
8935 installable: true,
8936 }
8937 `,
8938 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8939 )
8940
8941 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8942 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8943 var builder strings.Builder
8944 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8945 androidMk := builder.String()
8946 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex")
8947}
8948
8949func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8950 ctx := testApex(t, `
8951 prebuilt_apex {
8952 name: "myapex",
8953 arch: {
8954 arm64: {
8955 src: "myapex-arm64.apex",
8956 },
8957 arm: {
8958 src: "myapex-arm.apex",
8959 },
8960 },
8961 exported_java_libs: ["foo"],
8962 }
8963
8964 java_import {
8965 name: "foo",
8966 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008967 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008968 }
8969 `,
8970 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8971 )
8972
8973 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8974 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8975 mainModuleEntries := entriesList[0]
8976 android.AssertArrayString(t,
8977 "LOCAL_REQUIRED_MODULES",
8978 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8979 []string{
8980 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8981 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8982 })
8983}
8984
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008985func TestAndroidMk_RequiredModules(t *testing.T) {
8986 ctx := testApex(t, `
8987 apex {
8988 name: "myapex",
8989 key: "myapex.key",
8990 updatable: false,
8991 java_libs: ["foo"],
8992 required: ["otherapex"],
8993 }
8994
8995 apex {
8996 name: "otherapex",
8997 key: "myapex.key",
8998 updatable: false,
8999 java_libs: ["foo"],
9000 required: ["otherapex"],
9001 }
9002
9003 apex_key {
9004 name: "myapex.key",
9005 public_key: "testkey.avbpubkey",
9006 private_key: "testkey.pem",
9007 }
9008
9009 java_library {
9010 name: "foo",
9011 srcs: ["foo.java"],
9012 apex_available: ["myapex", "otherapex"],
9013 installable: true,
9014 }
9015 `)
9016
9017 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9018 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9019 var builder strings.Builder
9020 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9021 androidMk := builder.String()
9022 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9023}
9024
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009025func TestAndroidMk_RequiredDeps(t *testing.T) {
9026 ctx := testApex(t, `
9027 apex {
9028 name: "myapex",
9029 key: "myapex.key",
9030 updatable: false,
9031 }
9032
9033 apex_key {
9034 name: "myapex.key",
9035 public_key: "testkey.avbpubkey",
9036 private_key: "testkey.pem",
9037 }
9038 `)
9039
9040 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9041 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9042 data := android.AndroidMkDataForTest(t, ctx, bundle)
9043 var builder strings.Builder
9044 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9045 androidMk := builder.String()
9046 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9047
9048 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9049 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9050 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9051 var flattenedBuilder strings.Builder
9052 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9053 flattenedAndroidMk := flattenedBuilder.String()
9054 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9055}
9056
Jooyung Hana6d36672022-02-24 13:58:07 +09009057func TestApexOutputFileProducer(t *testing.T) {
9058 for _, tc := range []struct {
9059 name string
9060 ref string
9061 expected_data []string
9062 }{
9063 {
9064 name: "test_using_output",
9065 ref: ":myapex",
9066 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9067 },
9068 {
9069 name: "test_using_apex",
9070 ref: ":myapex{.apex}",
9071 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9072 },
9073 } {
9074 t.Run(tc.name, func(t *testing.T) {
9075 ctx := testApex(t, `
9076 apex {
9077 name: "myapex",
9078 key: "myapex.key",
9079 compressible: true,
9080 updatable: false,
9081 }
9082
9083 apex_key {
9084 name: "myapex.key",
9085 public_key: "testkey.avbpubkey",
9086 private_key: "testkey.pem",
9087 }
9088
9089 java_test {
9090 name: "`+tc.name+`",
9091 srcs: ["a.java"],
9092 data: ["`+tc.ref+`"],
9093 }
9094 `,
9095 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9096 variables.CompressedApex = proptools.BoolPtr(true)
9097 }))
9098 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9099 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9100 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9101 })
9102 }
9103}
9104
satayev758968a2021-12-06 11:42:40 +00009105func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9106 preparer := android.GroupFixturePreparers(
9107 PrepareForTestWithApexBuildComponents,
9108 prepareForTestWithMyapex,
9109 java.PrepareForTestWithJavaSdkLibraryFiles,
9110 java.PrepareForTestWithJavaDefaultModules,
9111 android.PrepareForTestWithAndroidBuildComponents,
9112 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9113 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9114 )
9115
9116 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9117 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9118 preparer.RunTestWithBp(t, `
9119 apex {
9120 name: "myapex",
9121 key: "myapex.key",
9122 bootclasspath_fragments: ["mybootclasspathfragment"],
9123 min_sdk_version: "30",
9124 updatable: false,
9125 }
9126
9127 apex_key {
9128 name: "myapex.key",
9129 public_key: "testkey.avbpubkey",
9130 private_key: "testkey.pem",
9131 }
9132
9133 bootclasspath_fragment {
9134 name: "mybootclasspathfragment",
9135 contents: ["mybootclasspathlib"],
9136 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009137 hidden_api: {
9138 split_packages: ["*"],
9139 },
satayev758968a2021-12-06 11:42:40 +00009140 }
9141
9142 java_sdk_library {
9143 name: "mybootclasspathlib",
9144 srcs: ["mybootclasspathlib.java"],
9145 apex_available: ["myapex"],
9146 compile_dex: true,
9147 unsafe_ignore_missing_latest_api: true,
9148 min_sdk_version: "31",
9149 static_libs: ["util"],
9150 }
9151
9152 java_library {
9153 name: "util",
9154 srcs: ["a.java"],
9155 apex_available: ["myapex"],
9156 min_sdk_version: "31",
9157 static_libs: ["another_util"],
9158 }
9159
9160 java_library {
9161 name: "another_util",
9162 srcs: ["a.java"],
9163 min_sdk_version: "31",
9164 apex_available: ["myapex"],
9165 }
9166 `)
9167 })
9168
9169 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9170 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9171 preparer.RunTestWithBp(t, `
9172 apex {
9173 name: "myapex",
9174 key: "myapex.key",
9175 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9176 min_sdk_version: "30",
9177 updatable: false,
9178 }
9179
9180 apex_key {
9181 name: "myapex.key",
9182 public_key: "testkey.avbpubkey",
9183 private_key: "testkey.pem",
9184 }
9185
9186 systemserverclasspath_fragment {
9187 name: "mysystemserverclasspathfragment",
9188 contents: ["mysystemserverclasspathlib"],
9189 apex_available: ["myapex"],
9190 }
9191
9192 java_sdk_library {
9193 name: "mysystemserverclasspathlib",
9194 srcs: ["mysystemserverclasspathlib.java"],
9195 apex_available: ["myapex"],
9196 compile_dex: true,
9197 min_sdk_version: "32",
9198 unsafe_ignore_missing_latest_api: true,
9199 static_libs: ["util"],
9200 }
9201
9202 java_library {
9203 name: "util",
9204 srcs: ["a.java"],
9205 apex_available: ["myapex"],
9206 min_sdk_version: "31",
9207 static_libs: ["another_util"],
9208 }
9209
9210 java_library {
9211 name: "another_util",
9212 srcs: ["a.java"],
9213 min_sdk_version: "31",
9214 apex_available: ["myapex"],
9215 }
9216 `)
9217 })
9218
9219 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9220 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9221 RunTestWithBp(t, `
9222 apex {
9223 name: "myapex",
9224 key: "myapex.key",
9225 bootclasspath_fragments: ["mybootclasspathfragment"],
9226 min_sdk_version: "30",
9227 updatable: false,
9228 }
9229
9230 apex_key {
9231 name: "myapex.key",
9232 public_key: "testkey.avbpubkey",
9233 private_key: "testkey.pem",
9234 }
9235
9236 bootclasspath_fragment {
9237 name: "mybootclasspathfragment",
9238 contents: ["mybootclasspathlib"],
9239 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009240 hidden_api: {
9241 split_packages: ["*"],
9242 },
satayev758968a2021-12-06 11:42:40 +00009243 }
9244
9245 java_sdk_library {
9246 name: "mybootclasspathlib",
9247 srcs: ["mybootclasspathlib.java"],
9248 apex_available: ["myapex"],
9249 compile_dex: true,
9250 unsafe_ignore_missing_latest_api: true,
9251 }
9252 `)
9253 })
9254
9255 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9256 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9257 RunTestWithBp(t, `
9258 apex {
9259 name: "myapex",
9260 key: "myapex.key",
9261 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9262 min_sdk_version: "30",
9263 updatable: false,
9264 }
9265
9266 apex_key {
9267 name: "myapex.key",
9268 public_key: "testkey.avbpubkey",
9269 private_key: "testkey.pem",
9270 }
9271
9272 systemserverclasspath_fragment {
9273 name: "mysystemserverclasspathfragment",
9274 contents: ["mysystemserverclasspathlib"],
9275 apex_available: ["myapex"],
9276 }
9277
9278 java_sdk_library {
9279 name: "mysystemserverclasspathlib",
9280 srcs: ["mysystemserverclasspathlib.java"],
9281 apex_available: ["myapex"],
9282 compile_dex: true,
9283 unsafe_ignore_missing_latest_api: true,
9284 }
9285 `)
9286 })
9287}
9288
Jiakai Zhang6decef92022-01-12 17:56:19 +00009289// Verifies that the APEX depends on all the Make modules in the list.
9290func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9291 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9292 for _, dep := range deps {
9293 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9294 }
9295}
9296
9297// Verifies that the APEX does not depend on any of the Make modules in the list.
9298func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9299 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9300 for _, dep := range deps {
9301 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9302 }
9303}
9304
Spandan Das66773252022-01-15 00:23:18 +00009305func TestApexStrictUpdtabilityLint(t *testing.T) {
9306 bpTemplate := `
9307 apex {
9308 name: "myapex",
9309 key: "myapex.key",
9310 java_libs: ["myjavalib"],
9311 updatable: %v,
9312 min_sdk_version: "29",
9313 }
9314 apex_key {
9315 name: "myapex.key",
9316 }
9317 java_library {
9318 name: "myjavalib",
9319 srcs: ["MyClass.java"],
9320 apex_available: [ "myapex" ],
9321 lint: {
9322 strict_updatability_linting: %v,
9323 },
9324 sdk_version: "current",
9325 min_sdk_version: "29",
9326 }
9327 `
9328 fs := android.MockFS{
9329 "lint-baseline.xml": nil,
9330 }
9331
9332 testCases := []struct {
9333 testCaseName string
9334 apexUpdatable bool
9335 javaStrictUpdtabilityLint bool
9336 lintFileExists bool
9337 disallowedFlagExpected bool
9338 }{
9339 {
9340 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9341 apexUpdatable: true,
9342 javaStrictUpdtabilityLint: true,
9343 lintFileExists: false,
9344 disallowedFlagExpected: false,
9345 },
9346 {
9347 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9348 apexUpdatable: false,
9349 javaStrictUpdtabilityLint: false,
9350 lintFileExists: true,
9351 disallowedFlagExpected: false,
9352 },
9353 {
9354 testCaseName: "non-updatable apex respects strict updatability of javalib",
9355 apexUpdatable: false,
9356 javaStrictUpdtabilityLint: true,
9357 lintFileExists: true,
9358 disallowedFlagExpected: true,
9359 },
9360 {
9361 testCaseName: "updatable apex sets strict updatability of javalib to true",
9362 apexUpdatable: true,
9363 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9364 lintFileExists: true,
9365 disallowedFlagExpected: true,
9366 },
9367 }
9368
9369 for _, testCase := range testCases {
9370 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9371 fixtures := []android.FixturePreparer{}
9372 if testCase.lintFileExists {
9373 fixtures = append(fixtures, fs.AddToFixture())
9374 }
9375
9376 result := testApex(t, bp, fixtures...)
9377 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9378 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9379 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9380
9381 if disallowedFlagActual != testCase.disallowedFlagExpected {
9382 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9383 }
9384 }
9385}
9386
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009387func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9388 bp := `
9389 apex {
9390 name: "myapex",
9391 key: "myapex.key",
9392 java_libs: ["myjavalib"],
9393 updatable: true,
9394 min_sdk_version: "29",
9395 }
9396 apex_key {
9397 name: "myapex.key",
9398 }
9399 java_library {
9400 name: "myjavalib",
9401 srcs: ["MyClass.java"],
9402 apex_available: [ "myapex" ],
9403 sdk_version: "current",
9404 min_sdk_version: "29",
9405 }
9406 `
9407
9408 testCases := []struct {
9409 testCaseName string
9410 moduleDirectory string
9411 disallowedFlagExpected bool
9412 }{
9413 {
9414 testCaseName: "lintable module defined outside libcore",
9415 moduleDirectory: "",
9416 disallowedFlagExpected: true,
9417 },
9418 {
9419 testCaseName: "lintable module defined in libcore root directory",
9420 moduleDirectory: "libcore/",
9421 disallowedFlagExpected: false,
9422 },
9423 {
9424 testCaseName: "lintable module defined in libcore child directory",
9425 moduleDirectory: "libcore/childdir/",
9426 disallowedFlagExpected: true,
9427 },
9428 }
9429
9430 for _, testCase := range testCases {
9431 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9432 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9433 result := testApex(t, "", lintFileCreator, bpFileCreator)
9434 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9435 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9436 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9437 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9438
9439 if disallowedFlagActual != testCase.disallowedFlagExpected {
9440 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9441 }
9442 }
9443}
9444
Spandan Das66773252022-01-15 00:23:18 +00009445// checks transtive deps of an apex coming from bootclasspath_fragment
9446func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9447 bp := `
9448 apex {
9449 name: "myapex",
9450 key: "myapex.key",
9451 bootclasspath_fragments: ["mybootclasspathfragment"],
9452 updatable: true,
9453 min_sdk_version: "29",
9454 }
9455 apex_key {
9456 name: "myapex.key",
9457 }
9458 bootclasspath_fragment {
9459 name: "mybootclasspathfragment",
9460 contents: ["myjavalib"],
9461 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009462 hidden_api: {
9463 split_packages: ["*"],
9464 },
Spandan Das66773252022-01-15 00:23:18 +00009465 }
9466 java_library {
9467 name: "myjavalib",
9468 srcs: ["MyClass.java"],
9469 apex_available: [ "myapex" ],
9470 sdk_version: "current",
9471 min_sdk_version: "29",
9472 compile_dex: true,
9473 }
9474 `
9475 fs := android.MockFS{
9476 "lint-baseline.xml": nil,
9477 }
9478
9479 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9480 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9481 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9482 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9483 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9484 }
9485}
9486
Spandan Das42e89502022-05-06 22:12:55 +00009487// updatable apexes should propagate updatable=true to its apps
9488func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9489 bp := `
9490 apex {
9491 name: "myapex",
9492 key: "myapex.key",
9493 updatable: %v,
9494 apps: [
9495 "myapp",
9496 ],
9497 min_sdk_version: "30",
9498 }
9499 apex_key {
9500 name: "myapex.key",
9501 }
9502 android_app {
9503 name: "myapp",
9504 updatable: %v,
9505 apex_available: [
9506 "myapex",
9507 ],
9508 sdk_version: "current",
9509 min_sdk_version: "30",
9510 }
9511 `
9512 testCases := []struct {
9513 name string
9514 apex_is_updatable_bp bool
9515 app_is_updatable_bp bool
9516 app_is_updatable_expected bool
9517 }{
9518 {
9519 name: "Non-updatable apex respects updatable property of non-updatable app",
9520 apex_is_updatable_bp: false,
9521 app_is_updatable_bp: false,
9522 app_is_updatable_expected: false,
9523 },
9524 {
9525 name: "Non-updatable apex respects updatable property of updatable app",
9526 apex_is_updatable_bp: false,
9527 app_is_updatable_bp: true,
9528 app_is_updatable_expected: true,
9529 },
9530 {
9531 name: "Updatable apex respects updatable property of updatable app",
9532 apex_is_updatable_bp: true,
9533 app_is_updatable_bp: true,
9534 app_is_updatable_expected: true,
9535 },
9536 {
9537 name: "Updatable apex sets updatable=true on non-updatable app",
9538 apex_is_updatable_bp: true,
9539 app_is_updatable_bp: false,
9540 app_is_updatable_expected: true,
9541 },
9542 }
9543 for _, testCase := range testCases {
9544 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9545 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9546 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9547 }
9548}
9549
Kiyoung Kim487689e2022-07-26 09:48:22 +09009550func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9551 bp := `
9552 apex {
9553 name: "myapex",
9554 key: "myapex.key",
9555 native_shared_libs: ["libfoo"],
9556 min_sdk_version: "29",
9557 }
9558 apex_key {
9559 name: "myapex.key",
9560 }
9561 cc_library {
9562 name: "libfoo",
9563 shared_libs: ["libc"],
9564 apex_available: ["myapex"],
9565 min_sdk_version: "29",
9566 }
9567 cc_api_library {
9568 name: "libc",
9569 src: "libc.so",
9570 min_sdk_version: "29",
9571 recovery_available: true,
9572 }
9573 api_imports {
9574 name: "api_imports",
9575 shared_libs: [
9576 "libc",
9577 ],
9578 header_libs: [],
9579 }
9580 `
9581 result := testApex(t, bp)
9582
9583 hasDep := func(m android.Module, wantDep android.Module) bool {
9584 t.Helper()
9585 var found bool
9586 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9587 if dep == wantDep {
9588 found = true
9589 }
9590 })
9591 return found
9592 }
9593
9594 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9595 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9596
9597 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9598
9599 // libfoo core variant should be buildable in the same inner tree since
9600 // certain mcombo files might build system and apexes in the same inner tree
9601 // libfoo core variant should link against source libc
9602 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9603 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9604 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9605}
9606
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009607func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009608 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009609}