blob: 7ae9ed720084ef373d7317e2840683f5907a0414 [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 Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Alex Light5098a612018-11-29 17:12:15 -0800788func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800789 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800790 apex {
791 name: "myapex",
792 key: "myapex.key",
793 payload_type: "zip",
794 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000795 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800796 }
797
798 apex_key {
799 name: "myapex.key",
800 public_key: "testkey.avbpubkey",
801 private_key: "testkey.pem",
802 }
803
804 cc_library {
805 name: "mylib",
806 srcs: ["mylib.cpp"],
807 shared_libs: ["mylib2"],
808 system_shared_libs: [],
809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000810 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800811 }
812
813 cc_library {
814 name: "mylib2",
815 srcs: ["mylib.cpp"],
816 system_shared_libs: [],
817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000818 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800819 }
820 `)
821
Sundong Ahnabb64432019-10-22 13:58:29 +0900822 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800823 copyCmds := zipApexRule.Args["copy_commands"]
824
825 // Ensure that main rule creates an output
826 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
827
828 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800830
831 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800833
834 // Ensure that both direct and indirect deps are copied into apex
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
839func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800840 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841 apex {
842 name: "myapex",
843 key: "myapex.key",
844 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900845 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000846 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 apex_key {
850 name: "myapex.key",
851 public_key: "testkey.avbpubkey",
852 private_key: "testkey.pem",
853 }
854
855 cc_library {
856 name: "mylib",
857 srcs: ["mylib.cpp"],
858 shared_libs: ["mylib2", "mylib3"],
859 system_shared_libs: [],
860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000861 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 }
863
864 cc_library {
865 name: "mylib2",
866 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900867 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 system_shared_libs: [],
869 stl: "none",
870 stubs: {
871 versions: ["1", "2", "3"],
872 },
873 }
874
875 cc_library {
876 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900877 srcs: ["mylib.cpp"],
878 shared_libs: ["mylib4"],
879 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880 stl: "none",
881 stubs: {
882 versions: ["10", "11", "12"],
883 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000884 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900886
887 cc_library {
888 name: "mylib4",
889 srcs: ["mylib.cpp"],
890 system_shared_libs: [],
891 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000892 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900893 }
Jiyong Park105dc322021-06-11 17:22:09 +0900894
895 rust_binary {
896 name: "foo.rust",
897 srcs: ["foo.rs"],
898 shared_libs: ["libfoo.shared_from_rust"],
899 prefer_rlib: true,
900 apex_available: ["myapex"],
901 }
902
903 cc_library_shared {
904 name: "libfoo.shared_from_rust",
905 srcs: ["mylib.cpp"],
906 system_shared_libs: [],
907 stl: "none",
908 stubs: {
909 versions: ["10", "11", "12"],
910 },
911 }
912
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 `)
914
Sundong Ahnabb64432019-10-22 13:58:29 +0900915 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 copyCmds := apexRule.Args["copy_commands"]
917
918 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800919 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
924 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800925 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
Colin Crossaede88c2020-08-11 12:17:01 -0700927 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900930 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900932 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // 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 -0700935 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700937 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900938
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700939 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
940 // is replaced by sharing of "cFlags" in cc/builder.go.
941 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
942 // module variable representing "cflags". So it was not detected by ensureNotContains.
943 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
944 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
945 // including the original cflags's "-include mylib.h".
946 //
Jiyong Park64379952018-12-13 18:37:29 +0900947 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700948 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
949 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900950
Jiyong Park85cc35a2022-07-17 11:30:47 +0900951 // Ensure that genstub for platform-provided lib is invoked with --systemapi
952 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
953 // Ensure that genstub for apex-provided lib is invoked with --apex
954 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900955
Jooyung Hana57af4a2020-01-23 05:36:59 +0000956 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900957 "lib64/mylib.so",
958 "lib64/mylib3.so",
959 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900960 "bin/foo.rust",
961 "lib64/libc++.so", // by the implicit dependency from foo.rust
962 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900963 })
Jiyong Park105dc322021-06-11 17:22:09 +0900964
965 // Ensure that stub dependency from a rust module is not included
966 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
967 // The rust module is linked to the stub cc library
968 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
969 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
970 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900971
972 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
973 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974}
975
Jiyong Park1bc84122021-06-22 20:23:05 +0900976func TestApexCanUsePrivateApis(t *testing.T) {
977 ctx := testApex(t, `
978 apex {
979 name: "myapex",
980 key: "myapex.key",
981 native_shared_libs: ["mylib"],
982 binaries: ["foo.rust"],
983 updatable: false,
984 platform_apis: true,
985 }
986
987 apex_key {
988 name: "myapex.key",
989 public_key: "testkey.avbpubkey",
990 private_key: "testkey.pem",
991 }
992
993 cc_library {
994 name: "mylib",
995 srcs: ["mylib.cpp"],
996 shared_libs: ["mylib2"],
997 system_shared_libs: [],
998 stl: "none",
999 apex_available: [ "myapex" ],
1000 }
1001
1002 cc_library {
1003 name: "mylib2",
1004 srcs: ["mylib.cpp"],
1005 cflags: ["-include mylib.h"],
1006 system_shared_libs: [],
1007 stl: "none",
1008 stubs: {
1009 versions: ["1", "2", "3"],
1010 },
1011 }
1012
1013 rust_binary {
1014 name: "foo.rust",
1015 srcs: ["foo.rs"],
1016 shared_libs: ["libfoo.shared_from_rust"],
1017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030 `)
1031
1032 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1033 copyCmds := apexRule.Args["copy_commands"]
1034
1035 // Ensure that indirect stubs dep is not included
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038
1039 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1040 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001041 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001042 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1043 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001045 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1047}
1048
Colin Cross7812fd32020-09-25 12:35:10 -07001049func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1050 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001051 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001052 apex {
1053 name: "myapex",
1054 key: "myapex.key",
1055 native_shared_libs: ["mylib", "mylib3"],
1056 min_sdk_version: "29",
1057 }
1058
1059 apex_key {
1060 name: "myapex.key",
1061 public_key: "testkey.avbpubkey",
1062 private_key: "testkey.pem",
1063 }
1064
1065 cc_library {
1066 name: "mylib",
1067 srcs: ["mylib.cpp"],
1068 shared_libs: ["mylib2", "mylib3"],
1069 system_shared_libs: [],
1070 stl: "none",
1071 apex_available: [ "myapex" ],
1072 min_sdk_version: "28",
1073 }
1074
1075 cc_library {
1076 name: "mylib2",
1077 srcs: ["mylib.cpp"],
1078 cflags: ["-include mylib.h"],
1079 system_shared_libs: [],
1080 stl: "none",
1081 stubs: {
1082 versions: ["28", "29", "30", "current"],
1083 },
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib3",
1089 srcs: ["mylib.cpp"],
1090 shared_libs: ["mylib4"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["28", "29", "30", "current"],
1095 },
1096 apex_available: [ "myapex" ],
1097 min_sdk_version: "28",
1098 }
1099
1100 cc_library {
1101 name: "mylib4",
1102 srcs: ["mylib.cpp"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108 `)
1109
1110 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1111 copyCmds := apexRule.Args["copy_commands"]
1112
1113 // Ensure that direct non-stubs dep is always included
1114 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1115
1116 // Ensure that indirect stubs dep is not included
1117 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1118
1119 // Ensure that direct stubs dep is included
1120 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1121
1122 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1123
Jiyong Park55549df2021-02-26 23:57:23 +09001124 // Ensure that mylib is linking with the latest version of stub for mylib2
1125 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001126 // ... and not linking to the non-stub (impl) variant of mylib2
1127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1128
1129 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1130 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1131 // .. and not linking to the stubs variant of mylib3
1132 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1133
1134 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001135 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001136 ensureNotContains(t, mylib2Cflags, "-include ")
1137
Jiyong Park85cc35a2022-07-17 11:30:47 +09001138 // Ensure that genstub is invoked with --systemapi
1139 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001140
1141 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1142 "lib64/mylib.so",
1143 "lib64/mylib3.so",
1144 "lib64/mylib4.so",
1145 })
1146}
1147
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001148func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1149 t.Parallel()
1150 // myapex (Z)
1151 // mylib -----------------.
1152 // |
1153 // otherapex (29) |
1154 // libstub's versions: 29 Z current
1155 // |
1156 // <platform> |
1157 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001158 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001159 apex {
1160 name: "myapex",
1161 key: "myapex.key",
1162 native_shared_libs: ["mylib"],
1163 min_sdk_version: "Z", // non-final
1164 }
1165
1166 cc_library {
1167 name: "mylib",
1168 srcs: ["mylib.cpp"],
1169 shared_libs: ["libstub"],
1170 apex_available: ["myapex"],
1171 min_sdk_version: "Z",
1172 }
1173
1174 apex_key {
1175 name: "myapex.key",
1176 public_key: "testkey.avbpubkey",
1177 private_key: "testkey.pem",
1178 }
1179
1180 apex {
1181 name: "otherapex",
1182 key: "myapex.key",
1183 native_shared_libs: ["libstub"],
1184 min_sdk_version: "29",
1185 }
1186
1187 cc_library {
1188 name: "libstub",
1189 srcs: ["mylib.cpp"],
1190 stubs: {
1191 versions: ["29", "Z", "current"],
1192 },
1193 apex_available: ["otherapex"],
1194 min_sdk_version: "29",
1195 }
1196
1197 // platform module depending on libstub from otherapex should use the latest stub("current")
1198 cc_library {
1199 name: "libplatform",
1200 srcs: ["mylib.cpp"],
1201 shared_libs: ["libstub"],
1202 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001203 `,
1204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1205 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1206 variables.Platform_sdk_final = proptools.BoolPtr(false)
1207 variables.Platform_version_active_codenames = []string{"Z"}
1208 }),
1209 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001215 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001216
1217 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1218 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1219 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1220 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1221 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1222}
1223
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001225 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001226 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001227 name: "myapex2",
1228 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001230 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 }
1232
1233 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001234 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001235 public_key: "testkey.avbpubkey",
1236 private_key: "testkey.pem",
1237 }
1238
1239 cc_library {
1240 name: "mylib",
1241 srcs: ["mylib.cpp"],
1242 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001243 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001244 system_shared_libs: [],
1245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001246 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001247 }
1248
1249 cc_library {
1250 name: "libfoo",
1251 srcs: ["mylib.cpp"],
1252 shared_libs: ["libbar"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 stubs: {
1256 versions: ["10", "20", "30"],
1257 },
1258 }
1259
1260 cc_library {
1261 name: "libbar",
1262 srcs: ["mylib.cpp"],
1263 system_shared_libs: [],
1264 stl: "none",
1265 }
1266
Jiyong Park678c8812020-02-07 17:25:49 +09001267 cc_library_static {
1268 name: "libbaz",
1269 srcs: ["mylib.cpp"],
1270 system_shared_libs: [],
1271 stl: "none",
1272 apex_available: [ "myapex2" ],
1273 }
1274
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275 `)
1276
Jiyong Park83dc74b2020-01-14 18:38:44 +09001277 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 copyCmds := apexRule.Args["copy_commands"]
1279
1280 // Ensure that direct non-stubs dep is always included
1281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1282
1283 // Ensure that indirect stubs dep is not included
1284 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1285
1286 // Ensure that dependency of stubs is not included
1287 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1288
Colin Crossaede88c2020-08-11 12:17:01 -07001289 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001290
1291 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
Jiyong Park3ff16992019-12-27 14:11:47 +09001296 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001297
1298 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1299 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001300
Artur Satayeva8bd1132020-04-27 18:07:06 +01001301 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001302 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001303
Artur Satayeva8bd1132020-04-27 18:07:06 +01001304 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001305 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306}
1307
Jooyung Hand3639552019-08-09 12:57:43 +09001308func TestApexWithRuntimeLibsDependency(t *testing.T) {
1309 /*
1310 myapex
1311 |
1312 v (runtime_libs)
1313 mylib ------+------> libfoo [provides stub]
1314 |
1315 `------> libbar
1316 */
Colin Cross1c460562021-02-16 17:55:47 -08001317 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001318 apex {
1319 name: "myapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001322 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 apex_key {
1326 name: "myapex.key",
1327 public_key: "testkey.avbpubkey",
1328 private_key: "testkey.pem",
1329 }
1330
1331 cc_library {
1332 name: "mylib",
1333 srcs: ["mylib.cpp"],
1334 runtime_libs: ["libfoo", "libbar"],
1335 system_shared_libs: [],
1336 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001337 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001338 }
1339
1340 cc_library {
1341 name: "libfoo",
1342 srcs: ["mylib.cpp"],
1343 system_shared_libs: [],
1344 stl: "none",
1345 stubs: {
1346 versions: ["10", "20", "30"],
1347 },
1348 }
1349
1350 cc_library {
1351 name: "libbar",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 `)
1359
Sundong Ahnabb64432019-10-22 13:58:29 +09001360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001361 copyCmds := apexRule.Args["copy_commands"]
1362
1363 // Ensure that direct non-stubs dep is always included
1364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1365
1366 // Ensure that indirect stubs dep is not included
1367 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1368
1369 // Ensure that runtime_libs dep in included
1370 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1371
Sundong Ahnabb64432019-10-22 13:58:29 +09001372 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001373 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1374 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001375
1376}
1377
Paul Duffina02cae32021-03-09 01:44:06 +00001378var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1379 cc.PrepareForTestWithCcBuildComponents,
1380 PrepareForTestWithApexBuildComponents,
1381 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001382 apex {
1383 name: "com.android.runtime",
1384 key: "com.android.runtime.key",
1385 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001386 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001387 }
1388
1389 apex_key {
1390 name: "com.android.runtime.key",
1391 public_key: "testkey.avbpubkey",
1392 private_key: "testkey.pem",
1393 }
Paul Duffina02cae32021-03-09 01:44:06 +00001394 `),
1395 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1396)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001397
Paul Duffina02cae32021-03-09 01:44:06 +00001398func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001399 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001400 cc_library {
1401 name: "libc",
1402 no_libcrt: true,
1403 nocrt: true,
1404 stl: "none",
1405 system_shared_libs: [],
1406 stubs: { versions: ["1"] },
1407 apex_available: ["com.android.runtime"],
1408
1409 sanitize: {
1410 hwaddress: true,
1411 }
1412 }
1413
1414 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001415 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001416 no_libcrt: true,
1417 nocrt: true,
1418 stl: "none",
1419 system_shared_libs: [],
1420 srcs: [""],
1421 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001422 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423
1424 sanitize: {
1425 never: true,
1426 },
Paul Duffina02cae32021-03-09 01:44:06 +00001427 } `)
1428 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001429
1430 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1431 "lib64/bionic/libc.so",
1432 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1433 })
1434
Colin Cross4c4c1be2022-02-10 11:41:18 -08001435 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436
1437 installed := hwasan.Description("install libclang_rt.hwasan")
1438 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1439
1440 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1441 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1442 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1443}
1444
1445func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001446 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001447 prepareForTestOfRuntimeApexWithHwasan,
1448 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1449 variables.SanitizeDevice = []string{"hwaddress"}
1450 }),
1451 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 cc_library {
1453 name: "libc",
1454 no_libcrt: true,
1455 nocrt: true,
1456 stl: "none",
1457 system_shared_libs: [],
1458 stubs: { versions: ["1"] },
1459 apex_available: ["com.android.runtime"],
1460 }
1461
1462 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001463 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001464 no_libcrt: true,
1465 nocrt: true,
1466 stl: "none",
1467 system_shared_libs: [],
1468 srcs: [""],
1469 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001470 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001471
1472 sanitize: {
1473 never: true,
1474 },
1475 }
Paul Duffina02cae32021-03-09 01:44:06 +00001476 `)
1477 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001478
1479 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1480 "lib64/bionic/libc.so",
1481 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1482 })
1483
Colin Cross4c4c1be2022-02-10 11:41:18 -08001484 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001485
1486 installed := hwasan.Description("install libclang_rt.hwasan")
1487 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1488
1489 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1490 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1491 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1492}
1493
Jooyung Han61b66e92020-03-21 14:21:46 +00001494func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1495 testcases := []struct {
1496 name string
1497 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001498 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001499 shouldLink string
1500 shouldNotLink []string
1501 }{
1502 {
Jiyong Park55549df2021-02-26 23:57:23 +09001503 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001504 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001505 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001506 shouldLink: "current",
1507 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001508 },
1509 {
Jiyong Park55549df2021-02-26 23:57:23 +09001510 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001511 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001512 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001513 shouldLink: "current",
1514 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001515 },
1516 }
1517 for _, tc := range testcases {
1518 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001519 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001520 apex {
1521 name: "myapex",
1522 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001523 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001524 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001525 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001527
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 apex_key {
1529 name: "myapex.key",
1530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001533
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 cc_library {
1535 name: "mylib",
1536 srcs: ["mylib.cpp"],
1537 vendor_available: true,
1538 shared_libs: ["libbar"],
1539 system_shared_libs: [],
1540 stl: "none",
1541 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001542 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001544
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 cc_library {
1546 name: "libbar",
1547 srcs: ["mylib.cpp"],
1548 system_shared_libs: [],
1549 stl: "none",
1550 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001551 llndk: {
1552 symbol_file: "libbar.map.txt",
1553 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001554 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001556 withUnbundledBuild,
1557 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001558
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 // Ensure that LLNDK dep is not included
1560 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1561 "lib64/mylib.so",
1562 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 // Ensure that LLNDK dep is required
1565 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1566 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1567 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Steven Moreland2c4000c2021-04-27 02:08:49 +00001569 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1570 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001572 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001573 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001574
Steven Moreland2c4000c2021-04-27 02:08:49 +00001575 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001576 ver := tc.shouldLink
1577 if tc.shouldLink == "current" {
1578 ver = strconv.Itoa(android.FutureApiLevelInt)
1579 }
1580 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 })
1582 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001583}
1584
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001586 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001587 apex {
1588 name: "myapex",
1589 key: "myapex.key",
1590 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001591 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001592 }
1593
1594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
1599
1600 cc_library {
1601 name: "mylib",
1602 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001603 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001604 shared_libs: ["libdl#27"],
1605 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001606 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001607 }
1608
1609 cc_library_shared {
1610 name: "mylib_shared",
1611 srcs: ["mylib.cpp"],
1612 shared_libs: ["libdl#27"],
1613 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001614 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001615 }
1616
1617 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001618 name: "libBootstrap",
1619 srcs: ["mylib.cpp"],
1620 stl: "none",
1621 bootstrap: true,
1622 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 `)
1624
Sundong Ahnabb64432019-10-22 13:58:29 +09001625 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001626 copyCmds := apexRule.Args["copy_commands"]
1627
1628 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001629 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1631 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001632
1633 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001634 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635
Colin Crossaede88c2020-08-11 12:17:01 -07001636 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1637 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1638 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639
1640 // For dependency to libc
1641 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001644 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001645 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001646 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1647 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648
1649 // For dependency to libm
1650 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001651 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001653 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 // ... and is not compiling with the stub
1655 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1656 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1657
1658 // For dependency to libdl
1659 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001665 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 // ... Cflags from stub is correctly exported to mylib
1667 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1668 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001669
1670 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001671 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1672 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1673 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1674 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001676
Jooyung Han749dc692020-04-15 11:03:39 +09001677func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001678 // there are three links between liba --> libz.
1679 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001680 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001681 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001682 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001683 apex {
1684 name: "myapex",
1685 key: "myapex.key",
1686 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001687 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001688 }
1689
1690 apex {
1691 name: "otherapex",
1692 key: "myapex.key",
1693 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001694 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001695 }
1696
1697 apex_key {
1698 name: "myapex.key",
1699 public_key: "testkey.avbpubkey",
1700 private_key: "testkey.pem",
1701 }
1702
1703 cc_library {
1704 name: "libx",
1705 shared_libs: ["liba"],
1706 system_shared_libs: [],
1707 stl: "none",
1708 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001709 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001710 }
1711
1712 cc_library {
1713 name: "liby",
1714 shared_libs: ["liba"],
1715 system_shared_libs: [],
1716 stl: "none",
1717 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001718 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001719 }
1720
1721 cc_library {
1722 name: "liba",
1723 shared_libs: ["libz"],
1724 system_shared_libs: [],
1725 stl: "none",
1726 apex_available: [
1727 "//apex_available:anyapex",
1728 "//apex_available:platform",
1729 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 cc_library {
1734 name: "libz",
1735 system_shared_libs: [],
1736 stl: "none",
1737 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001738 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001739 },
1740 }
Jooyung Han749dc692020-04-15 11:03:39 +09001741 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001742
1743 expectLink := func(from, from_variant, to, to_variant string) {
1744 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1745 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1746 }
1747 expectNoLink := func(from, from_variant, to, to_variant string) {
1748 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1749 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1750 }
1751 // platform liba is linked to non-stub version
1752 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001753 // liba in myapex is linked to current
1754 expectLink("liba", "shared_apex29", "libz", "shared_current")
1755 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001756 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001757 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001758 // liba in otherapex is linked to current
1759 expectLink("liba", "shared_apex30", "libz", "shared_current")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001761 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1762 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001763}
1764
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001766 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001767 apex {
1768 name: "myapex",
1769 key: "myapex.key",
1770 native_shared_libs: ["libx"],
1771 min_sdk_version: "R",
1772 }
1773
1774 apex_key {
1775 name: "myapex.key",
1776 public_key: "testkey.avbpubkey",
1777 private_key: "testkey.pem",
1778 }
1779
1780 cc_library {
1781 name: "libx",
1782 shared_libs: ["libz"],
1783 system_shared_libs: [],
1784 stl: "none",
1785 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001786 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001787 }
1788
1789 cc_library {
1790 name: "libz",
1791 system_shared_libs: [],
1792 stl: "none",
1793 stubs: {
1794 versions: ["29", "R"],
1795 },
1796 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001797 `,
1798 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1799 variables.Platform_version_active_codenames = []string{"R"}
1800 }),
1801 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802
1803 expectLink := func(from, from_variant, to, to_variant string) {
1804 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1805 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1806 }
1807 expectNoLink := func(from, from_variant, to, to_variant string) {
1808 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1809 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1810 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001811 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001813 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1814 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001815}
1816
Jooyung Han4c4da062021-06-23 10:23:16 +09001817func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1818 testApex(t, `
1819 apex {
1820 name: "myapex",
1821 key: "myapex.key",
1822 java_libs: ["libx"],
1823 min_sdk_version: "S",
1824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 java_library {
1833 name: "libx",
1834 srcs: ["a.java"],
1835 apex_available: [ "myapex" ],
1836 sdk_version: "current",
1837 min_sdk_version: "S", // should be okay
1838 }
1839 `,
1840 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1841 variables.Platform_version_active_codenames = []string{"S"}
1842 variables.Platform_sdk_codename = proptools.StringPtr("S")
1843 }),
1844 )
1845}
1846
Jooyung Han749dc692020-04-15 11:03:39 +09001847func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001848 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001849 apex {
1850 name: "myapex",
1851 key: "myapex.key",
1852 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001853 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001854 }
1855
1856 apex_key {
1857 name: "myapex.key",
1858 public_key: "testkey.avbpubkey",
1859 private_key: "testkey.pem",
1860 }
1861
1862 cc_library {
1863 name: "libx",
1864 shared_libs: ["libz"],
1865 system_shared_libs: [],
1866 stl: "none",
1867 apex_available: [ "myapex" ],
1868 }
1869
1870 cc_library {
1871 name: "libz",
1872 system_shared_libs: [],
1873 stl: "none",
1874 stubs: {
1875 versions: ["1", "2"],
1876 },
1877 }
1878 `)
1879
1880 expectLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
1884 expectNoLink := func(from, from_variant, to, to_variant string) {
1885 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1886 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1887 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001891 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001892}
1893
Jiyong Park5df7bd32021-08-25 16:18:46 +09001894func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1895 ctx := testApex(t, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["mylib"],
1900 updatable: false,
1901 vendor: true,
1902 min_sdk_version: "29",
1903 }
1904
1905 apex_key {
1906 name: "myapex.key",
1907 public_key: "testkey.avbpubkey",
1908 private_key: "testkey.pem",
1909 }
1910
1911 cc_library {
1912 name: "mylib",
1913 vendor_available: true,
1914 system_shared_libs: [],
1915 stl: "none",
1916 apex_available: [ "myapex" ],
1917 min_sdk_version: "29",
1918 }
1919 `)
1920
1921 vendorVariant := "android_vendor.29_arm64_armv8-a"
1922
1923 // First check that the correct variant of crtbegin_so is used.
1924 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1925 crtBegin := names(ldRule.Args["crtBegin"])
1926 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1927
1928 // Ensure that the crtbegin_so used by the APEX is targeting 29
1929 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1930 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1931}
1932
Jooyung Han03b51852020-02-26 22:45:42 +09001933func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001934 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001935 apex {
1936 name: "myapex",
1937 key: "myapex.key",
1938 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001939 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001940 }
1941
1942 apex_key {
1943 name: "myapex.key",
1944 public_key: "testkey.avbpubkey",
1945 private_key: "testkey.pem",
1946 }
1947
1948 cc_library {
1949 name: "libx",
1950 system_shared_libs: [],
1951 stl: "none",
1952 apex_available: [ "myapex" ],
1953 stubs: {
1954 versions: ["1", "2"],
1955 },
1956 }
1957
1958 cc_library {
1959 name: "libz",
1960 shared_libs: ["libx"],
1961 system_shared_libs: [],
1962 stl: "none",
1963 }
1964 `)
1965
1966 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001967 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
1971 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001972 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001973 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1974 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1975 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001976 expectLink("libz", "shared", "libx", "shared_current")
1977 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001978 expectNoLink("libz", "shared", "libz", "shared_1")
1979 expectNoLink("libz", "shared", "libz", "shared")
1980}
1981
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001982var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1983 func(variables android.FixtureProductVariables) {
1984 variables.SanitizeDevice = []string{"hwaddress"}
1985 },
1986)
1987
Jooyung Han75568392020-03-20 04:29:24 +09001988func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001989 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001990 apex {
1991 name: "myapex",
1992 key: "myapex.key",
1993 native_shared_libs: ["libx"],
1994 min_sdk_version: "29",
1995 }
1996
1997 apex_key {
1998 name: "myapex.key",
1999 public_key: "testkey.avbpubkey",
2000 private_key: "testkey.pem",
2001 }
2002
2003 cc_library {
2004 name: "libx",
2005 shared_libs: ["libbar"],
2006 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002007 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: {
2013 versions: ["29", "30"],
2014 },
2015 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002016 `,
2017 prepareForTestWithSantitizeHwaddress,
2018 )
Jooyung Han03b51852020-02-26 22:45:42 +09002019 expectLink := func(from, from_variant, to, to_variant string) {
2020 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2021 libFlags := ld.Args["libFlags"]
2022 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2023 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002024 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002025}
2026
Jooyung Han75568392020-03-20 04:29:24 +09002027func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002028 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 native_shared_libs: ["libx"],
2033 min_sdk_version: "29",
2034 }
2035
2036 apex_key {
2037 name: "myapex.key",
2038 public_key: "testkey.avbpubkey",
2039 private_key: "testkey.pem",
2040 }
2041
2042 cc_library {
2043 name: "libx",
2044 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002045 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002046 }
Jooyung Han75568392020-03-20 04:29:24 +09002047 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002048
2049 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002050 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002051 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002052 // note that platform variant is not.
2053 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002054 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002055}
2056
Jooyung Han749dc692020-04-15 11:03:39 +09002057func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2058 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002059 apex {
2060 name: "myapex",
2061 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002062 native_shared_libs: ["mylib"],
2063 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002064 }
2065
2066 apex_key {
2067 name: "myapex.key",
2068 public_key: "testkey.avbpubkey",
2069 private_key: "testkey.pem",
2070 }
Jooyung Han749dc692020-04-15 11:03:39 +09002071
2072 cc_library {
2073 name: "mylib",
2074 srcs: ["mylib.cpp"],
2075 system_shared_libs: [],
2076 stl: "none",
2077 apex_available: [
2078 "myapex",
2079 ],
2080 min_sdk_version: "30",
2081 }
2082 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002083
2084 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2085 apex {
2086 name: "myapex",
2087 key: "myapex.key",
2088 native_shared_libs: ["libfoo.ffi"],
2089 min_sdk_version: "29",
2090 }
2091
2092 apex_key {
2093 name: "myapex.key",
2094 public_key: "testkey.avbpubkey",
2095 private_key: "testkey.pem",
2096 }
2097
2098 rust_ffi_shared {
2099 name: "libfoo.ffi",
2100 srcs: ["foo.rs"],
2101 crate_name: "foo",
2102 apex_available: [
2103 "myapex",
2104 ],
2105 min_sdk_version: "30",
2106 }
2107 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002108
2109 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2110 apex {
2111 name: "myapex",
2112 key: "myapex.key",
2113 java_libs: ["libfoo"],
2114 min_sdk_version: "29",
2115 }
2116
2117 apex_key {
2118 name: "myapex.key",
2119 public_key: "testkey.avbpubkey",
2120 private_key: "testkey.pem",
2121 }
2122
2123 java_import {
2124 name: "libfoo",
2125 jars: ["libfoo.jar"],
2126 apex_available: [
2127 "myapex",
2128 ],
2129 min_sdk_version: "30",
2130 }
2131 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002132}
2133
2134func TestApexMinSdkVersion_Okay(t *testing.T) {
2135 testApex(t, `
2136 apex {
2137 name: "myapex",
2138 key: "myapex.key",
2139 native_shared_libs: ["libfoo"],
2140 java_libs: ["libbar"],
2141 min_sdk_version: "29",
2142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
2150 cc_library {
2151 name: "libfoo",
2152 srcs: ["mylib.cpp"],
2153 shared_libs: ["libfoo_dep"],
2154 apex_available: ["myapex"],
2155 min_sdk_version: "29",
2156 }
2157
2158 cc_library {
2159 name: "libfoo_dep",
2160 srcs: ["mylib.cpp"],
2161 apex_available: ["myapex"],
2162 min_sdk_version: "29",
2163 }
2164
2165 java_library {
2166 name: "libbar",
2167 sdk_version: "current",
2168 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002169 static_libs: [
2170 "libbar_dep",
2171 "libbar_import_dep",
2172 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002173 apex_available: ["myapex"],
2174 min_sdk_version: "29",
2175 }
2176
2177 java_library {
2178 name: "libbar_dep",
2179 sdk_version: "current",
2180 srcs: ["a.java"],
2181 apex_available: ["myapex"],
2182 min_sdk_version: "29",
2183 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002184
2185 java_import {
2186 name: "libbar_import_dep",
2187 jars: ["libbar.jar"],
2188 apex_available: ["myapex"],
2189 min_sdk_version: "29",
2190 }
Jooyung Han03b51852020-02-26 22:45:42 +09002191 `)
2192}
2193
Artur Satayev8cf899a2020-04-15 17:29:42 +01002194func TestJavaStableSdkVersion(t *testing.T) {
2195 testCases := []struct {
2196 name string
2197 expectedError string
2198 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002199 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002200 }{
2201 {
2202 name: "Non-updatable apex with non-stable dep",
2203 bp: `
2204 apex {
2205 name: "myapex",
2206 java_libs: ["myjar"],
2207 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002208 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002209 }
2210 apex_key {
2211 name: "myapex.key",
2212 public_key: "testkey.avbpubkey",
2213 private_key: "testkey.pem",
2214 }
2215 java_library {
2216 name: "myjar",
2217 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002218 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002219 apex_available: ["myapex"],
2220 }
2221 `,
2222 },
2223 {
2224 name: "Updatable apex with stable dep",
2225 bp: `
2226 apex {
2227 name: "myapex",
2228 java_libs: ["myjar"],
2229 key: "myapex.key",
2230 updatable: true,
2231 min_sdk_version: "29",
2232 }
2233 apex_key {
2234 name: "myapex.key",
2235 public_key: "testkey.avbpubkey",
2236 private_key: "testkey.pem",
2237 }
2238 java_library {
2239 name: "myjar",
2240 srcs: ["foo/bar/MyClass.java"],
2241 sdk_version: "current",
2242 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002243 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002244 }
2245 `,
2246 },
2247 {
2248 name: "Updatable apex with non-stable dep",
2249 expectedError: "cannot depend on \"myjar\"",
2250 bp: `
2251 apex {
2252 name: "myapex",
2253 java_libs: ["myjar"],
2254 key: "myapex.key",
2255 updatable: true,
2256 }
2257 apex_key {
2258 name: "myapex.key",
2259 public_key: "testkey.avbpubkey",
2260 private_key: "testkey.pem",
2261 }
2262 java_library {
2263 name: "myjar",
2264 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002265 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002266 apex_available: ["myapex"],
2267 }
2268 `,
2269 },
2270 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002271 name: "Updatable apex with non-stable legacy core platform dep",
2272 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2273 bp: `
2274 apex {
2275 name: "myapex",
2276 java_libs: ["myjar-uses-legacy"],
2277 key: "myapex.key",
2278 updatable: true,
2279 }
2280 apex_key {
2281 name: "myapex.key",
2282 public_key: "testkey.avbpubkey",
2283 private_key: "testkey.pem",
2284 }
2285 java_library {
2286 name: "myjar-uses-legacy",
2287 srcs: ["foo/bar/MyClass.java"],
2288 sdk_version: "core_platform",
2289 apex_available: ["myapex"],
2290 }
2291 `,
2292 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2293 },
2294 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002295 name: "Updatable apex with non-stable transitive dep",
2296 // This is not actually detecting that the transitive dependency is unstable, rather it is
2297 // detecting that the transitive dependency is building against a wider API surface than the
2298 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002299 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002300 bp: `
2301 apex {
2302 name: "myapex",
2303 java_libs: ["myjar"],
2304 key: "myapex.key",
2305 updatable: true,
2306 }
2307 apex_key {
2308 name: "myapex.key",
2309 public_key: "testkey.avbpubkey",
2310 private_key: "testkey.pem",
2311 }
2312 java_library {
2313 name: "myjar",
2314 srcs: ["foo/bar/MyClass.java"],
2315 sdk_version: "current",
2316 apex_available: ["myapex"],
2317 static_libs: ["transitive-jar"],
2318 }
2319 java_library {
2320 name: "transitive-jar",
2321 srcs: ["foo/bar/MyClass.java"],
2322 sdk_version: "core_platform",
2323 apex_available: ["myapex"],
2324 }
2325 `,
2326 },
2327 }
2328
2329 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002330 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2331 continue
2332 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002333 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002334 errorHandler := android.FixtureExpectsNoErrors
2335 if test.expectedError != "" {
2336 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002337 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002338 android.GroupFixturePreparers(
2339 java.PrepareForTestWithJavaDefaultModules,
2340 PrepareForTestWithApexBuildComponents,
2341 prepareForTestWithMyapex,
2342 android.OptionalFixturePreparer(test.preparer),
2343 ).
2344 ExtendWithErrorHandler(errorHandler).
2345 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002346 })
2347 }
2348}
2349
Jooyung Han749dc692020-04-15 11:03:39 +09002350func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2351 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 native_shared_libs: ["mylib"],
2356 min_sdk_version: "29",
2357 }
2358
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
2364
2365 cc_library {
2366 name: "mylib",
2367 srcs: ["mylib.cpp"],
2368 shared_libs: ["mylib2"],
2369 system_shared_libs: [],
2370 stl: "none",
2371 apex_available: [
2372 "myapex",
2373 ],
2374 min_sdk_version: "29",
2375 }
2376
2377 // indirect part of the apex
2378 cc_library {
2379 name: "mylib2",
2380 srcs: ["mylib.cpp"],
2381 system_shared_libs: [],
2382 stl: "none",
2383 apex_available: [
2384 "myapex",
2385 ],
2386 min_sdk_version: "30",
2387 }
2388 `)
2389}
2390
2391func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2392 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2393 apex {
2394 name: "myapex",
2395 key: "myapex.key",
2396 apps: ["AppFoo"],
2397 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002398 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002399 }
2400
2401 apex_key {
2402 name: "myapex.key",
2403 public_key: "testkey.avbpubkey",
2404 private_key: "testkey.pem",
2405 }
2406
2407 android_app {
2408 name: "AppFoo",
2409 srcs: ["foo/bar/MyClass.java"],
2410 sdk_version: "current",
2411 min_sdk_version: "29",
2412 system_modules: "none",
2413 stl: "none",
2414 static_libs: ["bar"],
2415 apex_available: [ "myapex" ],
2416 }
2417
2418 java_library {
2419 name: "bar",
2420 sdk_version: "current",
2421 srcs: ["a.java"],
2422 apex_available: [ "myapex" ],
2423 }
2424 `)
2425}
2426
2427func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002428 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002429 apex {
2430 name: "myapex",
2431 key: "myapex.key",
2432 native_shared_libs: ["mylib"],
2433 min_sdk_version: "29",
2434 }
2435
2436 apex_key {
2437 name: "myapex.key",
2438 public_key: "testkey.avbpubkey",
2439 private_key: "testkey.pem",
2440 }
2441
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002442 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002443 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2444 cc_library {
2445 name: "mylib",
2446 srcs: ["mylib.cpp"],
2447 shared_libs: ["mylib2"],
2448 system_shared_libs: [],
2449 stl: "none",
2450 apex_available: ["myapex", "otherapex"],
2451 min_sdk_version: "29",
2452 }
2453
2454 cc_library {
2455 name: "mylib2",
2456 srcs: ["mylib.cpp"],
2457 system_shared_libs: [],
2458 stl: "none",
2459 apex_available: ["otherapex"],
2460 stubs: { versions: ["29", "30"] },
2461 min_sdk_version: "30",
2462 }
2463
2464 apex {
2465 name: "otherapex",
2466 key: "myapex.key",
2467 native_shared_libs: ["mylib", "mylib2"],
2468 min_sdk_version: "30",
2469 }
2470 `)
2471 expectLink := func(from, from_variant, to, to_variant string) {
2472 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2473 libFlags := ld.Args["libFlags"]
2474 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2475 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002476 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002477 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002478}
2479
Jooyung Haned124c32021-01-26 11:43:46 +09002480func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002481 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2482 func(variables android.FixtureProductVariables) {
2483 variables.Platform_sdk_codename = proptools.StringPtr("S")
2484 variables.Platform_version_active_codenames = []string{"S"}
2485 },
2486 )
Jooyung Haned124c32021-01-26 11:43:46 +09002487 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2488 apex {
2489 name: "myapex",
2490 key: "myapex.key",
2491 native_shared_libs: ["libfoo"],
2492 min_sdk_version: "S",
2493 }
2494 apex_key {
2495 name: "myapex.key",
2496 public_key: "testkey.avbpubkey",
2497 private_key: "testkey.pem",
2498 }
2499 cc_library {
2500 name: "libfoo",
2501 shared_libs: ["libbar"],
2502 apex_available: ["myapex"],
2503 min_sdk_version: "29",
2504 }
2505 cc_library {
2506 name: "libbar",
2507 apex_available: ["myapex"],
2508 }
2509 `, withSAsActiveCodeNames)
2510}
2511
2512func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002513 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S", "T"}
2516 })
Colin Cross1c460562021-02-16 17:55:47 -08002517 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002518 apex {
2519 name: "myapex",
2520 key: "myapex.key",
2521 native_shared_libs: ["libfoo"],
2522 min_sdk_version: "S",
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 cc_library {
2530 name: "libfoo",
2531 shared_libs: ["libbar"],
2532 apex_available: ["myapex"],
2533 min_sdk_version: "S",
2534 }
2535 cc_library {
2536 name: "libbar",
2537 stubs: {
2538 symbol_file: "libbar.map.txt",
2539 versions: ["30", "S", "T"],
2540 },
2541 }
2542 `, withSAsActiveCodeNames)
2543
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002544 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002545 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2546 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002547 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002548}
2549
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002551 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002552 apex {
2553 name: "myapex",
2554 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002555 native_shared_libs: ["mylib"],
2556 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002557 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002558 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002559 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002560 }
2561
2562 apex_key {
2563 name: "myapex.key",
2564 public_key: "testkey.avbpubkey",
2565 private_key: "testkey.pem",
2566 }
2567
2568 prebuilt_etc {
2569 name: "myetc",
2570 src: "myprebuilt",
2571 sub_dir: "foo/bar",
2572 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002573
2574 cc_library {
2575 name: "mylib",
2576 srcs: ["mylib.cpp"],
2577 relative_install_path: "foo/bar",
2578 system_shared_libs: [],
2579 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002580 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002581 }
2582
2583 cc_binary {
2584 name: "mybin",
2585 srcs: ["mylib.cpp"],
2586 relative_install_path: "foo/bar",
2587 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002588 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002589 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002590 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 `)
2592
Sundong Ahnabb64432019-10-22 13:58:29 +09002593 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002594 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002595
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002596 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002597 ensureContains(t, cmd, "/etc ")
2598 ensureContains(t, cmd, "/etc/foo ")
2599 ensureContains(t, cmd, "/etc/foo/bar ")
2600 ensureContains(t, cmd, "/lib64 ")
2601 ensureContains(t, cmd, "/lib64/foo ")
2602 ensureContains(t, cmd, "/lib64/foo/bar ")
2603 ensureContains(t, cmd, "/lib ")
2604 ensureContains(t, cmd, "/lib/foo ")
2605 ensureContains(t, cmd, "/lib/foo/bar ")
2606 ensureContains(t, cmd, "/bin ")
2607 ensureContains(t, cmd, "/bin/foo ")
2608 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002609}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002610
Jooyung Han35155c42020-02-06 17:33:20 +09002611func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002612 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002613 apex {
2614 name: "myapex",
2615 key: "myapex.key",
2616 multilib: {
2617 both: {
2618 native_shared_libs: ["mylib"],
2619 binaries: ["mybin"],
2620 },
2621 },
2622 compile_multilib: "both",
2623 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002624 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002625 }
2626
2627 apex_key {
2628 name: "myapex.key",
2629 public_key: "testkey.avbpubkey",
2630 private_key: "testkey.pem",
2631 }
2632
2633 cc_library {
2634 name: "mylib",
2635 relative_install_path: "foo/bar",
2636 system_shared_libs: [],
2637 stl: "none",
2638 apex_available: [ "myapex" ],
2639 native_bridge_supported: true,
2640 }
2641
2642 cc_binary {
2643 name: "mybin",
2644 relative_install_path: "foo/bar",
2645 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002646 stl: "none",
2647 apex_available: [ "myapex" ],
2648 native_bridge_supported: true,
2649 compile_multilib: "both", // default is "first" for binary
2650 multilib: {
2651 lib64: {
2652 suffix: "64",
2653 },
2654 },
2655 }
2656 `, withNativeBridgeEnabled)
2657 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2658 "bin/foo/bar/mybin",
2659 "bin/foo/bar/mybin64",
2660 "bin/arm/foo/bar/mybin",
2661 "bin/arm64/foo/bar/mybin64",
2662 "lib/foo/bar/mylib.so",
2663 "lib/arm/foo/bar/mylib.so",
2664 "lib64/foo/bar/mylib.so",
2665 "lib64/arm64/foo/bar/mylib.so",
2666 })
2667}
2668
Jooyung Han85d61762020-06-24 23:50:26 +09002669func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002670 result := android.GroupFixturePreparers(
2671 prepareForApexTest,
2672 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2673 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002674 apex {
2675 name: "myapex",
2676 key: "myapex.key",
2677 binaries: ["mybin"],
2678 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002679 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002680 }
2681 apex_key {
2682 name: "myapex.key",
2683 public_key: "testkey.avbpubkey",
2684 private_key: "testkey.pem",
2685 }
2686 cc_binary {
2687 name: "mybin",
2688 vendor: true,
2689 shared_libs: ["libfoo"],
2690 }
2691 cc_library {
2692 name: "libfoo",
2693 proprietary: true,
2694 }
2695 `)
2696
Colin Crossc68db4b2021-11-11 18:59:15 -08002697 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002698 "bin/mybin",
2699 "lib64/libfoo.so",
2700 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2701 "lib64/libc++.so",
2702 })
2703
Colin Crossc68db4b2021-11-11 18:59:15 -08002704 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2705 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002706 name := apexBundle.BaseModuleName()
2707 prefix := "TARGET_"
2708 var builder strings.Builder
2709 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002710 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002711 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002712 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002713
Colin Crossc68db4b2021-11-11 18:59:15 -08002714 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002715 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2716 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002717}
2718
Jooyung Hanc5a96762022-02-04 11:54:50 +09002719func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2720 testApexError(t, `Trying to include a VNDK library`, `
2721 apex {
2722 name: "myapex",
2723 key: "myapex.key",
2724 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2725 vendor: true,
2726 use_vndk_as_stable: true,
2727 updatable: false,
2728 }
2729 apex_key {
2730 name: "myapex.key",
2731 public_key: "testkey.avbpubkey",
2732 private_key: "testkey.pem",
2733 }`)
2734}
2735
Jooyung Handf78e212020-07-22 15:54:47 +09002736func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002737 // myapex myapex2
2738 // | |
2739 // mybin ------. mybin2
2740 // \ \ / |
2741 // (stable) .---\--------` |
2742 // \ / \ |
2743 // \ / \ /
2744 // libvndk libvendor
2745 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002746 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002747 apex {
2748 name: "myapex",
2749 key: "myapex.key",
2750 binaries: ["mybin"],
2751 vendor: true,
2752 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002753 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002754 }
2755 apex_key {
2756 name: "myapex.key",
2757 public_key: "testkey.avbpubkey",
2758 private_key: "testkey.pem",
2759 }
2760 cc_binary {
2761 name: "mybin",
2762 vendor: true,
2763 shared_libs: ["libvndk", "libvendor"],
2764 }
2765 cc_library {
2766 name: "libvndk",
2767 vndk: {
2768 enabled: true,
2769 },
2770 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002771 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002772 }
2773 cc_library {
2774 name: "libvendor",
2775 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002776 stl: "none",
2777 }
2778 apex {
2779 name: "myapex2",
2780 key: "myapex.key",
2781 binaries: ["mybin2"],
2782 vendor: true,
2783 use_vndk_as_stable: false,
2784 updatable: false,
2785 }
2786 cc_binary {
2787 name: "mybin2",
2788 vendor: true,
2789 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002790 }
2791 `)
2792
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002793 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002794
Jooyung Han91f92032022-02-04 12:36:33 +09002795 for _, tc := range []struct {
2796 name string
2797 apexName string
2798 moduleName string
2799 moduleVariant string
2800 libs []string
2801 contents []string
2802 requireVndkNamespace bool
2803 }{
2804 {
2805 name: "use_vndk_as_stable",
2806 apexName: "myapex",
2807 moduleName: "mybin",
2808 moduleVariant: vendorVariant + "_apex10000",
2809 libs: []string{
2810 // should link with vendor variants of VNDK libs(libvndk/libc++)
2811 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2812 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2813 // unstable Vendor libs as APEX variant
2814 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2815 },
2816 contents: []string{
2817 "bin/mybin",
2818 "lib64/libvendor.so",
2819 // VNDK libs (libvndk/libc++) are not included
2820 },
2821 requireVndkNamespace: true,
2822 },
2823 {
2824 name: "!use_vndk_as_stable",
2825 apexName: "myapex2",
2826 moduleName: "mybin2",
2827 moduleVariant: vendorVariant + "_myapex2",
2828 libs: []string{
2829 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2830 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2831 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2832 // unstable vendor libs have "merged" APEX variants
2833 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2834 },
2835 contents: []string{
2836 "bin/mybin2",
2837 "lib64/libvendor.so",
2838 // VNDK libs are included as well
2839 "lib64/libvndk.so",
2840 "lib64/libc++.so",
2841 },
2842 requireVndkNamespace: false,
2843 },
2844 } {
2845 t.Run(tc.name, func(t *testing.T) {
2846 // Check linked libs
2847 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2848 libs := names(ldRule.Args["libFlags"])
2849 for _, lib := range tc.libs {
2850 ensureListContains(t, libs, lib)
2851 }
2852 // Check apex contents
2853 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002854
Jooyung Han91f92032022-02-04 12:36:33 +09002855 // Check "requireNativeLibs"
2856 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2857 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2858 if tc.requireVndkNamespace {
2859 ensureListContains(t, requireNativeLibs, ":vndk")
2860 } else {
2861 ensureListNotContains(t, requireNativeLibs, ":vndk")
2862 }
2863 })
2864 }
Jooyung Handf78e212020-07-22 15:54:47 +09002865}
2866
Justin Yun13decfb2021-03-08 19:25:55 +09002867func TestProductVariant(t *testing.T) {
2868 ctx := testApex(t, `
2869 apex {
2870 name: "myapex",
2871 key: "myapex.key",
2872 updatable: false,
2873 product_specific: true,
2874 binaries: ["foo"],
2875 }
2876
2877 apex_key {
2878 name: "myapex.key",
2879 public_key: "testkey.avbpubkey",
2880 private_key: "testkey.pem",
2881 }
2882
2883 cc_binary {
2884 name: "foo",
2885 product_available: true,
2886 apex_available: ["myapex"],
2887 srcs: ["foo.cpp"],
2888 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002889 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2890 variables.ProductVndkVersion = proptools.StringPtr("current")
2891 }),
2892 )
Justin Yun13decfb2021-03-08 19:25:55 +09002893
2894 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002895 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002896 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2897 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2898 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2899 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2900}
2901
Jooyung Han8e5685d2020-09-21 11:02:57 +09002902func TestApex_withPrebuiltFirmware(t *testing.T) {
2903 testCases := []struct {
2904 name string
2905 additionalProp string
2906 }{
2907 {"system apex with prebuilt_firmware", ""},
2908 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2909 }
2910 for _, tc := range testCases {
2911 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002912 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002913 apex {
2914 name: "myapex",
2915 key: "myapex.key",
2916 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002917 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002918 `+tc.additionalProp+`
2919 }
2920 apex_key {
2921 name: "myapex.key",
2922 public_key: "testkey.avbpubkey",
2923 private_key: "testkey.pem",
2924 }
2925 prebuilt_firmware {
2926 name: "myfirmware",
2927 src: "myfirmware.bin",
2928 filename_from_src: true,
2929 `+tc.additionalProp+`
2930 }
2931 `)
2932 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2933 "etc/firmware/myfirmware.bin",
2934 })
2935 })
2936 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002937}
2938
Jooyung Hanefb184e2020-06-25 17:14:25 +09002939func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002940 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002941 apex {
2942 name: "myapex",
2943 key: "myapex.key",
2944 vendor: true,
2945 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002946 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002947 }
2948
2949 apex_key {
2950 name: "myapex.key",
2951 public_key: "testkey.avbpubkey",
2952 private_key: "testkey.pem",
2953 }
2954
2955 cc_library {
2956 name: "mylib",
2957 vendor_available: true,
2958 }
2959 `)
2960
2961 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002962 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002963 name := apexBundle.BaseModuleName()
2964 prefix := "TARGET_"
2965 var builder strings.Builder
2966 data.Custom(&builder, name, prefix, "", data)
2967 androidMk := builder.String()
2968 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2969}
2970
Jooyung Han2ed99d02020-06-24 23:26:26 +09002971func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002972 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 vintf_fragments: ["fragment.xml"],
2977 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002979 }
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985 cc_binary {
2986 name: "mybin",
2987 }
2988 `)
2989
2990 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002992 name := apexBundle.BaseModuleName()
2993 prefix := "TARGET_"
2994 var builder strings.Builder
2995 data.Custom(&builder, name, prefix, "", data)
2996 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002997 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002998 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002999}
3000
Jiyong Park16e91a02018-12-20 18:18:08 +09003001func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003002 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003003 apex {
3004 name: "myapex",
3005 key: "myapex.key",
3006 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003007 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003008 }
3009
3010 apex_key {
3011 name: "myapex.key",
3012 public_key: "testkey.avbpubkey",
3013 private_key: "testkey.pem",
3014 }
3015
3016 cc_library {
3017 name: "mylib",
3018 srcs: ["mylib.cpp"],
3019 system_shared_libs: [],
3020 stl: "none",
3021 stubs: {
3022 versions: ["1", "2", "3"],
3023 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003024 apex_available: [
3025 "//apex_available:platform",
3026 "myapex",
3027 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003028 }
3029
3030 cc_binary {
3031 name: "not_in_apex",
3032 srcs: ["mylib.cpp"],
3033 static_libs: ["mylib"],
3034 static_executable: true,
3035 system_shared_libs: [],
3036 stl: "none",
3037 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003038 `)
3039
Colin Cross7113d202019-11-20 16:39:12 -08003040 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003041
3042 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003043 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003044}
Jiyong Park9335a262018-12-24 11:31:58 +09003045
3046func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003047 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003048 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003049 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003050 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003051 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003052 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003053 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003054 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003055 }
3056
3057 cc_library {
3058 name: "mylib",
3059 srcs: ["mylib.cpp"],
3060 system_shared_libs: [],
3061 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003062 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003063 }
3064
3065 apex_key {
3066 name: "myapex.key",
3067 public_key: "testkey.avbpubkey",
3068 private_key: "testkey.pem",
3069 }
3070
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003071 android_app_certificate {
3072 name: "myapex.certificate",
3073 certificate: "testkey",
3074 }
3075
3076 android_app_certificate {
3077 name: "myapex.certificate.override",
3078 certificate: "testkey.override",
3079 }
3080
Jiyong Park9335a262018-12-24 11:31:58 +09003081 `)
3082
3083 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003084 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003085
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003086 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3087 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003088 "vendor/foo/devkeys/testkey.avbpubkey")
3089 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003090 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3091 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003092 "vendor/foo/devkeys/testkey.pem")
3093 }
3094
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003095 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003096 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003097 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003098 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003099 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003100 }
3101}
Jiyong Park58e364a2019-01-19 19:24:06 +09003102
Jooyung Hanf121a652019-12-17 14:30:11 +09003103func TestCertificate(t *testing.T) {
3104 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003105 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003106 apex {
3107 name: "myapex",
3108 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003109 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003110 }
3111 apex_key {
3112 name: "myapex.key",
3113 public_key: "testkey.avbpubkey",
3114 private_key: "testkey.pem",
3115 }`)
3116 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3117 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3118 if actual := rule.Args["certificates"]; actual != expected {
3119 t.Errorf("certificates should be %q, not %q", expected, actual)
3120 }
3121 })
3122 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003123 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003124 apex {
3125 name: "myapex_keytest",
3126 key: "myapex.key",
3127 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003128 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003129 }
3130 apex_key {
3131 name: "myapex.key",
3132 public_key: "testkey.avbpubkey",
3133 private_key: "testkey.pem",
3134 }
3135 android_app_certificate {
3136 name: "myapex.certificate.override",
3137 certificate: "testkey.override",
3138 }`)
3139 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3140 expected := "testkey.override.x509.pem testkey.override.pk8"
3141 if actual := rule.Args["certificates"]; actual != expected {
3142 t.Errorf("certificates should be %q, not %q", expected, actual)
3143 }
3144 })
3145 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003146 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003147 apex {
3148 name: "myapex",
3149 key: "myapex.key",
3150 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003151 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003152 }
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158 android_app_certificate {
3159 name: "myapex.certificate",
3160 certificate: "testkey",
3161 }`)
3162 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3163 expected := "testkey.x509.pem testkey.pk8"
3164 if actual := rule.Args["certificates"]; actual != expected {
3165 t.Errorf("certificates should be %q, not %q", expected, actual)
3166 }
3167 })
3168 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003169 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003170 apex {
3171 name: "myapex_keytest",
3172 key: "myapex.key",
3173 file_contexts: ":myapex-file_contexts",
3174 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003175 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003176 }
3177 apex_key {
3178 name: "myapex.key",
3179 public_key: "testkey.avbpubkey",
3180 private_key: "testkey.pem",
3181 }
3182 android_app_certificate {
3183 name: "myapex.certificate.override",
3184 certificate: "testkey.override",
3185 }`)
3186 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3187 expected := "testkey.override.x509.pem testkey.override.pk8"
3188 if actual := rule.Args["certificates"]; actual != expected {
3189 t.Errorf("certificates should be %q, not %q", expected, actual)
3190 }
3191 })
3192 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003193 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003194 apex {
3195 name: "myapex",
3196 key: "myapex.key",
3197 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003198 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003199 }
3200 apex_key {
3201 name: "myapex.key",
3202 public_key: "testkey.avbpubkey",
3203 private_key: "testkey.pem",
3204 }`)
3205 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3206 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3207 if actual := rule.Args["certificates"]; actual != expected {
3208 t.Errorf("certificates should be %q, not %q", expected, actual)
3209 }
3210 })
3211 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003212 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003213 apex {
3214 name: "myapex_keytest",
3215 key: "myapex.key",
3216 file_contexts: ":myapex-file_contexts",
3217 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003218 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003219 }
3220 apex_key {
3221 name: "myapex.key",
3222 public_key: "testkey.avbpubkey",
3223 private_key: "testkey.pem",
3224 }
3225 android_app_certificate {
3226 name: "myapex.certificate.override",
3227 certificate: "testkey.override",
3228 }`)
3229 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3230 expected := "testkey.override.x509.pem testkey.override.pk8"
3231 if actual := rule.Args["certificates"]; actual != expected {
3232 t.Errorf("certificates should be %q, not %q", expected, actual)
3233 }
3234 })
3235}
3236
Jiyong Park58e364a2019-01-19 19:24:06 +09003237func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003238 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003239 apex {
3240 name: "myapex",
3241 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003242 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003243 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003244 }
3245
3246 apex {
3247 name: "otherapex",
3248 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003249 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003250 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258
3259 cc_library {
3260 name: "mylib",
3261 srcs: ["mylib.cpp"],
3262 system_shared_libs: [],
3263 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003264 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 "myapex",
3266 "otherapex",
3267 ],
Jooyung Han24282772020-03-21 23:20:55 +09003268 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003269 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003271 cc_library {
3272 name: "mylib2",
3273 srcs: ["mylib.cpp"],
3274 system_shared_libs: [],
3275 stl: "none",
3276 apex_available: [
3277 "myapex",
3278 "otherapex",
3279 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003280 static_libs: ["mylib3"],
3281 recovery_available: true,
3282 min_sdk_version: "29",
3283 }
3284 cc_library {
3285 name: "mylib3",
3286 srcs: ["mylib.cpp"],
3287 system_shared_libs: [],
3288 stl: "none",
3289 apex_available: [
3290 "myapex",
3291 "otherapex",
3292 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003293 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003294 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003295 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003296 `)
3297
Jooyung Hanc87a0592020-03-02 17:44:33 +09003298 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003299 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003300 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003301 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302
Jooyung Hanccce2f22020-03-07 03:45:53 +09003303 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003304 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003305 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003306 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003307
Jooyung Hanccce2f22020-03-07 03:45:53 +09003308 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003309 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003310 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003311 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003312
Colin Crossaede88c2020-08-11 12:17:01 -07003313 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3314 // each variant defines additional macros to distinguish which apex variant it is built for
3315
3316 // non-APEX variant does not have __ANDROID_APEX__ defined
3317 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3318 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3319
Dan Albertb19953d2020-11-17 15:29:36 -08003320 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003321 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3322 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003323 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003324
Jooyung Hanc87a0592020-03-02 17:44:33 +09003325 // non-APEX variant does not have __ANDROID_APEX__ defined
3326 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3327 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3328
Dan Albertb19953d2020-11-17 15:29:36 -08003329 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003330 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003333}
Jiyong Park7e636d02019-01-28 16:16:54 +09003334
3335func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003336 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003337 apex {
3338 name: "myapex",
3339 key: "myapex.key",
3340 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003341 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003342 }
3343
3344 apex_key {
3345 name: "myapex.key",
3346 public_key: "testkey.avbpubkey",
3347 private_key: "testkey.pem",
3348 }
3349
3350 cc_library_headers {
3351 name: "mylib_headers",
3352 export_include_dirs: ["my_include"],
3353 system_shared_libs: [],
3354 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003355 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003356 }
3357
3358 cc_library {
3359 name: "mylib",
3360 srcs: ["mylib.cpp"],
3361 system_shared_libs: [],
3362 stl: "none",
3363 header_libs: ["mylib_headers"],
3364 export_header_lib_headers: ["mylib_headers"],
3365 stubs: {
3366 versions: ["1", "2", "3"],
3367 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003368 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003369 }
3370
3371 cc_library {
3372 name: "otherlib",
3373 srcs: ["mylib.cpp"],
3374 system_shared_libs: [],
3375 stl: "none",
3376 shared_libs: ["mylib"],
3377 }
3378 `)
3379
Colin Cross7113d202019-11-20 16:39:12 -08003380 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003381
3382 // Ensure that the include path of the header lib is exported to 'otherlib'
3383 ensureContains(t, cFlags, "-Imy_include")
3384}
Alex Light9670d332019-01-29 18:07:33 -08003385
Jiyong Park7cd10e32020-01-14 09:22:18 +09003386type fileInApex struct {
3387 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003388 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003389 isLink bool
3390}
3391
Jooyung Hana57af4a2020-01-23 05:36:59 +00003392func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003393 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003394 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003395 copyCmds := apexRule.Args["copy_commands"]
3396 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003397 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003398 for _, cmd := range strings.Split(copyCmds, "&&") {
3399 cmd = strings.TrimSpace(cmd)
3400 if cmd == "" {
3401 continue
3402 }
3403 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003404 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003405 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003406 switch terms[0] {
3407 case "mkdir":
3408 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003409 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 t.Fatal("copyCmds contains invalid cp command", cmd)
3411 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003413 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003414 isLink = false
3415 case "ln":
3416 if len(terms) != 3 && len(terms) != 4 {
3417 // ln LINK TARGET or ln -s LINK TARGET
3418 t.Fatal("copyCmds contains invalid ln command", cmd)
3419 }
3420 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003421 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003422 isLink = true
3423 default:
3424 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3425 }
3426 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 index := strings.Index(dst, imageApexDir)
3428 if index == -1 {
3429 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3430 }
3431 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003432 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003433 }
3434 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003435 return ret
3436}
3437
Jooyung Hana57af4a2020-01-23 05:36:59 +00003438func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3439 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 var failed bool
3441 var surplus []string
3442 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003443 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003444 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 for _, expected := range files {
3446 if matched, _ := path.Match(expected, file.path); matched {
3447 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003448 mactchFound = true
3449 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003450 }
3451 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003452 if !mactchFound {
3453 surplus = append(surplus, file.path)
3454 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003455 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003456
Jooyung Han31c470b2019-10-18 16:26:59 +09003457 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003458 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 t.Log("surplus files", surplus)
3460 failed = true
3461 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003462
3463 if len(files) > len(filesMatched) {
3464 var missing []string
3465 for _, expected := range files {
3466 if !filesMatched[expected] {
3467 missing = append(missing, expected)
3468 }
3469 }
3470 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003471 t.Log("missing files", missing)
3472 failed = true
3473 }
3474 if failed {
3475 t.Fail()
3476 }
3477}
3478
Jooyung Han344d5432019-08-23 11:17:39 +09003479func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003480 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003481 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003482 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003483 "etc/llndk.libraries.29.txt",
3484 "etc/vndkcore.libraries.29.txt",
3485 "etc/vndksp.libraries.29.txt",
3486 "etc/vndkprivate.libraries.29.txt",
3487 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003488 }
3489 testCases := []struct {
3490 vndkVersion string
3491 expectedFiles []string
3492 }{
3493 {
3494 vndkVersion: "current",
3495 expectedFiles: append(commonFiles,
3496 "lib/libvndk.so",
3497 "lib/libvndksp.so",
3498 "lib64/libvndk.so",
3499 "lib64/libvndksp.so"),
3500 },
3501 {
3502 vndkVersion: "",
3503 expectedFiles: append(commonFiles,
3504 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3505 "lib/libvndksp.so",
3506 "lib64/libvndksp.so"),
3507 },
3508 }
3509 for _, tc := range testCases {
3510 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3511 ctx := testApex(t, `
3512 apex_vndk {
3513 name: "com.android.vndk.current",
3514 key: "com.android.vndk.current.key",
3515 updatable: false,
3516 }
3517
3518 apex_key {
3519 name: "com.android.vndk.current.key",
3520 public_key: "testkey.avbpubkey",
3521 private_key: "testkey.pem",
3522 }
3523
3524 cc_library {
3525 name: "libvndk",
3526 srcs: ["mylib.cpp"],
3527 vendor_available: true,
3528 product_available: true,
3529 vndk: {
3530 enabled: true,
3531 },
3532 system_shared_libs: [],
3533 stl: "none",
3534 apex_available: [ "com.android.vndk.current" ],
3535 }
3536
3537 cc_library {
3538 name: "libvndksp",
3539 srcs: ["mylib.cpp"],
3540 vendor_available: true,
3541 product_available: true,
3542 vndk: {
3543 enabled: true,
3544 support_system_process: true,
3545 },
3546 system_shared_libs: [],
3547 stl: "none",
3548 apex_available: [ "com.android.vndk.current" ],
3549 }
3550
3551 // VNDK-Ext should not cause any problems
3552
3553 cc_library {
3554 name: "libvndk.ext",
3555 srcs: ["mylib2.cpp"],
3556 vendor: true,
3557 vndk: {
3558 enabled: true,
3559 extends: "libvndk",
3560 },
3561 system_shared_libs: [],
3562 stl: "none",
3563 }
3564
3565 cc_library {
3566 name: "libvndksp.ext",
3567 srcs: ["mylib2.cpp"],
3568 vendor: true,
3569 vndk: {
3570 enabled: true,
3571 support_system_process: true,
3572 extends: "libvndksp",
3573 },
3574 system_shared_libs: [],
3575 stl: "none",
3576 }
3577 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3578 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3579 }))
3580 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3581 })
3582 }
Jooyung Han344d5432019-08-23 11:17:39 +09003583}
3584
3585func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003586 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003587 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003588 name: "com.android.vndk.current",
3589 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003590 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003591 }
3592
3593 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003594 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003595 public_key: "testkey.avbpubkey",
3596 private_key: "testkey.pem",
3597 }
3598
3599 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 name: "libvndk",
3601 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003602 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003603 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003604 vndk: {
3605 enabled: true,
3606 },
3607 system_shared_libs: [],
3608 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003609 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003610 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003611
3612 cc_prebuilt_library_shared {
3613 name: "libvndk.arm",
3614 srcs: ["libvndk.arm.so"],
3615 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003616 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003617 vndk: {
3618 enabled: true,
3619 },
3620 enabled: false,
3621 arch: {
3622 arm: {
3623 enabled: true,
3624 },
3625 },
3626 system_shared_libs: [],
3627 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003628 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003629 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003630 `+vndkLibrariesTxtFiles("current"),
3631 withFiles(map[string][]byte{
3632 "libvndk.so": nil,
3633 "libvndk.arm.so": nil,
3634 }))
Colin Cross2807f002021-03-02 10:15:29 -08003635 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 "lib/libvndk.so",
3637 "lib/libvndk.arm.so",
3638 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003639 "lib/libc++.so",
3640 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003641 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 })
Jooyung Han344d5432019-08-23 11:17:39 +09003643}
3644
Jooyung Han39edb6c2019-11-06 16:53:07 +09003645func vndkLibrariesTxtFiles(vers ...string) (result string) {
3646 for _, v := range vers {
3647 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003648 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003649 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003650 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003651 name: "` + txt + `.libraries.txt",
3652 }
3653 `
3654 }
3655 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003656 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003657 result += `
3658 prebuilt_etc {
3659 name: "` + txt + `.libraries.` + v + `.txt",
3660 src: "dummy.txt",
3661 }
3662 `
3663 }
3664 }
3665 }
3666 return
3667}
3668
Jooyung Han344d5432019-08-23 11:17:39 +09003669func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003670 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003671 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003672 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003673 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003674 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003675 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003676 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003677 }
3678
3679 apex_key {
3680 name: "myapex.key",
3681 public_key: "testkey.avbpubkey",
3682 private_key: "testkey.pem",
3683 }
3684
Jooyung Han31c470b2019-10-18 16:26:59 +09003685 vndk_prebuilt_shared {
3686 name: "libvndk27",
3687 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003688 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003689 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003690 vndk: {
3691 enabled: true,
3692 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003693 target_arch: "arm64",
3694 arch: {
3695 arm: {
3696 srcs: ["libvndk27_arm.so"],
3697 },
3698 arm64: {
3699 srcs: ["libvndk27_arm64.so"],
3700 },
3701 },
Colin Cross2807f002021-03-02 10:15:29 -08003702 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003703 }
3704
3705 vndk_prebuilt_shared {
3706 name: "libvndk27",
3707 version: "27",
3708 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003709 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003710 vndk: {
3711 enabled: true,
3712 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 target_arch: "x86_64",
3714 arch: {
3715 x86: {
3716 srcs: ["libvndk27_x86.so"],
3717 },
3718 x86_64: {
3719 srcs: ["libvndk27_x86_64.so"],
3720 },
3721 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003722 }
3723 `+vndkLibrariesTxtFiles("27"),
3724 withFiles(map[string][]byte{
3725 "libvndk27_arm.so": nil,
3726 "libvndk27_arm64.so": nil,
3727 "libvndk27_x86.so": nil,
3728 "libvndk27_x86_64.so": nil,
3729 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003730
Colin Cross2807f002021-03-02 10:15:29 -08003731 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003732 "lib/libvndk27_arm.so",
3733 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003734 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003735 })
Jooyung Han344d5432019-08-23 11:17:39 +09003736}
3737
Jooyung Han90eee022019-10-01 20:02:42 +09003738func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003739 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003740 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003741 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003742 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003743 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003744 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003745 }
3746 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003747 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003748 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003749 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003750 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003751 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003752 }
3753 apex_key {
3754 name: "myapex.key",
3755 public_key: "testkey.avbpubkey",
3756 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003757 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003758
3759 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003760 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003761 actual := proptools.String(bundle.properties.Apex_name)
3762 if !reflect.DeepEqual(actual, expected) {
3763 t.Errorf("Got '%v', expected '%v'", actual, expected)
3764 }
3765 }
3766
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003767 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003768 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003769}
3770
Jooyung Han344d5432019-08-23 11:17:39 +09003771func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003772 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003773 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003774 name: "com.android.vndk.current",
3775 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003776 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003777 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003778 }
3779
3780 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003781 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003782 public_key: "testkey.avbpubkey",
3783 private_key: "testkey.pem",
3784 }
3785
3786 cc_library {
3787 name: "libvndk",
3788 srcs: ["mylib.cpp"],
3789 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003790 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003791 native_bridge_supported: true,
3792 host_supported: true,
3793 vndk: {
3794 enabled: true,
3795 },
3796 system_shared_libs: [],
3797 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003798 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003799 }
Colin Cross2807f002021-03-02 10:15:29 -08003800 `+vndkLibrariesTxtFiles("current"),
3801 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003802
Colin Cross2807f002021-03-02 10:15:29 -08003803 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003804 "lib/libvndk.so",
3805 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003806 "lib/libc++.so",
3807 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003808 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003809 })
Jooyung Han344d5432019-08-23 11:17:39 +09003810}
3811
3812func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003813 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003814 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003815 name: "com.android.vndk.current",
3816 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003817 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003818 native_bridge_supported: true,
3819 }
3820
3821 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003822 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003823 public_key: "testkey.avbpubkey",
3824 private_key: "testkey.pem",
3825 }
3826
3827 cc_library {
3828 name: "libvndk",
3829 srcs: ["mylib.cpp"],
3830 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003831 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003832 native_bridge_supported: true,
3833 host_supported: true,
3834 vndk: {
3835 enabled: true,
3836 },
3837 system_shared_libs: [],
3838 stl: "none",
3839 }
3840 `)
3841}
3842
Jooyung Han31c470b2019-10-18 16:26:59 +09003843func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003844 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003850 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 }
3852
3853 apex_key {
3854 name: "myapex.key",
3855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
3859 vndk_prebuilt_shared {
3860 name: "libvndk27",
3861 version: "27",
3862 target_arch: "arm",
3863 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003864 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003865 vndk: {
3866 enabled: true,
3867 },
3868 arch: {
3869 arm: {
3870 srcs: ["libvndk27.so"],
3871 }
3872 },
3873 }
3874
3875 vndk_prebuilt_shared {
3876 name: "libvndk27",
3877 version: "27",
3878 target_arch: "arm",
3879 binder32bit: true,
3880 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003881 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 vndk: {
3883 enabled: true,
3884 },
3885 arch: {
3886 arm: {
3887 srcs: ["libvndk27binder32.so"],
3888 }
3889 },
Colin Cross2807f002021-03-02 10:15:29 -08003890 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003891 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003892 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 withFiles(map[string][]byte{
3894 "libvndk27.so": nil,
3895 "libvndk27binder32.so": nil,
3896 }),
3897 withBinder32bit,
3898 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003899 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003900 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3901 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 },
3903 }),
3904 )
3905
Colin Cross2807f002021-03-02 10:15:29 -08003906 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003908 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 })
3910}
3911
Jooyung Han45a96772020-06-15 14:59:42 +09003912func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003913 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003914 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003915 name: "com.android.vndk.current",
3916 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003917 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003918 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003919 }
3920
3921 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003922 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003923 public_key: "testkey.avbpubkey",
3924 private_key: "testkey.pem",
3925 }
3926
3927 cc_library {
3928 name: "libz",
3929 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003930 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003931 vndk: {
3932 enabled: true,
3933 },
3934 stubs: {
3935 symbol_file: "libz.map.txt",
3936 versions: ["30"],
3937 }
3938 }
3939 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3940 "libz.map.txt": nil,
3941 }))
3942
Colin Cross2807f002021-03-02 10:15:29 -08003943 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003944 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3945 ensureListEmpty(t, provideNativeLibs)
3946}
3947
Jooyung Hane1633032019-08-01 17:41:43 +09003948func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003949 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003950 apex {
3951 name: "myapex_nodep",
3952 key: "myapex.key",
3953 native_shared_libs: ["lib_nodep"],
3954 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003955 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003956 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003957 }
3958
3959 apex {
3960 name: "myapex_dep",
3961 key: "myapex.key",
3962 native_shared_libs: ["lib_dep"],
3963 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003964 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003965 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003966 }
3967
3968 apex {
3969 name: "myapex_provider",
3970 key: "myapex.key",
3971 native_shared_libs: ["libfoo"],
3972 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003973 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003974 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003975 }
3976
3977 apex {
3978 name: "myapex_selfcontained",
3979 key: "myapex.key",
3980 native_shared_libs: ["lib_dep", "libfoo"],
3981 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003984 }
3985
3986 apex_key {
3987 name: "myapex.key",
3988 public_key: "testkey.avbpubkey",
3989 private_key: "testkey.pem",
3990 }
3991
3992 cc_library {
3993 name: "lib_nodep",
3994 srcs: ["mylib.cpp"],
3995 system_shared_libs: [],
3996 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003997 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003998 }
3999
4000 cc_library {
4001 name: "lib_dep",
4002 srcs: ["mylib.cpp"],
4003 shared_libs: ["libfoo"],
4004 system_shared_libs: [],
4005 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004006 apex_available: [
4007 "myapex_dep",
4008 "myapex_provider",
4009 "myapex_selfcontained",
4010 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004011 }
4012
4013 cc_library {
4014 name: "libfoo",
4015 srcs: ["mytest.cpp"],
4016 stubs: {
4017 versions: ["1"],
4018 },
4019 system_shared_libs: [],
4020 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004021 apex_available: [
4022 "myapex_provider",
4023 "myapex_selfcontained",
4024 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004025 }
4026 `)
4027
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004028 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004029 var provideNativeLibs, requireNativeLibs []string
4030
Sundong Ahnabb64432019-10-22 13:58:29 +09004031 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004032 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4033 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004034 ensureListEmpty(t, provideNativeLibs)
4035 ensureListEmpty(t, requireNativeLibs)
4036
Sundong Ahnabb64432019-10-22 13:58:29 +09004037 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004038 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4039 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004040 ensureListEmpty(t, provideNativeLibs)
4041 ensureListContains(t, requireNativeLibs, "libfoo.so")
4042
Sundong Ahnabb64432019-10-22 13:58:29 +09004043 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004044 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4045 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004046 ensureListContains(t, provideNativeLibs, "libfoo.so")
4047 ensureListEmpty(t, requireNativeLibs)
4048
Sundong Ahnabb64432019-10-22 13:58:29 +09004049 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004050 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4051 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004052 ensureListContains(t, provideNativeLibs, "libfoo.so")
4053 ensureListEmpty(t, requireNativeLibs)
4054}
4055
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004056func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004057 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004058 apex {
4059 name: "myapex",
4060 key: "myapex.key",
4061 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004062 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004063 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004064 }
4065
4066 apex_key {
4067 name: "myapex.key",
4068 public_key: "testkey.avbpubkey",
4069 private_key: "testkey.pem",
4070 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004071
4072 cc_library {
4073 name: "mylib",
4074 srcs: ["mylib.cpp"],
4075 system_shared_libs: [],
4076 stl: "none",
4077 apex_available: [
4078 "//apex_available:platform",
4079 "myapex",
4080 ],
4081 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 `)
4083
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004084 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004085 apexManifestRule := module.Rule("apexManifestRule")
4086 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4087 apexRule := module.Rule("apexRule")
4088 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004089
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004090 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004091 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004092 name := apexBundle.BaseModuleName()
4093 prefix := "TARGET_"
4094 var builder strings.Builder
4095 data.Custom(&builder, name, prefix, "", data)
4096 androidMk := builder.String()
4097 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4098 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004099}
4100
Alex Light0851b882019-02-07 13:20:53 -08004101func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004102 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004103 apex {
4104 name: "myapex",
4105 key: "myapex.key",
4106 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004107 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004108 }
4109
4110 apex_key {
4111 name: "myapex.key",
4112 public_key: "testkey.avbpubkey",
4113 private_key: "testkey.pem",
4114 }
4115
4116 cc_library {
4117 name: "mylib_common",
4118 srcs: ["mylib.cpp"],
4119 system_shared_libs: [],
4120 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004121 apex_available: [
4122 "//apex_available:platform",
4123 "myapex",
4124 ],
Alex Light0851b882019-02-07 13:20:53 -08004125 }
4126 `)
4127
Sundong Ahnabb64432019-10-22 13:58:29 +09004128 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004129 apexRule := module.Rule("apexRule")
4130 copyCmds := apexRule.Args["copy_commands"]
4131
4132 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4133 t.Log("Apex was a test apex!")
4134 t.Fail()
4135 }
4136 // Ensure that main rule creates an output
4137 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4138
4139 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004140 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004141
4142 // Ensure that both direct and indirect deps are copied into apex
4143 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4144
Colin Cross7113d202019-11-20 16:39:12 -08004145 // Ensure that the platform variant ends with _shared
4146 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004147
Colin Cross56a83212020-09-15 18:30:11 -07004148 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004149 t.Log("Found mylib_common not in any apex!")
4150 t.Fail()
4151 }
4152}
4153
4154func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004155 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004156 apex_test {
4157 name: "myapex",
4158 key: "myapex.key",
4159 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004161 }
4162
4163 apex_key {
4164 name: "myapex.key",
4165 public_key: "testkey.avbpubkey",
4166 private_key: "testkey.pem",
4167 }
4168
4169 cc_library {
4170 name: "mylib_common_test",
4171 srcs: ["mylib.cpp"],
4172 system_shared_libs: [],
4173 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004174 // TODO: remove //apex_available:platform
4175 apex_available: [
4176 "//apex_available:platform",
4177 "myapex",
4178 ],
Alex Light0851b882019-02-07 13:20:53 -08004179 }
4180 `)
4181
Sundong Ahnabb64432019-10-22 13:58:29 +09004182 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004183 apexRule := module.Rule("apexRule")
4184 copyCmds := apexRule.Args["copy_commands"]
4185
4186 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4187 t.Log("Apex was not a test apex!")
4188 t.Fail()
4189 }
4190 // Ensure that main rule creates an output
4191 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4192
4193 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004194 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004195
4196 // Ensure that both direct and indirect deps are copied into apex
4197 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4198
Colin Cross7113d202019-11-20 16:39:12 -08004199 // Ensure that the platform variant ends with _shared
4200 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004201}
4202
Alex Light9670d332019-01-29 18:07:33 -08004203func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004204 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004208 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004209 multilib: {
4210 first: {
4211 native_shared_libs: ["mylib_common"],
4212 }
4213 },
4214 target: {
4215 android: {
4216 multilib: {
4217 first: {
4218 native_shared_libs: ["mylib"],
4219 }
4220 }
4221 },
4222 host: {
4223 multilib: {
4224 first: {
4225 native_shared_libs: ["mylib2"],
4226 }
4227 }
4228 }
4229 }
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237
4238 cc_library {
4239 name: "mylib",
4240 srcs: ["mylib.cpp"],
4241 system_shared_libs: [],
4242 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004243 // TODO: remove //apex_available:platform
4244 apex_available: [
4245 "//apex_available:platform",
4246 "myapex",
4247 ],
Alex Light9670d332019-01-29 18:07:33 -08004248 }
4249
4250 cc_library {
4251 name: "mylib_common",
4252 srcs: ["mylib.cpp"],
4253 system_shared_libs: [],
4254 stl: "none",
4255 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004256 // TODO: remove //apex_available:platform
4257 apex_available: [
4258 "//apex_available:platform",
4259 "myapex",
4260 ],
Alex Light9670d332019-01-29 18:07:33 -08004261 }
4262
4263 cc_library {
4264 name: "mylib2",
4265 srcs: ["mylib.cpp"],
4266 system_shared_libs: [],
4267 stl: "none",
4268 compile_multilib: "first",
4269 }
4270 `)
4271
Sundong Ahnabb64432019-10-22 13:58:29 +09004272 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004273 copyCmds := apexRule.Args["copy_commands"]
4274
4275 // Ensure that main rule creates an output
4276 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4277
4278 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004279 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4280 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4281 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004282
4283 // Ensure that both direct and indirect deps are copied into apex
4284 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4285 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4286 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4287
Colin Cross7113d202019-11-20 16:39:12 -08004288 // Ensure that the platform variant ends with _shared
4289 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4290 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4291 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004292}
Jiyong Park04480cf2019-02-06 00:16:29 +09004293
Jiyong Park59140302020-12-14 18:44:04 +09004294func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004295 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004296 apex {
4297 name: "myapex",
4298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004299 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004300 arch: {
4301 arm64: {
4302 native_shared_libs: ["mylib.arm64"],
4303 },
4304 x86_64: {
4305 native_shared_libs: ["mylib.x64"],
4306 },
4307 }
4308 }
4309
4310 apex_key {
4311 name: "myapex.key",
4312 public_key: "testkey.avbpubkey",
4313 private_key: "testkey.pem",
4314 }
4315
4316 cc_library {
4317 name: "mylib.arm64",
4318 srcs: ["mylib.cpp"],
4319 system_shared_libs: [],
4320 stl: "none",
4321 // TODO: remove //apex_available:platform
4322 apex_available: [
4323 "//apex_available:platform",
4324 "myapex",
4325 ],
4326 }
4327
4328 cc_library {
4329 name: "mylib.x64",
4330 srcs: ["mylib.cpp"],
4331 system_shared_libs: [],
4332 stl: "none",
4333 // TODO: remove //apex_available:platform
4334 apex_available: [
4335 "//apex_available:platform",
4336 "myapex",
4337 ],
4338 }
4339 `)
4340
4341 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4342 copyCmds := apexRule.Args["copy_commands"]
4343
4344 // Ensure that apex variant is created for the direct dep
4345 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4346 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4347
4348 // Ensure that both direct and indirect deps are copied into apex
4349 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4350 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4351}
4352
Jiyong Park04480cf2019-02-06 00:16:29 +09004353func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004354 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004355 apex {
4356 name: "myapex",
4357 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004358 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004359 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004360 }
4361
4362 apex_key {
4363 name: "myapex.key",
4364 public_key: "testkey.avbpubkey",
4365 private_key: "testkey.pem",
4366 }
4367
4368 sh_binary {
4369 name: "myscript",
4370 src: "mylib.cpp",
4371 filename: "myscript.sh",
4372 sub_dir: "script",
4373 }
4374 `)
4375
Sundong Ahnabb64432019-10-22 13:58:29 +09004376 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004377 copyCmds := apexRule.Args["copy_commands"]
4378
4379 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4380}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004381
Jooyung Han91df2082019-11-20 01:49:42 +09004382func TestApexInVariousPartition(t *testing.T) {
4383 testcases := []struct {
4384 propName, parition, flattenedPartition string
4385 }{
4386 {"", "system", "system_ext"},
4387 {"product_specific: true", "product", "product"},
4388 {"soc_specific: true", "vendor", "vendor"},
4389 {"proprietary: true", "vendor", "vendor"},
4390 {"vendor: true", "vendor", "vendor"},
4391 {"system_ext_specific: true", "system_ext", "system_ext"},
4392 }
4393 for _, tc := range testcases {
4394 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004399 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004400 `+tc.propName+`
4401 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004402
Jooyung Han91df2082019-11-20 01:49:42 +09004403 apex_key {
4404 name: "myapex.key",
4405 public_key: "testkey.avbpubkey",
4406 private_key: "testkey.pem",
4407 }
4408 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004409
Jooyung Han91df2082019-11-20 01:49:42 +09004410 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004411 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4412 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004413 if actual != expected {
4414 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4415 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004416
Jooyung Han91df2082019-11-20 01:49:42 +09004417 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004418 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4419 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004420 if actual != expected {
4421 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4422 }
4423 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004424 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004425}
Jiyong Park67882562019-03-21 01:11:21 +09004426
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004428 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004429 apex {
4430 name: "myapex",
4431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004432 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004434
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004440 `)
4441 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004442 rule := module.Output("file_contexts")
4443 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4444}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445
Jooyung Han580eb4f2020-06-24 19:33:06 +09004446func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004447 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448 apex {
4449 name: "myapex",
4450 key: "myapex.key",
4451 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004452 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004453 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004454
Jooyung Han580eb4f2020-06-24 19:33:06 +09004455 apex_key {
4456 name: "myapex.key",
4457 public_key: "testkey.avbpubkey",
4458 private_key: "testkey.pem",
4459 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004460 `, withFiles(map[string][]byte{
4461 "my_own_file_contexts": nil,
4462 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004463}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004464
Jooyung Han580eb4f2020-06-24 19:33:06 +09004465func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004466 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004467 apex {
4468 name: "myapex",
4469 key: "myapex.key",
4470 product_specific: true,
4471 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004472 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004473 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004474
Jooyung Han580eb4f2020-06-24 19:33:06 +09004475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004480 `)
4481
Colin Cross1c460562021-02-16 17:55:47 -08004482 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
4486 product_specific: true,
4487 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004488 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004489 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004490
Jooyung Han580eb4f2020-06-24 19:33:06 +09004491 apex_key {
4492 name: "myapex.key",
4493 public_key: "testkey.avbpubkey",
4494 private_key: "testkey.pem",
4495 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004496 `, withFiles(map[string][]byte{
4497 "product_specific_file_contexts": nil,
4498 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004499 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4500 rule := module.Output("file_contexts")
4501 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4502}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004503
Jooyung Han580eb4f2020-06-24 19:33:06 +09004504func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004505 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004506 apex {
4507 name: "myapex",
4508 key: "myapex.key",
4509 product_specific: true,
4510 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004511 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004512 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004513
Jooyung Han580eb4f2020-06-24 19:33:06 +09004514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004519
Jooyung Han580eb4f2020-06-24 19:33:06 +09004520 filegroup {
4521 name: "my-file-contexts",
4522 srcs: ["product_specific_file_contexts"],
4523 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004524 `, withFiles(map[string][]byte{
4525 "product_specific_file_contexts": nil,
4526 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004527 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4528 rule := module.Output("file_contexts")
4529 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004530}
4531
Jiyong Park67882562019-03-21 01:11:21 +09004532func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004533 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004534 apex_key {
4535 name: "myapex.key",
4536 public_key: ":my.avbpubkey",
4537 private_key: ":my.pem",
4538 product_specific: true,
4539 }
4540
4541 filegroup {
4542 name: "my.avbpubkey",
4543 srcs: ["testkey2.avbpubkey"],
4544 }
4545
4546 filegroup {
4547 name: "my.pem",
4548 srcs: ["testkey2.pem"],
4549 }
4550 `)
4551
4552 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4553 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004554 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004555 if actual_pubkey != expected_pubkey {
4556 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4557 }
4558 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004559 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004560 if actual_privkey != expected_privkey {
4561 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4562 }
4563}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004564
4565func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004566 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004567 prebuilt_apex {
4568 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004569 arch: {
4570 arm64: {
4571 src: "myapex-arm64.apex",
4572 },
4573 arm: {
4574 src: "myapex-arm.apex",
4575 },
4576 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004577 }
4578 `)
4579
Wei Li340ee8e2022-03-18 17:33:24 -07004580 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4581 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004582
Jiyong Parkc95714e2019-03-29 14:23:10 +09004583 expectedInput := "myapex-arm64.apex"
4584 if prebuilt.inputApex.String() != expectedInput {
4585 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4586 }
Wei Li340ee8e2022-03-18 17:33:24 -07004587 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4588 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4589 rule := testingModule.Rule("genProvenanceMetaData")
4590 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4591 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4592 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4593 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004594}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004595
Paul Duffinc0609c62021-03-01 17:27:16 +00004596func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004597 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004598 prebuilt_apex {
4599 name: "myapex",
4600 }
4601 `)
4602}
4603
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004604func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004605 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004606 prebuilt_apex {
4607 name: "myapex",
4608 src: "myapex-arm.apex",
4609 filename: "notmyapex.apex",
4610 }
4611 `)
4612
Wei Li340ee8e2022-03-18 17:33:24 -07004613 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4614 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004615
4616 expected := "notmyapex.apex"
4617 if p.installFilename != expected {
4618 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4619 }
Wei Li340ee8e2022-03-18 17:33:24 -07004620 rule := testingModule.Rule("genProvenanceMetaData")
4621 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4622 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4623 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4624 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004625}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004626
Samiul Islam7c02e262021-09-08 17:48:28 +01004627func TestApexSetFilenameOverride(t *testing.T) {
4628 testApex(t, `
4629 apex_set {
4630 name: "com.company.android.myapex",
4631 apex_name: "com.android.myapex",
4632 set: "company-myapex.apks",
4633 filename: "com.company.android.myapex.apex"
4634 }
4635 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4636
4637 testApex(t, `
4638 apex_set {
4639 name: "com.company.android.myapex",
4640 apex_name: "com.android.myapex",
4641 set: "company-myapex.apks",
4642 filename: "com.company.android.myapex.capex"
4643 }
4644 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4645
4646 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4647 apex_set {
4648 name: "com.company.android.myapex",
4649 apex_name: "com.android.myapex",
4650 set: "company-myapex.apks",
4651 filename: "some-random-suffix"
4652 }
4653 `)
4654}
4655
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004656func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004657 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004658 prebuilt_apex {
4659 name: "myapex.prebuilt",
4660 src: "myapex-arm.apex",
4661 overrides: [
4662 "myapex",
4663 ],
4664 }
4665 `)
4666
Wei Li340ee8e2022-03-18 17:33:24 -07004667 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4668 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004669
4670 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004671 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004672 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004673 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004674 }
Wei Li340ee8e2022-03-18 17:33:24 -07004675 rule := testingModule.Rule("genProvenanceMetaData")
4676 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4677 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4678 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4679 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004680}
4681
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004682func TestPrebuiltApexName(t *testing.T) {
4683 testApex(t, `
4684 prebuilt_apex {
4685 name: "com.company.android.myapex",
4686 apex_name: "com.android.myapex",
4687 src: "company-myapex-arm.apex",
4688 }
4689 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4690
4691 testApex(t, `
4692 apex_set {
4693 name: "com.company.android.myapex",
4694 apex_name: "com.android.myapex",
4695 set: "company-myapex.apks",
4696 }
4697 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4698}
4699
4700func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4701 _ = android.GroupFixturePreparers(
4702 java.PrepareForTestWithJavaDefaultModules,
4703 PrepareForTestWithApexBuildComponents,
4704 android.FixtureWithRootAndroidBp(`
4705 platform_bootclasspath {
4706 name: "platform-bootclasspath",
4707 fragments: [
4708 {
4709 apex: "com.android.art",
4710 module: "art-bootclasspath-fragment",
4711 },
4712 ],
4713 }
4714
4715 prebuilt_apex {
4716 name: "com.company.android.art",
4717 apex_name: "com.android.art",
4718 src: "com.company.android.art-arm.apex",
4719 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4720 }
4721
4722 prebuilt_bootclasspath_fragment {
4723 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004724 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004725 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004726 hidden_api: {
4727 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4728 metadata: "my-bootclasspath-fragment/metadata.csv",
4729 index: "my-bootclasspath-fragment/index.csv",
4730 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4731 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4732 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004733 }
4734
4735 java_import {
4736 name: "core-oj",
4737 jars: ["prebuilt.jar"],
4738 }
4739 `),
4740 ).RunTest(t)
4741}
4742
Paul Duffin092153d2021-01-26 11:42:39 +00004743// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4744// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004745func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004746 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004747
Paul Duffin89886cb2021-02-05 16:44:03 +00004748 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004749 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004750 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004751 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004752 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004753 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004754 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4755 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4756 android.NormalizePathForTesting(dexJarBuildPath))
4757 }
4758
4759 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004760 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004761 // Make sure the import has been given the correct path to the dex jar.
4762 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4763 dexJarBuildPath := p.DexJarInstallPath()
4764 stem := android.RemoveOptionalPrebuiltPrefix(name)
4765 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4766 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4767 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004768 }
4769
Paul Duffin39853512021-02-26 11:09:39 +00004770 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004771 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004772 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004773 android.AssertArrayString(t, "Check if there is no source variant",
4774 []string{"android_common"},
4775 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004776 }
4777
4778 t.Run("prebuilt only", func(t *testing.T) {
4779 bp := `
4780 prebuilt_apex {
4781 name: "myapex",
4782 arch: {
4783 arm64: {
4784 src: "myapex-arm64.apex",
4785 },
4786 arm: {
4787 src: "myapex-arm.apex",
4788 },
4789 },
Paul Duffin39853512021-02-26 11:09:39 +00004790 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004791 }
4792
4793 java_import {
4794 name: "libfoo",
4795 jars: ["libfoo.jar"],
4796 }
Paul Duffin39853512021-02-26 11:09:39 +00004797
4798 java_sdk_library_import {
4799 name: "libbar",
4800 public: {
4801 jars: ["libbar.jar"],
4802 },
4803 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004804 `
4805
4806 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4807 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4808
Martin Stjernholm44825602021-09-17 01:44:12 +01004809 deapexerName := deapexerModuleName("myapex")
4810 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4811
Paul Duffinf6932af2021-02-26 18:21:56 +00004812 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004813 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004814 rule := deapexer.Rule("deapexer")
4815 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4816 t.Errorf("expected: %q, found: %q", expected, actual)
4817 }
4818
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004819 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004820 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004821 rule = prebuiltApex.Rule("android/soong/android.Cp")
4822 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4823 t.Errorf("expected: %q, found: %q", expected, actual)
4824 }
4825
Paul Duffin89886cb2021-02-05 16:44:03 +00004826 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004827 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004828
4829 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004830 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004831 })
4832
4833 t.Run("prebuilt with source preferred", func(t *testing.T) {
4834
4835 bp := `
4836 prebuilt_apex {
4837 name: "myapex",
4838 arch: {
4839 arm64: {
4840 src: "myapex-arm64.apex",
4841 },
4842 arm: {
4843 src: "myapex-arm.apex",
4844 },
4845 },
Paul Duffin39853512021-02-26 11:09:39 +00004846 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004847 }
4848
4849 java_import {
4850 name: "libfoo",
4851 jars: ["libfoo.jar"],
4852 }
4853
4854 java_library {
4855 name: "libfoo",
4856 }
Paul Duffin39853512021-02-26 11:09:39 +00004857
4858 java_sdk_library_import {
4859 name: "libbar",
4860 public: {
4861 jars: ["libbar.jar"],
4862 },
4863 }
4864
4865 java_sdk_library {
4866 name: "libbar",
4867 srcs: ["foo/bar/MyClass.java"],
4868 unsafe_ignore_missing_latest_api: true,
4869 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004870 `
4871
4872 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4873 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4874
Paul Duffin89886cb2021-02-05 16:44:03 +00004875 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004876 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004877 ensureNoSourceVariant(t, ctx, "libfoo")
4878
4879 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004880 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004881 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004882 })
4883
4884 t.Run("prebuilt preferred with source", func(t *testing.T) {
4885 bp := `
4886 prebuilt_apex {
4887 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004888 arch: {
4889 arm64: {
4890 src: "myapex-arm64.apex",
4891 },
4892 arm: {
4893 src: "myapex-arm.apex",
4894 },
4895 },
Paul Duffin39853512021-02-26 11:09:39 +00004896 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004897 }
4898
4899 java_import {
4900 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004901 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004902 jars: ["libfoo.jar"],
4903 }
4904
4905 java_library {
4906 name: "libfoo",
4907 }
Paul Duffin39853512021-02-26 11:09:39 +00004908
4909 java_sdk_library_import {
4910 name: "libbar",
4911 prefer: true,
4912 public: {
4913 jars: ["libbar.jar"],
4914 },
4915 }
4916
4917 java_sdk_library {
4918 name: "libbar",
4919 srcs: ["foo/bar/MyClass.java"],
4920 unsafe_ignore_missing_latest_api: true,
4921 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004922 `
4923
4924 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4925 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4926
Paul Duffin89886cb2021-02-05 16:44:03 +00004927 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004928 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004929 ensureNoSourceVariant(t, ctx, "libfoo")
4930
4931 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004932 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004933 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004934 })
4935}
4936
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004937func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004938 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004939 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004940 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4941 // is disabled.
4942 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4943 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004944
Paul Duffin37856732021-02-26 14:24:15 +00004945 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4946 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004947 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004948 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004949 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004950 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004951 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004952 foundLibfooJar = true
4953 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004954 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004955 }
4956 }
4957 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004958 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 +00004959 }
4960 }
4961
Paul Duffin40a3f652021-07-19 13:11:24 +01004962 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004963 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004964 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004965 var rule android.TestingBuildParams
4966
4967 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4968 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004969 }
4970
Paul Duffin40a3f652021-07-19 13:11:24 +01004971 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4972 t.Helper()
4973 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4974 var rule android.TestingBuildParams
4975
4976 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4977 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4978 }
4979
Paul Duffin89f570a2021-06-16 01:42:33 +01004980 fragment := java.ApexVariantReference{
4981 Apex: proptools.StringPtr("myapex"),
4982 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4983 }
4984
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004985 t.Run("prebuilt only", func(t *testing.T) {
4986 bp := `
4987 prebuilt_apex {
4988 name: "myapex",
4989 arch: {
4990 arm64: {
4991 src: "myapex-arm64.apex",
4992 },
4993 arm: {
4994 src: "myapex-arm.apex",
4995 },
4996 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004997 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4998 }
4999
5000 prebuilt_bootclasspath_fragment {
5001 name: "my-bootclasspath-fragment",
5002 contents: ["libfoo", "libbar"],
5003 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005004 hidden_api: {
5005 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5006 metadata: "my-bootclasspath-fragment/metadata.csv",
5007 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005008 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5009 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5010 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005011 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005012 }
5013
5014 java_import {
5015 name: "libfoo",
5016 jars: ["libfoo.jar"],
5017 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005018 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005019 }
Paul Duffin37856732021-02-26 14:24:15 +00005020
5021 java_sdk_library_import {
5022 name: "libbar",
5023 public: {
5024 jars: ["libbar.jar"],
5025 },
5026 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005027 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005028 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005029 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005030 `
5031
Paul Duffin89f570a2021-06-16 01:42:33 +01005032 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005033 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5034 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005035
Paul Duffin537ea3d2021-05-14 10:38:00 +01005036 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005037 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005038 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005039 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005040 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5041 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005042 })
5043
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005044 t.Run("apex_set only", func(t *testing.T) {
5045 bp := `
5046 apex_set {
5047 name: "myapex",
5048 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005049 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5050 }
5051
5052 prebuilt_bootclasspath_fragment {
5053 name: "my-bootclasspath-fragment",
5054 contents: ["libfoo", "libbar"],
5055 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005056 hidden_api: {
5057 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5058 metadata: "my-bootclasspath-fragment/metadata.csv",
5059 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005060 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5061 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5062 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005063 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005064 }
5065
5066 java_import {
5067 name: "libfoo",
5068 jars: ["libfoo.jar"],
5069 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005070 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005071 }
5072
5073 java_sdk_library_import {
5074 name: "libbar",
5075 public: {
5076 jars: ["libbar.jar"],
5077 },
5078 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005079 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005080 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005081 }
5082 `
5083
Paul Duffin89f570a2021-06-16 01:42:33 +01005084 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005085 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5086 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5087
Paul Duffin537ea3d2021-05-14 10:38:00 +01005088 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005089 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005090 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005091 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005092 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5093 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005094 })
5095
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005096 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5097 bp := `
5098 prebuilt_apex {
5099 name: "myapex",
5100 arch: {
5101 arm64: {
5102 src: "myapex-arm64.apex",
5103 },
5104 arm: {
5105 src: "myapex-arm.apex",
5106 },
5107 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005108 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5109 }
5110
5111 prebuilt_bootclasspath_fragment {
5112 name: "my-bootclasspath-fragment",
5113 contents: ["libfoo", "libbar"],
5114 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005115 hidden_api: {
5116 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5117 metadata: "my-bootclasspath-fragment/metadata.csv",
5118 index: "my-bootclasspath-fragment/index.csv",
5119 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5120 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5121 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005122 }
5123
5124 java_import {
5125 name: "libfoo",
5126 jars: ["libfoo.jar"],
5127 apex_available: ["myapex"],
5128 }
5129
5130 java_library {
5131 name: "libfoo",
5132 srcs: ["foo/bar/MyClass.java"],
5133 apex_available: ["myapex"],
5134 }
Paul Duffin37856732021-02-26 14:24:15 +00005135
5136 java_sdk_library_import {
5137 name: "libbar",
5138 public: {
5139 jars: ["libbar.jar"],
5140 },
5141 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005142 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005143 }
5144
5145 java_sdk_library {
5146 name: "libbar",
5147 srcs: ["foo/bar/MyClass.java"],
5148 unsafe_ignore_missing_latest_api: true,
5149 apex_available: ["myapex"],
5150 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005151 `
5152
5153 // In this test the source (java_library) libfoo is active since the
5154 // prebuilt (java_import) defaults to prefer:false. However the
5155 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5156 // find the dex boot jar in it. We either need to disable the source libfoo
5157 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005158 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005159 // dexbootjar check is skipped if AllowMissingDependencies is true
5160 preparerAllowMissingDeps := android.GroupFixturePreparers(
5161 preparer,
5162 android.PrepareForTestWithAllowMissingDependencies,
5163 )
5164 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165 })
5166
5167 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5168 bp := `
5169 prebuilt_apex {
5170 name: "myapex",
5171 arch: {
5172 arm64: {
5173 src: "myapex-arm64.apex",
5174 },
5175 arm: {
5176 src: "myapex-arm.apex",
5177 },
5178 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005179 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5180 }
5181
5182 prebuilt_bootclasspath_fragment {
5183 name: "my-bootclasspath-fragment",
5184 contents: ["libfoo", "libbar"],
5185 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005186 hidden_api: {
5187 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5188 metadata: "my-bootclasspath-fragment/metadata.csv",
5189 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005190 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5191 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5192 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005193 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005194 }
5195
5196 java_import {
5197 name: "libfoo",
5198 prefer: true,
5199 jars: ["libfoo.jar"],
5200 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005201 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 }
5203
5204 java_library {
5205 name: "libfoo",
5206 srcs: ["foo/bar/MyClass.java"],
5207 apex_available: ["myapex"],
5208 }
Paul Duffin37856732021-02-26 14:24:15 +00005209
5210 java_sdk_library_import {
5211 name: "libbar",
5212 prefer: true,
5213 public: {
5214 jars: ["libbar.jar"],
5215 },
5216 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005217 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005218 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005219 }
5220
5221 java_sdk_library {
5222 name: "libbar",
5223 srcs: ["foo/bar/MyClass.java"],
5224 unsafe_ignore_missing_latest_api: true,
5225 apex_available: ["myapex"],
5226 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005227 `
5228
Paul Duffin89f570a2021-06-16 01:42:33 +01005229 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005230 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5231 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005232
Paul Duffin537ea3d2021-05-14 10:38:00 +01005233 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005234 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005235 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005236 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005237 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5238 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005239 })
5240
5241 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5242 bp := `
5243 apex {
5244 name: "myapex",
5245 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005246 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005247 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 }
5249
5250 apex_key {
5251 name: "myapex.key",
5252 public_key: "testkey.avbpubkey",
5253 private_key: "testkey.pem",
5254 }
5255
5256 prebuilt_apex {
5257 name: "myapex",
5258 arch: {
5259 arm64: {
5260 src: "myapex-arm64.apex",
5261 },
5262 arm: {
5263 src: "myapex-arm.apex",
5264 },
5265 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005266 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5267 }
5268
5269 prebuilt_bootclasspath_fragment {
5270 name: "my-bootclasspath-fragment",
5271 contents: ["libfoo", "libbar"],
5272 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005273 hidden_api: {
5274 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5275 metadata: "my-bootclasspath-fragment/metadata.csv",
5276 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005277 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5278 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5279 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005280 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005281 }
5282
5283 java_import {
5284 name: "libfoo",
5285 jars: ["libfoo.jar"],
5286 apex_available: ["myapex"],
5287 }
5288
5289 java_library {
5290 name: "libfoo",
5291 srcs: ["foo/bar/MyClass.java"],
5292 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005293 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005294 }
Paul Duffin37856732021-02-26 14:24:15 +00005295
5296 java_sdk_library_import {
5297 name: "libbar",
5298 public: {
5299 jars: ["libbar.jar"],
5300 },
5301 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005302 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005303 }
5304
5305 java_sdk_library {
5306 name: "libbar",
5307 srcs: ["foo/bar/MyClass.java"],
5308 unsafe_ignore_missing_latest_api: true,
5309 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005310 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005311 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005312 `
5313
Paul Duffin89f570a2021-06-16 01:42:33 +01005314 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005315 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5316 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005317
Paul Duffin537ea3d2021-05-14 10:38:00 +01005318 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005319 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005320 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005321 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005322 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5323 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 })
5325
5326 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5327 bp := `
5328 apex {
5329 name: "myapex",
5330 enabled: false,
5331 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005332 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005333 }
5334
5335 apex_key {
5336 name: "myapex.key",
5337 public_key: "testkey.avbpubkey",
5338 private_key: "testkey.pem",
5339 }
5340
5341 prebuilt_apex {
5342 name: "myapex",
5343 arch: {
5344 arm64: {
5345 src: "myapex-arm64.apex",
5346 },
5347 arm: {
5348 src: "myapex-arm.apex",
5349 },
5350 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005351 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5352 }
5353
5354 prebuilt_bootclasspath_fragment {
5355 name: "my-bootclasspath-fragment",
5356 contents: ["libfoo", "libbar"],
5357 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005358 hidden_api: {
5359 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5360 metadata: "my-bootclasspath-fragment/metadata.csv",
5361 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005362 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5363 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5364 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005365 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005366 }
5367
5368 java_import {
5369 name: "libfoo",
5370 prefer: true,
5371 jars: ["libfoo.jar"],
5372 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005373 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 }
5375
5376 java_library {
5377 name: "libfoo",
5378 srcs: ["foo/bar/MyClass.java"],
5379 apex_available: ["myapex"],
5380 }
Paul Duffin37856732021-02-26 14:24:15 +00005381
5382 java_sdk_library_import {
5383 name: "libbar",
5384 prefer: true,
5385 public: {
5386 jars: ["libbar.jar"],
5387 },
5388 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005390 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005391 }
5392
5393 java_sdk_library {
5394 name: "libbar",
5395 srcs: ["foo/bar/MyClass.java"],
5396 unsafe_ignore_missing_latest_api: true,
5397 apex_available: ["myapex"],
5398 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 `
5400
Paul Duffin89f570a2021-06-16 01:42:33 +01005401 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005402 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5403 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005404
Paul Duffin537ea3d2021-05-14 10:38:00 +01005405 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005406 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005407 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005408 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005409 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5410 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 })
5412}
5413
Roland Levillain630846d2019-06-26 12:48:34 +01005414func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005415 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005416 apex_test {
5417 name: "myapex",
5418 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005419 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005420 tests: [
5421 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005422 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005423 ],
5424 }
5425
5426 apex_key {
5427 name: "myapex.key",
5428 public_key: "testkey.avbpubkey",
5429 private_key: "testkey.pem",
5430 }
5431
Liz Kammer1c14a212020-05-12 15:26:55 -07005432 filegroup {
5433 name: "fg",
5434 srcs: [
5435 "baz",
5436 "bar/baz"
5437 ],
5438 }
5439
Roland Levillain630846d2019-06-26 12:48:34 +01005440 cc_test {
5441 name: "mytest",
5442 gtest: false,
5443 srcs: ["mytest.cpp"],
5444 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005445 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005446 system_shared_libs: [],
5447 static_executable: true,
5448 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005449 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005450 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005451
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005452 cc_library {
5453 name: "mylib",
5454 srcs: ["mylib.cpp"],
5455 system_shared_libs: [],
5456 stl: "none",
5457 }
5458
Liz Kammer5bd365f2020-05-27 15:15:11 -07005459 filegroup {
5460 name: "fg2",
5461 srcs: [
5462 "testdata/baz"
5463 ],
5464 }
5465
Roland Levillain9b5fde92019-06-28 15:41:19 +01005466 cc_test {
5467 name: "mytests",
5468 gtest: false,
5469 srcs: [
5470 "mytest1.cpp",
5471 "mytest2.cpp",
5472 "mytest3.cpp",
5473 ],
5474 test_per_src: true,
5475 relative_install_path: "test",
5476 system_shared_libs: [],
5477 static_executable: true,
5478 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005479 data: [
5480 ":fg",
5481 ":fg2",
5482 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005483 }
Roland Levillain630846d2019-06-26 12:48:34 +01005484 `)
5485
Sundong Ahnabb64432019-10-22 13:58:29 +09005486 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005487 copyCmds := apexRule.Args["copy_commands"]
5488
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005489 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005490 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005491 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005492
Liz Kammer1c14a212020-05-12 15:26:55 -07005493 //Ensure that test data are copied into apex.
5494 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5495 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5496
Roland Levillain9b5fde92019-06-28 15:41:19 +01005497 // Ensure that test deps built with `test_per_src` are copied into apex.
5498 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5499 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5500 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005501
5502 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005503 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005504 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005505 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005506 prefix := "TARGET_"
5507 var builder strings.Builder
5508 data.Custom(&builder, name, prefix, "", data)
5509 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005510 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5511 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5512 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5513 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005514 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005515 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005516 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005517
5518 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005519 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005520 data.Custom(&builder, name, prefix, "", data)
5521 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005522 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5523 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005524}
5525
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005526func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005527 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005528 apex {
5529 name: "myapex",
5530 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005531 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005532 }
5533 apex_key {
5534 name: "myapex.key",
5535 public_key: "testkey.avbpubkey",
5536 private_key: "testkey.pem",
5537 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005538 `,
5539 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5540 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5541 }),
5542 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005543 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005544 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005545 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005546 var builder strings.Builder
5547 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5548 androidMk := builder.String()
5549 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5550}
5551
Jooyung Hand48f3c32019-08-23 11:18:57 +09005552func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5553 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5554 apex {
5555 name: "myapex",
5556 key: "myapex.key",
5557 native_shared_libs: ["libfoo"],
5558 }
5559
5560 apex_key {
5561 name: "myapex.key",
5562 public_key: "testkey.avbpubkey",
5563 private_key: "testkey.pem",
5564 }
5565
5566 cc_library {
5567 name: "libfoo",
5568 stl: "none",
5569 system_shared_libs: [],
5570 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005571 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005572 }
5573 `)
5574 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5575 apex {
5576 name: "myapex",
5577 key: "myapex.key",
5578 java_libs: ["myjar"],
5579 }
5580
5581 apex_key {
5582 name: "myapex.key",
5583 public_key: "testkey.avbpubkey",
5584 private_key: "testkey.pem",
5585 }
5586
5587 java_library {
5588 name: "myjar",
5589 srcs: ["foo/bar/MyClass.java"],
5590 sdk_version: "none",
5591 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005592 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005593 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005594 }
5595 `)
5596}
5597
Bill Peckhama41a6962021-01-11 10:58:54 -08005598func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005599 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005600 apex {
5601 name: "myapex",
5602 key: "myapex.key",
5603 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005604 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005605 }
5606
5607 apex_key {
5608 name: "myapex.key",
5609 public_key: "testkey.avbpubkey",
5610 private_key: "testkey.pem",
5611 }
5612
5613 java_import {
5614 name: "myjavaimport",
5615 apex_available: ["myapex"],
5616 jars: ["my.jar"],
5617 compile_dex: true,
5618 }
5619 `)
5620
5621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5622 apexRule := module.Rule("apexRule")
5623 copyCmds := apexRule.Args["copy_commands"]
5624 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5625}
5626
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005627func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005628 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005629 apex {
5630 name: "myapex",
5631 key: "myapex.key",
5632 apps: [
5633 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005634 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005635 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005636 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005637 }
5638
5639 apex_key {
5640 name: "myapex.key",
5641 public_key: "testkey.avbpubkey",
5642 private_key: "testkey.pem",
5643 }
5644
5645 android_app {
5646 name: "AppFoo",
5647 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005648 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005649 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005650 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005651 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005652 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005653 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005654
5655 android_app {
5656 name: "AppFooPriv",
5657 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005658 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005659 system_modules: "none",
5660 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005661 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005662 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005663 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005664
5665 cc_library_shared {
5666 name: "libjni",
5667 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005668 shared_libs: ["libfoo"],
5669 stl: "none",
5670 system_shared_libs: [],
5671 apex_available: [ "myapex" ],
5672 sdk_version: "current",
5673 }
5674
5675 cc_library_shared {
5676 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005677 stl: "none",
5678 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005679 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005680 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005681 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005682 `)
5683
Sundong Ahnabb64432019-10-22 13:58:29 +09005684 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005685 apexRule := module.Rule("apexRule")
5686 copyCmds := apexRule.Args["copy_commands"]
5687
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005688 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5689 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005690
Colin Crossaede88c2020-08-11 12:17:01 -07005691 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005692 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005693 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005694 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005695 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005696 // JNI libraries including transitive deps are
5697 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005698 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005699 // ... embedded inside APK (jnilibs.zip)
5700 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5701 // ... and not directly inside the APEX
5702 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5703 }
Dario Frenicde2a032019-10-27 00:29:22 +01005704}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005705
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005706func TestApexWithAppImportBuildId(t *testing.T) {
5707 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5708 for _, id := range invalidBuildIds {
5709 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5710 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5711 variables.BuildId = proptools.StringPtr(id)
5712 })
5713 testApexError(t, message, `apex {
5714 name: "myapex",
5715 key: "myapex.key",
5716 apps: ["AppFooPrebuilt"],
5717 updatable: false,
5718 }
5719
5720 apex_key {
5721 name: "myapex.key",
5722 public_key: "testkey.avbpubkey",
5723 private_key: "testkey.pem",
5724 }
5725
5726 android_app_import {
5727 name: "AppFooPrebuilt",
5728 apk: "PrebuiltAppFoo.apk",
5729 presigned: true,
5730 apex_available: ["myapex"],
5731 }
5732 `, fixture)
5733 }
5734}
5735
Dario Frenicde2a032019-10-27 00:29:22 +01005736func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005737 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005738 apex {
5739 name: "myapex",
5740 key: "myapex.key",
5741 apps: [
5742 "AppFooPrebuilt",
5743 "AppFooPrivPrebuilt",
5744 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005745 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005746 }
5747
5748 apex_key {
5749 name: "myapex.key",
5750 public_key: "testkey.avbpubkey",
5751 private_key: "testkey.pem",
5752 }
5753
5754 android_app_import {
5755 name: "AppFooPrebuilt",
5756 apk: "PrebuiltAppFoo.apk",
5757 presigned: true,
5758 dex_preopt: {
5759 enabled: false,
5760 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005761 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005762 }
5763
5764 android_app_import {
5765 name: "AppFooPrivPrebuilt",
5766 apk: "PrebuiltAppFooPriv.apk",
5767 privileged: true,
5768 presigned: true,
5769 dex_preopt: {
5770 enabled: false,
5771 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005772 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005773 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005774 }
5775 `)
5776
Sundong Ahnabb64432019-10-22 13:58:29 +09005777 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005778 apexRule := module.Rule("apexRule")
5779 copyCmds := apexRule.Args["copy_commands"]
5780
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005781 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5782 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005783}
5784
5785func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005786 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005787 apex {
5788 name: "myapex",
5789 key: "myapex.key",
5790 apps: [
5791 "AppFoo",
5792 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005793 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005794 }
5795
5796 apex_key {
5797 name: "myapex.key",
5798 public_key: "testkey.avbpubkey",
5799 private_key: "testkey.pem",
5800 }
5801
5802 android_app {
5803 name: "AppFoo",
5804 srcs: ["foo/bar/MyClass.java"],
5805 sdk_version: "none",
5806 system_modules: "none",
5807 apex_available: [ "myapex" ],
5808 }
5809
5810 android_app_import {
5811 name: "AppFoo",
5812 apk: "AppFooPrebuilt.apk",
5813 filename: "AppFooPrebuilt.apk",
5814 presigned: true,
5815 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005816 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005817 }
5818 `, withFiles(map[string][]byte{
5819 "AppFooPrebuilt.apk": nil,
5820 }))
5821
5822 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005823 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005824 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005825}
5826
Dario Freni6f3937c2019-12-20 22:58:03 +00005827func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005828 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
5832 apps: [
5833 "TesterHelpAppFoo",
5834 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005835 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005836 }
5837
5838 apex_key {
5839 name: "myapex.key",
5840 public_key: "testkey.avbpubkey",
5841 private_key: "testkey.pem",
5842 }
5843
5844 android_test_helper_app {
5845 name: "TesterHelpAppFoo",
5846 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005847 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005848 }
5849
5850 `)
5851
5852 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5853 apexRule := module.Rule("apexRule")
5854 copyCmds := apexRule.Args["copy_commands"]
5855
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005856 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005857}
5858
Jooyung Han18020ea2019-11-13 10:50:48 +09005859func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5860 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005861 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005862 apex {
5863 name: "myapex",
5864 key: "myapex.key",
5865 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005866 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005867 }
5868
5869 apex_key {
5870 name: "myapex.key",
5871 public_key: "testkey.avbpubkey",
5872 private_key: "testkey.pem",
5873 }
5874
5875 apex {
5876 name: "otherapex",
5877 key: "myapex.key",
5878 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005879 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005880 }
5881
5882 cc_defaults {
5883 name: "libfoo-defaults",
5884 apex_available: ["otherapex"],
5885 }
5886
5887 cc_library {
5888 name: "libfoo",
5889 defaults: ["libfoo-defaults"],
5890 stl: "none",
5891 system_shared_libs: [],
5892 }`)
5893}
5894
Paul Duffine52e66f2020-03-30 17:54:29 +01005895func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005896 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005897 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005898 apex {
5899 name: "myapex",
5900 key: "myapex.key",
5901 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005902 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005903 }
5904
5905 apex_key {
5906 name: "myapex.key",
5907 public_key: "testkey.avbpubkey",
5908 private_key: "testkey.pem",
5909 }
5910
5911 apex {
5912 name: "otherapex",
5913 key: "otherapex.key",
5914 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005915 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005916 }
5917
5918 apex_key {
5919 name: "otherapex.key",
5920 public_key: "testkey.avbpubkey",
5921 private_key: "testkey.pem",
5922 }
5923
5924 cc_library {
5925 name: "libfoo",
5926 stl: "none",
5927 system_shared_libs: [],
5928 apex_available: ["otherapex"],
5929 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005930}
Jiyong Park127b40b2019-09-30 16:04:35 +09005931
Paul Duffine52e66f2020-03-30 17:54:29 +01005932func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005933 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005934 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00005935.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01005936.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005937.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005938.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005939.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005940.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005941 apex {
5942 name: "myapex",
5943 key: "myapex.key",
5944 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005945 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005946 }
5947
5948 apex_key {
5949 name: "myapex.key",
5950 public_key: "testkey.avbpubkey",
5951 private_key: "testkey.pem",
5952 }
5953
Jiyong Park127b40b2019-09-30 16:04:35 +09005954 cc_library {
5955 name: "libfoo",
5956 stl: "none",
5957 shared_libs: ["libbar"],
5958 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005959 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005960 }
5961
5962 cc_library {
5963 name: "libbar",
5964 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005965 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005966 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005967 apex_available: ["myapex"],
5968 }
5969
5970 cc_library {
5971 name: "libbaz",
5972 stl: "none",
5973 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005974 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005975}
Jiyong Park127b40b2019-09-30 16:04:35 +09005976
Paul Duffine52e66f2020-03-30 17:54:29 +01005977func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005978 testApexError(t, "\"otherapex\" is not a valid module name", `
5979 apex {
5980 name: "myapex",
5981 key: "myapex.key",
5982 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005983 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005984 }
5985
5986 apex_key {
5987 name: "myapex.key",
5988 public_key: "testkey.avbpubkey",
5989 private_key: "testkey.pem",
5990 }
5991
5992 cc_library {
5993 name: "libfoo",
5994 stl: "none",
5995 system_shared_libs: [],
5996 apex_available: ["otherapex"],
5997 }`)
5998
Paul Duffine52e66f2020-03-30 17:54:29 +01005999 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006000 apex {
6001 name: "myapex",
6002 key: "myapex.key",
6003 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006004 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006005 }
6006
6007 apex_key {
6008 name: "myapex.key",
6009 public_key: "testkey.avbpubkey",
6010 private_key: "testkey.pem",
6011 }
6012
6013 cc_library {
6014 name: "libfoo",
6015 stl: "none",
6016 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006017 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006018 apex_available: ["myapex"],
6019 }
6020
6021 cc_library {
6022 name: "libbar",
6023 stl: "none",
6024 system_shared_libs: [],
6025 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006026 }
6027
6028 cc_library {
6029 name: "libbaz",
6030 stl: "none",
6031 system_shared_libs: [],
6032 stubs: {
6033 versions: ["10", "20", "30"],
6034 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006035 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006036}
Jiyong Park127b40b2019-09-30 16:04:35 +09006037
Jiyong Park89e850a2020-04-07 16:37:39 +09006038func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006039 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006040 apex {
6041 name: "myapex",
6042 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006043 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006044 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006045 }
6046
6047 apex_key {
6048 name: "myapex.key",
6049 public_key: "testkey.avbpubkey",
6050 private_key: "testkey.pem",
6051 }
6052
6053 cc_library {
6054 name: "libfoo",
6055 stl: "none",
6056 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006057 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006058 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006059 }
6060
6061 cc_library {
6062 name: "libfoo2",
6063 stl: "none",
6064 system_shared_libs: [],
6065 shared_libs: ["libbaz"],
6066 apex_available: ["//apex_available:platform"],
6067 }
6068
6069 cc_library {
6070 name: "libbar",
6071 stl: "none",
6072 system_shared_libs: [],
6073 apex_available: ["myapex"],
6074 }
6075
6076 cc_library {
6077 name: "libbaz",
6078 stl: "none",
6079 system_shared_libs: [],
6080 apex_available: ["myapex"],
6081 stubs: {
6082 versions: ["1"],
6083 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006084 }`)
6085
Jiyong Park89e850a2020-04-07 16:37:39 +09006086 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6087 // because it depends on libbar which isn't available to platform
6088 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6089 if libfoo.NotAvailableForPlatform() != true {
6090 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6091 }
6092
6093 // libfoo2 however can be available to platform because it depends on libbaz which provides
6094 // stubs
6095 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6096 if libfoo2.NotAvailableForPlatform() == true {
6097 t.Errorf("%q should be available to platform", libfoo2.String())
6098 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006099}
Jiyong Parka90ca002019-10-07 15:47:24 +09006100
Paul Duffine52e66f2020-03-30 17:54:29 +01006101func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006102 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006103 apex {
6104 name: "myapex",
6105 key: "myapex.key",
6106 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006107 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
6116 cc_library {
6117 name: "libfoo",
6118 stl: "none",
6119 system_shared_libs: [],
6120 apex_available: ["myapex"],
6121 static: {
6122 apex_available: ["//apex_available:platform"],
6123 },
6124 }`)
6125
Jiyong Park89e850a2020-04-07 16:37:39 +09006126 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6127 if libfooShared.NotAvailableForPlatform() != true {
6128 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6129 }
6130 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6131 if libfooStatic.NotAvailableForPlatform() != false {
6132 t.Errorf("%q should be available to platform", libfooStatic.String())
6133 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006134}
6135
Jiyong Park5d790c32019-11-15 18:40:32 +09006136func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006137 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006138 apex {
6139 name: "myapex",
6140 key: "myapex.key",
6141 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006142 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006143 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006144 bootclasspath_fragments: ["mybootclasspath_fragment"],
6145 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6146 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006147 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006148 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006149 }
6150
6151 override_apex {
6152 name: "override_myapex",
6153 base: "myapex",
6154 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006155 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006156 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006157 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6158 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6159 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006160 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006161 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006162 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006163 key: "mynewapex.key",
6164 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006165 }
6166
6167 apex_key {
6168 name: "myapex.key",
6169 public_key: "testkey.avbpubkey",
6170 private_key: "testkey.pem",
6171 }
6172
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006173 apex_key {
6174 name: "mynewapex.key",
6175 public_key: "testkey2.avbpubkey",
6176 private_key: "testkey2.pem",
6177 }
6178
6179 android_app_certificate {
6180 name: "myapex.certificate",
6181 certificate: "testkey",
6182 }
6183
Jiyong Park5d790c32019-11-15 18:40:32 +09006184 android_app {
6185 name: "app",
6186 srcs: ["foo/bar/MyClass.java"],
6187 package_name: "foo",
6188 sdk_version: "none",
6189 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006190 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006191 }
6192
6193 override_android_app {
6194 name: "override_app",
6195 base: "app",
6196 package_name: "bar",
6197 }
markchien7c803b82021-08-26 22:10:06 +08006198
6199 bpf {
6200 name: "bpf",
6201 srcs: ["bpf.c"],
6202 }
6203
6204 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006205 name: "overrideBpf",
6206 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006207 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006208
6209 prebuilt_etc {
6210 name: "myetc",
6211 src: "myprebuilt",
6212 }
6213
6214 prebuilt_etc {
6215 name: "override_myetc",
6216 src: "override_myprebuilt",
6217 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006218
6219 java_library {
6220 name: "bcplib",
6221 srcs: ["a.java"],
6222 compile_dex: true,
6223 apex_available: ["myapex"],
6224 permitted_packages: ["bcp.lib"],
6225 }
6226
6227 bootclasspath_fragment {
6228 name: "mybootclasspath_fragment",
6229 contents: ["bcplib"],
6230 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006231 hidden_api: {
6232 split_packages: ["*"],
6233 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006234 }
6235
6236 java_library {
6237 name: "override_bcplib",
6238 srcs: ["a.java"],
6239 compile_dex: true,
6240 apex_available: ["myapex"],
6241 permitted_packages: ["override.bcp.lib"],
6242 }
6243
6244 bootclasspath_fragment {
6245 name: "override_bootclasspath_fragment",
6246 contents: ["override_bcplib"],
6247 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006248 hidden_api: {
6249 split_packages: ["*"],
6250 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006251 }
6252
6253 java_library {
6254 name: "systemserverlib",
6255 srcs: ["a.java"],
6256 apex_available: ["myapex"],
6257 }
6258
6259 systemserverclasspath_fragment {
6260 name: "mysystemserverclasspath_fragment",
6261 standalone_contents: ["systemserverlib"],
6262 apex_available: ["myapex"],
6263 }
6264
6265 java_library {
6266 name: "override_systemserverlib",
6267 srcs: ["a.java"],
6268 apex_available: ["myapex"],
6269 }
6270
6271 systemserverclasspath_fragment {
6272 name: "override_systemserverclasspath_fragment",
6273 standalone_contents: ["override_systemserverlib"],
6274 apex_available: ["myapex"],
6275 }
6276
6277 java_library {
6278 name: "myjava_library",
6279 srcs: ["a.java"],
6280 compile_dex: true,
6281 apex_available: ["myapex"],
6282 }
6283
6284 java_library {
6285 name: "override_java_library",
6286 srcs: ["a.java"],
6287 compile_dex: true,
6288 apex_available: ["myapex"],
6289 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006290 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006291
Jiyong Park317645e2019-12-05 13:20:58 +09006292 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6293 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6294 if originalVariant.GetOverriddenBy() != "" {
6295 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6296 }
6297 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6298 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6299 }
6300
Jiyong Park5d790c32019-11-15 18:40:32 +09006301 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6302 apexRule := module.Rule("apexRule")
6303 copyCmds := apexRule.Args["copy_commands"]
6304
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006305 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6306 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006307
markchien7c803b82021-08-26 22:10:06 +08006308 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006309 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006310
Daniel Norman5a3ce132021-08-26 15:44:43 -07006311 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6312 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6313
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006314 apexBundle := module.Module().(*apexBundle)
6315 name := apexBundle.Name()
6316 if name != "override_myapex" {
6317 t.Errorf("name should be \"override_myapex\", but was %q", name)
6318 }
6319
Baligh Uddin004d7172020-02-19 21:29:28 -08006320 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6321 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6322 }
6323
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006324 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6325 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6326 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6327 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6328 android.AssertArrayString(t, "Java_libs does not match",
6329 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6330
Jiyong Park20bacab2020-03-03 11:45:41 +09006331 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006332 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006333 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6334
6335 signApkRule := module.Rule("signapk")
6336 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006337
Colin Crossaa255532020-07-03 13:18:24 -07006338 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006339 var builder strings.Builder
6340 data.Custom(&builder, name, "TARGET_", "", data)
6341 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006342 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Ken Chen5372a242022-07-07 17:48:06 +08006343 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006344 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006345 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6346 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6347 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006348 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006349 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006350 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006351 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006352 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006353 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006354 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6355 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6356 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006357 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006358}
6359
Albert Martineefabcf2022-03-21 20:11:16 +00006360func TestMinSdkVersionOverride(t *testing.T) {
6361 // Override from 29 to 31
6362 minSdkOverride31 := "31"
6363 ctx := testApex(t, `
6364 apex {
6365 name: "myapex",
6366 key: "myapex.key",
6367 native_shared_libs: ["mylib"],
6368 updatable: true,
6369 min_sdk_version: "29"
6370 }
6371
6372 override_apex {
6373 name: "override_myapex",
6374 base: "myapex",
6375 logging_parent: "com.foo.bar",
6376 package_name: "test.overridden.package"
6377 }
6378
6379 apex_key {
6380 name: "myapex.key",
6381 public_key: "testkey.avbpubkey",
6382 private_key: "testkey.pem",
6383 }
6384
6385 cc_library {
6386 name: "mylib",
6387 srcs: ["mylib.cpp"],
6388 runtime_libs: ["libbar"],
6389 system_shared_libs: [],
6390 stl: "none",
6391 apex_available: [ "myapex" ],
6392 min_sdk_version: "apex_inherit"
6393 }
6394
6395 cc_library {
6396 name: "libbar",
6397 srcs: ["mylib.cpp"],
6398 system_shared_libs: [],
6399 stl: "none",
6400 apex_available: [ "myapex" ],
6401 min_sdk_version: "apex_inherit"
6402 }
6403
6404 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6405
6406 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6407 copyCmds := apexRule.Args["copy_commands"]
6408
6409 // Ensure that direct non-stubs dep is always included
6410 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6411
6412 // Ensure that runtime_libs dep in included
6413 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6414
6415 // Ensure libraries target overridden min_sdk_version value
6416 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6417}
6418
6419func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6420 // Attempt to override from 31 to 29, should be a NOOP
6421 minSdkOverride29 := "29"
6422 ctx := testApex(t, `
6423 apex {
6424 name: "myapex",
6425 key: "myapex.key",
6426 native_shared_libs: ["mylib"],
6427 updatable: true,
6428 min_sdk_version: "31"
6429 }
6430
6431 override_apex {
6432 name: "override_myapex",
6433 base: "myapex",
6434 logging_parent: "com.foo.bar",
6435 package_name: "test.overridden.package"
6436 }
6437
6438 apex_key {
6439 name: "myapex.key",
6440 public_key: "testkey.avbpubkey",
6441 private_key: "testkey.pem",
6442 }
6443
6444 cc_library {
6445 name: "mylib",
6446 srcs: ["mylib.cpp"],
6447 runtime_libs: ["libbar"],
6448 system_shared_libs: [],
6449 stl: "none",
6450 apex_available: [ "myapex" ],
6451 min_sdk_version: "apex_inherit"
6452 }
6453
6454 cc_library {
6455 name: "libbar",
6456 srcs: ["mylib.cpp"],
6457 system_shared_libs: [],
6458 stl: "none",
6459 apex_available: [ "myapex" ],
6460 min_sdk_version: "apex_inherit"
6461 }
6462
6463 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6464
6465 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6466 copyCmds := apexRule.Args["copy_commands"]
6467
6468 // Ensure that direct non-stubs dep is always included
6469 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6470
6471 // Ensure that runtime_libs dep in included
6472 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6473
6474 // Ensure libraries target the original min_sdk_version value rather than the overridden
6475 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6476}
6477
Jooyung Han214bf372019-11-12 13:03:50 +09006478func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006479 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006480 apex {
6481 name: "myapex",
6482 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006483 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006484 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006485 }
6486
6487 apex_key {
6488 name: "myapex.key",
6489 public_key: "testkey.avbpubkey",
6490 private_key: "testkey.pem",
6491 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006492
6493 cc_library {
6494 name: "mylib",
6495 srcs: ["mylib.cpp"],
6496 stl: "libc++",
6497 system_shared_libs: [],
6498 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006499 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006500 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006501 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006502
6503 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6504 args := module.Rule("apexRule").Args
6505 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006506 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006507
6508 // The copies of the libraries in the apex should have one more dependency than
6509 // the ones outside the apex, namely the unwinder. Ideally we should check
6510 // the dependency names directly here but for some reason the names are blank in
6511 // this test.
6512 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006513 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006514 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6515 if len(apexImplicits) != len(nonApexImplicits)+1 {
6516 t.Errorf("%q missing unwinder dep", lib)
6517 }
6518 }
Jooyung Han214bf372019-11-12 13:03:50 +09006519}
6520
Paul Duffine05480a2021-03-08 15:07:14 +00006521var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006522 "api/current.txt": nil,
6523 "api/removed.txt": nil,
6524 "api/system-current.txt": nil,
6525 "api/system-removed.txt": nil,
6526 "api/test-current.txt": nil,
6527 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006528
Anton Hanssondff2c782020-12-21 17:10:01 +00006529 "100/public/api/foo.txt": nil,
6530 "100/public/api/foo-removed.txt": nil,
6531 "100/system/api/foo.txt": nil,
6532 "100/system/api/foo-removed.txt": nil,
6533
Paul Duffineedc5d52020-06-12 17:46:39 +01006534 // For java_sdk_library_import
6535 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006536}
6537
Jooyung Han58f26ab2019-12-18 15:34:32 +09006538func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006539 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006544 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 java_sdk_library {
6554 name: "foo",
6555 srcs: ["a.java"],
6556 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006557 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006558 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006559
6560 prebuilt_apis {
6561 name: "sdk",
6562 api_dirs: ["100"],
6563 }
Paul Duffin9b879592020-05-26 13:21:35 +01006564 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006565
6566 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006567 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006568 "javalib/foo.jar",
6569 "etc/permissions/foo.xml",
6570 })
6571 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006572 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006573 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 +09006574}
6575
Paul Duffin9b879592020-05-26 13:21:35 +01006576func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006577 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006578 apex {
6579 name: "myapex",
6580 key: "myapex.key",
6581 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006582 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006583 }
6584
6585 apex_key {
6586 name: "myapex.key",
6587 public_key: "testkey.avbpubkey",
6588 private_key: "testkey.pem",
6589 }
6590
6591 java_sdk_library {
6592 name: "foo",
6593 srcs: ["a.java"],
6594 api_packages: ["foo"],
6595 apex_available: ["myapex"],
6596 sdk_version: "none",
6597 system_modules: "none",
6598 }
6599
6600 java_library {
6601 name: "bar",
6602 srcs: ["a.java"],
6603 libs: ["foo"],
6604 apex_available: ["myapex"],
6605 sdk_version: "none",
6606 system_modules: "none",
6607 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006608
6609 prebuilt_apis {
6610 name: "sdk",
6611 api_dirs: ["100"],
6612 }
Paul Duffin9b879592020-05-26 13:21:35 +01006613 `, withFiles(filesForSdkLibrary))
6614
6615 // java_sdk_library installs both impl jar and permission XML
6616 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6617 "javalib/bar.jar",
6618 "javalib/foo.jar",
6619 "etc/permissions/foo.xml",
6620 })
6621
6622 // The bar library should depend on the implementation jar.
6623 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006624 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006625 t.Errorf("expected %q, found %#q", expected, actual)
6626 }
6627}
6628
6629func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006630 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006631 apex {
6632 name: "myapex",
6633 key: "myapex.key",
6634 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006635 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006636 }
6637
6638 apex_key {
6639 name: "myapex.key",
6640 public_key: "testkey.avbpubkey",
6641 private_key: "testkey.pem",
6642 }
6643
6644 java_sdk_library {
6645 name: "foo",
6646 srcs: ["a.java"],
6647 api_packages: ["foo"],
6648 apex_available: ["myapex"],
6649 sdk_version: "none",
6650 system_modules: "none",
6651 }
6652
6653 java_library {
6654 name: "bar",
6655 srcs: ["a.java"],
6656 libs: ["foo"],
6657 sdk_version: "none",
6658 system_modules: "none",
6659 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006660
6661 prebuilt_apis {
6662 name: "sdk",
6663 api_dirs: ["100"],
6664 }
Paul Duffin9b879592020-05-26 13:21:35 +01006665 `, withFiles(filesForSdkLibrary))
6666
6667 // java_sdk_library installs both impl jar and permission XML
6668 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6669 "javalib/foo.jar",
6670 "etc/permissions/foo.xml",
6671 })
6672
6673 // The bar library should depend on the stubs jar.
6674 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006675 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006676 t.Errorf("expected %q, found %#q", expected, actual)
6677 }
6678}
6679
Paul Duffineedc5d52020-06-12 17:46:39 +01006680func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006681 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006682 prebuilt_apis {
6683 name: "sdk",
6684 api_dirs: ["100"],
6685 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006686 withFiles(map[string][]byte{
6687 "apex/a.java": nil,
6688 "apex/apex_manifest.json": nil,
6689 "apex/Android.bp": []byte(`
6690 package {
6691 default_visibility: ["//visibility:private"],
6692 }
6693
6694 apex {
6695 name: "myapex",
6696 key: "myapex.key",
6697 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006698 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006699 }
6700
6701 apex_key {
6702 name: "myapex.key",
6703 public_key: "testkey.avbpubkey",
6704 private_key: "testkey.pem",
6705 }
6706
6707 java_library {
6708 name: "bar",
6709 srcs: ["a.java"],
6710 libs: ["foo"],
6711 apex_available: ["myapex"],
6712 sdk_version: "none",
6713 system_modules: "none",
6714 }
6715`),
6716 "source/a.java": nil,
6717 "source/api/current.txt": nil,
6718 "source/api/removed.txt": nil,
6719 "source/Android.bp": []byte(`
6720 package {
6721 default_visibility: ["//visibility:private"],
6722 }
6723
6724 java_sdk_library {
6725 name: "foo",
6726 visibility: ["//apex"],
6727 srcs: ["a.java"],
6728 api_packages: ["foo"],
6729 apex_available: ["myapex"],
6730 sdk_version: "none",
6731 system_modules: "none",
6732 public: {
6733 enabled: true,
6734 },
6735 }
6736`),
6737 "prebuilt/a.jar": nil,
6738 "prebuilt/Android.bp": []byte(`
6739 package {
6740 default_visibility: ["//visibility:private"],
6741 }
6742
6743 java_sdk_library_import {
6744 name: "foo",
6745 visibility: ["//apex", "//source"],
6746 apex_available: ["myapex"],
6747 prefer: true,
6748 public: {
6749 jars: ["a.jar"],
6750 },
6751 }
6752`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006753 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006754 )
6755
6756 // java_sdk_library installs both impl jar and permission XML
6757 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6758 "javalib/bar.jar",
6759 "javalib/foo.jar",
6760 "etc/permissions/foo.xml",
6761 })
6762
6763 // The bar library should depend on the implementation jar.
6764 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006765 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006766 t.Errorf("expected %q, found %#q", expected, actual)
6767 }
6768}
6769
6770func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6771 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6772 apex {
6773 name: "myapex",
6774 key: "myapex.key",
6775 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006776 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006777 }
6778
6779 apex_key {
6780 name: "myapex.key",
6781 public_key: "testkey.avbpubkey",
6782 private_key: "testkey.pem",
6783 }
6784
6785 java_sdk_library_import {
6786 name: "foo",
6787 apex_available: ["myapex"],
6788 prefer: true,
6789 public: {
6790 jars: ["a.jar"],
6791 },
6792 }
6793
6794 `, withFiles(filesForSdkLibrary))
6795}
6796
atrost6e126252020-01-27 17:01:16 +00006797func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006798 result := android.GroupFixturePreparers(
6799 prepareForApexTest,
6800 java.PrepareForTestWithPlatformCompatConfig,
6801 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006802 apex {
6803 name: "myapex",
6804 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006805 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006806 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006807 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006808 }
6809
6810 apex_key {
6811 name: "myapex.key",
6812 public_key: "testkey.avbpubkey",
6813 private_key: "testkey.pem",
6814 }
6815
6816 platform_compat_config {
6817 name: "myjar-platform-compat-config",
6818 src: ":myjar",
6819 }
6820
6821 java_library {
6822 name: "myjar",
6823 srcs: ["foo/bar/MyClass.java"],
6824 sdk_version: "none",
6825 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006826 apex_available: [ "myapex" ],
6827 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006828
6829 // Make sure that a preferred prebuilt does not affect the apex contents.
6830 prebuilt_platform_compat_config {
6831 name: "myjar-platform-compat-config",
6832 metadata: "compat-config/metadata.xml",
6833 prefer: true,
6834 }
atrost6e126252020-01-27 17:01:16 +00006835 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006836 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006837 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6838 "etc/compatconfig/myjar-platform-compat-config.xml",
6839 "javalib/myjar.jar",
6840 })
6841}
6842
Jiyong Park479321d2019-12-16 11:47:12 +09006843func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6844 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6845 apex {
6846 name: "myapex",
6847 key: "myapex.key",
6848 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006849 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006850 }
6851
6852 apex_key {
6853 name: "myapex.key",
6854 public_key: "testkey.avbpubkey",
6855 private_key: "testkey.pem",
6856 }
6857
6858 java_library {
6859 name: "myjar",
6860 srcs: ["foo/bar/MyClass.java"],
6861 sdk_version: "none",
6862 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006863 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006864 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006865 }
6866 `)
6867}
6868
Jiyong Park7afd1072019-12-30 16:56:33 +09006869func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006870 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006871 apex {
6872 name: "myapex",
6873 key: "myapex.key",
6874 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006875 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006876 }
6877
6878 apex_key {
6879 name: "myapex.key",
6880 public_key: "testkey.avbpubkey",
6881 private_key: "testkey.pem",
6882 }
6883
6884 cc_library {
6885 name: "mylib",
6886 srcs: ["mylib.cpp"],
6887 system_shared_libs: [],
6888 stl: "none",
6889 required: ["a", "b"],
6890 host_required: ["c", "d"],
6891 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006892 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006893 }
6894 `)
6895
6896 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006897 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006898 name := apexBundle.BaseModuleName()
6899 prefix := "TARGET_"
6900 var builder strings.Builder
6901 data.Custom(&builder, name, prefix, "", data)
6902 androidMk := builder.String()
6903 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6904 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6905 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6906}
6907
Jiyong Park7cd10e32020-01-14 09:22:18 +09006908func TestSymlinksFromApexToSystem(t *testing.T) {
6909 bp := `
6910 apex {
6911 name: "myapex",
6912 key: "myapex.key",
6913 native_shared_libs: ["mylib"],
6914 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006915 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006916 }
6917
Jiyong Park9d677202020-02-19 16:29:35 +09006918 apex {
6919 name: "myapex.updatable",
6920 key: "myapex.key",
6921 native_shared_libs: ["mylib"],
6922 java_libs: ["myjar"],
6923 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006924 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006925 }
6926
Jiyong Park7cd10e32020-01-14 09:22:18 +09006927 apex_key {
6928 name: "myapex.key",
6929 public_key: "testkey.avbpubkey",
6930 private_key: "testkey.pem",
6931 }
6932
6933 cc_library {
6934 name: "mylib",
6935 srcs: ["mylib.cpp"],
6936 shared_libs: ["myotherlib"],
6937 system_shared_libs: [],
6938 stl: "none",
6939 apex_available: [
6940 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006941 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006942 "//apex_available:platform",
6943 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006944 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006945 }
6946
6947 cc_library {
6948 name: "myotherlib",
6949 srcs: ["mylib.cpp"],
6950 system_shared_libs: [],
6951 stl: "none",
6952 apex_available: [
6953 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006954 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006955 "//apex_available:platform",
6956 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006957 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006958 }
6959
6960 java_library {
6961 name: "myjar",
6962 srcs: ["foo/bar/MyClass.java"],
6963 sdk_version: "none",
6964 system_modules: "none",
6965 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006966 apex_available: [
6967 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006968 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006969 "//apex_available:platform",
6970 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006971 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006972 }
6973
6974 java_library {
6975 name: "myotherjar",
6976 srcs: ["foo/bar/MyClass.java"],
6977 sdk_version: "none",
6978 system_modules: "none",
6979 apex_available: [
6980 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006981 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006982 "//apex_available:platform",
6983 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006984 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006985 }
6986 `
6987
6988 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6989 for _, f := range files {
6990 if f.path == file {
6991 if f.isLink {
6992 t.Errorf("%q is not a real file", file)
6993 }
6994 return
6995 }
6996 }
6997 t.Errorf("%q is not found", file)
6998 }
6999
7000 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7001 for _, f := range files {
7002 if f.path == file {
7003 if !f.isLink {
7004 t.Errorf("%q is not a symlink", file)
7005 }
7006 return
7007 }
7008 }
7009 t.Errorf("%q is not found", file)
7010 }
7011
Jiyong Park9d677202020-02-19 16:29:35 +09007012 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7013 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007014 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007015 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007016 ensureRealfileExists(t, files, "javalib/myjar.jar")
7017 ensureRealfileExists(t, files, "lib64/mylib.so")
7018 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7019
Jiyong Park9d677202020-02-19 16:29:35 +09007020 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7021 ensureRealfileExists(t, files, "javalib/myjar.jar")
7022 ensureRealfileExists(t, files, "lib64/mylib.so")
7023 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7024
7025 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007026 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007027 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007028 ensureRealfileExists(t, files, "javalib/myjar.jar")
7029 ensureRealfileExists(t, files, "lib64/mylib.so")
7030 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007031
7032 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7033 ensureRealfileExists(t, files, "javalib/myjar.jar")
7034 ensureRealfileExists(t, files, "lib64/mylib.so")
7035 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007036}
7037
Yo Chiange8128052020-07-23 20:09:18 +08007038func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007039 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007040 apex {
7041 name: "myapex",
7042 key: "myapex.key",
7043 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007044 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007045 }
7046
7047 apex_key {
7048 name: "myapex.key",
7049 public_key: "testkey.avbpubkey",
7050 private_key: "testkey.pem",
7051 }
7052
7053 cc_library_shared {
7054 name: "mylib",
7055 srcs: ["mylib.cpp"],
7056 shared_libs: ["myotherlib"],
7057 system_shared_libs: [],
7058 stl: "none",
7059 apex_available: [
7060 "myapex",
7061 "//apex_available:platform",
7062 ],
7063 }
7064
7065 cc_prebuilt_library_shared {
7066 name: "myotherlib",
7067 srcs: ["prebuilt.so"],
7068 system_shared_libs: [],
7069 stl: "none",
7070 apex_available: [
7071 "myapex",
7072 "//apex_available:platform",
7073 ],
7074 }
7075 `)
7076
7077 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007078 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007079 var builder strings.Builder
7080 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7081 androidMk := builder.String()
7082 // `myotherlib` is added to `myapex` as symlink
7083 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7084 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7085 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7086 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007087 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 +08007088}
7089
Jooyung Han643adc42020-02-27 13:50:06 +09007090func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007091 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007092 apex {
7093 name: "myapex",
7094 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007095 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007096 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007097 }
7098
7099 apex_key {
7100 name: "myapex.key",
7101 public_key: "testkey.avbpubkey",
7102 private_key: "testkey.pem",
7103 }
7104
7105 cc_library {
7106 name: "mylib",
7107 srcs: ["mylib.cpp"],
7108 shared_libs: ["mylib2"],
7109 system_shared_libs: [],
7110 stl: "none",
7111 apex_available: [ "myapex" ],
7112 }
7113
7114 cc_library {
7115 name: "mylib2",
7116 srcs: ["mylib.cpp"],
7117 system_shared_libs: [],
7118 stl: "none",
7119 apex_available: [ "myapex" ],
7120 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007121
7122 rust_ffi_shared {
7123 name: "libfoo.rust",
7124 crate_name: "foo",
7125 srcs: ["foo.rs"],
7126 shared_libs: ["libfoo.shared_from_rust"],
7127 prefer_rlib: true,
7128 apex_available: ["myapex"],
7129 }
7130
7131 cc_library_shared {
7132 name: "libfoo.shared_from_rust",
7133 srcs: ["mylib.cpp"],
7134 system_shared_libs: [],
7135 stl: "none",
7136 stubs: {
7137 versions: ["10", "11", "12"],
7138 },
7139 }
7140
Jooyung Han643adc42020-02-27 13:50:06 +09007141 `)
7142
7143 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7144 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007145 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007146 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7147 "lib64/mylib.so",
7148 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007149 "lib64/libfoo.rust.so",
7150 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7151 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007152 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007153
7154 // b/220397949
7155 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007156}
7157
Jooyung Han49f67012020-04-17 13:43:10 +09007158func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007159 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007160 apex {
7161 name: "myapex",
7162 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007163 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007164 }
7165 apex_key {
7166 name: "myapex.key",
7167 public_key: "testkey.avbpubkey",
7168 private_key: "testkey.pem",
7169 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007170 `,
7171 android.FixtureModifyConfig(func(config android.Config) {
7172 delete(config.Targets, android.Android)
7173 config.AndroidCommonTarget = android.Target{}
7174 }),
7175 )
Jooyung Han49f67012020-04-17 13:43:10 +09007176
7177 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7178 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7179 }
7180}
7181
Jiyong Parkbd159612020-02-28 15:22:21 +09007182func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007183 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007184 apex {
7185 name: "myapex",
7186 key: "myapex.key",
7187 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007188 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007189 }
7190
7191 apex_key {
7192 name: "myapex.key",
7193 public_key: "testkey.avbpubkey",
7194 private_key: "testkey.pem",
7195 }
7196
7197 android_app {
7198 name: "AppFoo",
7199 srcs: ["foo/bar/MyClass.java"],
7200 sdk_version: "none",
7201 system_modules: "none",
7202 apex_available: [ "myapex" ],
7203 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007204 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007205
Colin Crosscf371cc2020-11-13 11:48:42 -08007206 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007207 content := bundleConfigRule.Args["content"]
7208
7209 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007210 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 +09007211}
7212
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007213func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007214 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007215 apex {
7216 name: "myapex",
7217 key: "myapex.key",
7218 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007219 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007220 }
7221
7222 apex_key {
7223 name: "myapex.key",
7224 public_key: "testkey.avbpubkey",
7225 private_key: "testkey.pem",
7226 }
7227
7228 android_app_set {
7229 name: "AppSet",
7230 set: "AppSet.apks",
7231 }`)
7232 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007233 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007234 content := bundleConfigRule.Args["content"]
7235 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7236 s := mod.Rule("apexRule").Args["copy_commands"]
7237 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7238 if len(copyCmds) != 3 {
7239 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7240 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007241 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7242 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
7243 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007244
7245 // Ensure that canned_fs_config has an entry for the app set zip file
7246 generateFsRule := mod.Rule("generateFsConfig")
7247 cmd := generateFsRule.RuleParams.Command
7248 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007249}
7250
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007251func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007252 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007253 apex_set {
7254 name: "myapex",
7255 filename: "foo_v2.apex",
7256 sanitized: {
7257 none: { set: "myapex.apks", },
7258 hwaddress: { set: "myapex.hwasan.apks", },
7259 },
Paul Duffin24704672021-04-06 16:09:30 +01007260 }
7261 `
7262 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007263
Paul Duffin24704672021-04-06 16:09:30 +01007264 // Check that the extractor produces the correct output file from the correct input file.
7265 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007266
Paul Duffin24704672021-04-06 16:09:30 +01007267 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7268 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007269
Paul Duffin24704672021-04-06 16:09:30 +01007270 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7271
7272 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007273 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7274 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007275
7276 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007277}
7278
Pranav Guptaeba03b02022-09-27 00:27:08 +00007279func TestApexSetApksModuleAssignment(t *testing.T) {
7280 ctx := testApex(t, `
7281 apex_set {
7282 name: "myapex",
7283 set: ":myapex_apks_file",
7284 }
7285
7286 filegroup {
7287 name: "myapex_apks_file",
7288 srcs: ["myapex.apks"],
7289 }
7290 `)
7291
7292 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7293
7294 // Check that the extractor produces the correct apks file from the input module
7295 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7296 extractedApex := m.Output(extractorOutput)
7297
7298 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7299}
7300
Paul Duffin89f570a2021-06-16 01:42:33 +01007301func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007302 t.Helper()
7303
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007304 bp := `
7305 java_library {
7306 name: "some-updatable-apex-lib",
7307 srcs: ["a.java"],
7308 sdk_version: "current",
7309 apex_available: [
7310 "some-updatable-apex",
7311 ],
satayevabcd5972021-08-06 17:49:46 +01007312 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007313 }
7314
7315 java_library {
7316 name: "some-non-updatable-apex-lib",
7317 srcs: ["a.java"],
7318 apex_available: [
7319 "some-non-updatable-apex",
7320 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007321 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007322 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007323 }
7324
7325 bootclasspath_fragment {
7326 name: "some-non-updatable-fragment",
7327 contents: ["some-non-updatable-apex-lib"],
7328 apex_available: [
7329 "some-non-updatable-apex",
7330 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007331 hidden_api: {
7332 split_packages: ["*"],
7333 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007334 }
7335
7336 java_library {
7337 name: "some-platform-lib",
7338 srcs: ["a.java"],
7339 sdk_version: "current",
7340 installable: true,
7341 }
7342
7343 java_library {
7344 name: "some-art-lib",
7345 srcs: ["a.java"],
7346 sdk_version: "current",
7347 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007348 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007349 ],
7350 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007351 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007352 }
7353
7354 apex {
7355 name: "some-updatable-apex",
7356 key: "some-updatable-apex.key",
7357 java_libs: ["some-updatable-apex-lib"],
7358 updatable: true,
7359 min_sdk_version: "current",
7360 }
7361
7362 apex {
7363 name: "some-non-updatable-apex",
7364 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007365 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007366 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007367 }
7368
7369 apex_key {
7370 name: "some-updatable-apex.key",
7371 }
7372
7373 apex_key {
7374 name: "some-non-updatable-apex.key",
7375 }
7376
7377 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007378 name: "com.android.art.debug",
7379 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007380 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007381 updatable: true,
7382 min_sdk_version: "current",
7383 }
7384
Paul Duffinf23bc472021-04-27 12:42:20 +01007385 bootclasspath_fragment {
7386 name: "art-bootclasspath-fragment",
7387 image_name: "art",
7388 contents: ["some-art-lib"],
7389 apex_available: [
7390 "com.android.art.debug",
7391 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007392 hidden_api: {
7393 split_packages: ["*"],
7394 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007395 }
7396
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007397 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007398 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007399 }
7400
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007401 filegroup {
7402 name: "some-updatable-apex-file_contexts",
7403 srcs: [
7404 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7405 ],
7406 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007407
7408 filegroup {
7409 name: "some-non-updatable-apex-file_contexts",
7410 srcs: [
7411 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7412 ],
7413 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007414 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007415
Paul Duffin89f570a2021-06-16 01:42:33 +01007416 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007417}
7418
Paul Duffin89f570a2021-06-16 01:42:33 +01007419func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007420 t.Helper()
7421
Paul Duffin55607122021-03-30 23:32:51 +01007422 fs := android.MockFS{
7423 "a.java": nil,
7424 "a.jar": nil,
7425 "apex_manifest.json": nil,
7426 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007427 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007428 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7429 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7430 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007431 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007432 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007433
Paul Duffin55607122021-03-30 23:32:51 +01007434 errorHandler := android.FixtureExpectsNoErrors
7435 if errmsg != "" {
7436 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007437 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007438
Paul Duffin55607122021-03-30 23:32:51 +01007439 result := android.GroupFixturePreparers(
7440 cc.PrepareForTestWithCcDefaultModules,
7441 java.PrepareForTestWithHiddenApiBuildComponents,
7442 java.PrepareForTestWithJavaDefaultModules,
7443 java.PrepareForTestWithJavaSdkLibraryFiles,
7444 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007445 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007446 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007447 android.FixtureModifyMockFS(func(fs android.MockFS) {
7448 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7449 insert := ""
7450 for _, fragment := range fragments {
7451 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7452 }
7453 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7454 platform_bootclasspath {
7455 name: "platform-bootclasspath",
7456 fragments: [
7457 %s
7458 ],
7459 }
7460 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007461 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007462 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007463 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007464 ).
7465 ExtendWithErrorHandler(errorHandler).
7466 RunTestWithBp(t, bp)
7467
7468 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007469}
7470
Paul Duffin5556c5f2022-06-09 17:32:21 +00007471func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007472 preparers := android.GroupFixturePreparers(
7473 java.PrepareForTestWithJavaDefaultModules,
7474 PrepareForTestWithApexBuildComponents,
7475 ).
7476 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7477 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7478
7479 bpBase := `
7480 apex_set {
7481 name: "com.android.myapex",
7482 installable: true,
7483 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7484 set: "myapex.apks",
7485 }
7486
7487 apex_set {
7488 name: "com.mycompany.android.myapex",
7489 apex_name: "com.android.myapex",
7490 installable: true,
7491 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7492 set: "company-myapex.apks",
7493 }
7494
7495 prebuilt_bootclasspath_fragment {
7496 name: "my-bootclasspath-fragment",
7497 apex_available: ["com.android.myapex"],
7498 %s
7499 }
7500 `
7501
7502 t.Run("java_import", func(t *testing.T) {
7503 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7504 java_import {
7505 name: "libfoo",
7506 jars: ["libfoo.jar"],
7507 apex_available: ["com.android.myapex"],
7508 }
7509 `)
7510 })
7511
7512 t.Run("java_sdk_library_import", func(t *testing.T) {
7513 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7514 java_sdk_library_import {
7515 name: "libfoo",
7516 public: {
7517 jars: ["libbar.jar"],
7518 },
7519 apex_available: ["com.android.myapex"],
7520 }
7521 `)
7522 })
7523
7524 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7525 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7526 image_name: "art",
7527 contents: ["libfoo"],
7528 `)+`
7529 java_sdk_library_import {
7530 name: "libfoo",
7531 public: {
7532 jars: ["libbar.jar"],
7533 },
7534 apex_available: ["com.android.myapex"],
7535 }
7536 `)
7537 })
7538}
7539
Paul Duffin5556c5f2022-06-09 17:32:21 +00007540func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7541 preparers := android.GroupFixturePreparers(
7542 java.PrepareForTestWithJavaDefaultModules,
7543 PrepareForTestWithApexBuildComponents,
7544 )
7545
7546 bpBase := `
7547 apex_set {
7548 name: "com.android.myapex",
7549 installable: true,
7550 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7551 set: "myapex.apks",
7552 }
7553
7554 apex_set {
7555 name: "com.android.myapex_compressed",
7556 apex_name: "com.android.myapex",
7557 installable: true,
7558 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7559 set: "myapex_compressed.apks",
7560 }
7561
7562 prebuilt_bootclasspath_fragment {
7563 name: "my-bootclasspath-fragment",
7564 apex_available: [
7565 "com.android.myapex",
7566 "com.android.myapex_compressed",
7567 ],
7568 hidden_api: {
7569 annotation_flags: "annotation-flags.csv",
7570 metadata: "metadata.csv",
7571 index: "index.csv",
7572 signature_patterns: "signature_patterns.csv",
7573 },
7574 %s
7575 }
7576 `
7577
7578 t.Run("java_import", func(t *testing.T) {
7579 result := preparers.RunTestWithBp(t,
7580 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7581 java_import {
7582 name: "libfoo",
7583 jars: ["libfoo.jar"],
7584 apex_available: [
7585 "com.android.myapex",
7586 "com.android.myapex_compressed",
7587 ],
7588 }
7589 `)
7590
7591 module := result.Module("libfoo", "android_common_com.android.myapex")
7592 usesLibraryDep := module.(java.UsesLibraryDependency)
7593 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7594 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7595 usesLibraryDep.DexJarBuildPath().Path())
7596 })
7597
7598 t.Run("java_sdk_library_import", func(t *testing.T) {
7599 result := preparers.RunTestWithBp(t,
7600 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
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 module := result.Module("libfoo", "android_common_com.android.myapex")
7615 usesLibraryDep := module.(java.UsesLibraryDependency)
7616 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7617 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7618 usesLibraryDep.DexJarBuildPath().Path())
7619 })
7620
7621 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7622 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7623 image_name: "art",
7624 contents: ["libfoo"],
7625 `)+`
7626 java_sdk_library_import {
7627 name: "libfoo",
7628 public: {
7629 jars: ["libbar.jar"],
7630 },
7631 apex_available: [
7632 "com.android.myapex",
7633 "com.android.myapex_compressed",
7634 ],
7635 compile_dex: true,
7636 }
7637 `)
7638 })
7639}
7640
Jooyung Han548640b2020-04-27 12:10:30 +09007641func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7642 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7643 apex {
7644 name: "myapex",
7645 key: "myapex.key",
7646 updatable: true,
7647 }
7648
7649 apex_key {
7650 name: "myapex.key",
7651 public_key: "testkey.avbpubkey",
7652 private_key: "testkey.pem",
7653 }
7654 `)
7655}
7656
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007657func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7658 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7659 apex {
7660 name: "myapex",
7661 key: "myapex.key",
7662 }
7663
7664 apex_key {
7665 name: "myapex.key",
7666 public_key: "testkey.avbpubkey",
7667 private_key: "testkey.pem",
7668 }
7669 `)
7670}
7671
Daniel Norman69109112021-12-02 12:52:42 -08007672func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7673 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7674 apex {
7675 name: "myapex",
7676 key: "myapex.key",
7677 updatable: true,
7678 soc_specific: true,
7679 }
7680
7681 apex_key {
7682 name: "myapex.key",
7683 public_key: "testkey.avbpubkey",
7684 private_key: "testkey.pem",
7685 }
7686 `)
7687}
7688
satayevb98371c2021-06-15 16:49:50 +01007689func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7690 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7691 apex {
7692 name: "myapex",
7693 key: "myapex.key",
7694 systemserverclasspath_fragments: [
7695 "mysystemserverclasspathfragment",
7696 ],
7697 min_sdk_version: "29",
7698 updatable: true,
7699 }
7700
7701 apex_key {
7702 name: "myapex.key",
7703 public_key: "testkey.avbpubkey",
7704 private_key: "testkey.pem",
7705 }
7706
7707 java_library {
7708 name: "foo",
7709 srcs: ["b.java"],
7710 min_sdk_version: "29",
7711 installable: true,
7712 apex_available: [
7713 "myapex",
7714 ],
7715 }
7716
7717 systemserverclasspath_fragment {
7718 name: "mysystemserverclasspathfragment",
7719 generate_classpaths_proto: false,
7720 contents: [
7721 "foo",
7722 ],
7723 apex_available: [
7724 "myapex",
7725 ],
7726 }
satayevabcd5972021-08-06 17:49:46 +01007727 `,
7728 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7729 )
satayevb98371c2021-06-15 16:49:50 +01007730}
7731
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007732func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007733 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7734 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7735 // modules to be included in the BootJars.
7736 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7737 return android.GroupFixturePreparers(
7738 dexpreopt.FixtureSetBootJars(bootJars...),
7739 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7740 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7741 }),
7742 )
7743 }
7744
7745 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7746 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7747 // specified in the ArtApexJars configuration.
7748 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7749 return android.GroupFixturePreparers(
7750 dexpreopt.FixtureSetArtBootJars(bootJars...),
7751 dexpreopt.FixtureSetBootJars(bootJars...),
7752 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7753 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7754 }),
7755 )
7756 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007757
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007758 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007759 preparer := android.GroupFixturePreparers(
7760 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7761 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7762 )
7763 fragments := []java.ApexVariantReference{
7764 {
7765 Apex: proptools.StringPtr("com.android.art.debug"),
7766 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7767 },
7768 {
7769 Apex: proptools.StringPtr("some-non-updatable-apex"),
7770 Module: proptools.StringPtr("some-non-updatable-fragment"),
7771 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007772 }
satayevabcd5972021-08-06 17:49:46 +01007773 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007774 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007775
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007776 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007777 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7778 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007779 preparer := android.GroupFixturePreparers(
7780 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7781 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7782 )
Paul Duffin60264a02021-04-12 20:02:36 +01007783 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007784 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007785
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007786 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 +01007787 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 +01007788 // Update the dexpreopt ArtApexJars directly.
7789 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7790 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007791 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007792
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007793 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 +01007794 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 +01007795 // Update the dexpreopt ArtApexJars directly.
7796 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7797 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007798 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007799
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007800 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 +01007801 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 +01007802 preparer := android.GroupFixturePreparers(
7803 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7804 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7805 )
Paul Duffin60264a02021-04-12 20:02:36 +01007806 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007807 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007809 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 +01007810 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007811 fragment := java.ApexVariantReference{
7812 Apex: proptools.StringPtr("some-non-updatable-apex"),
7813 Module: proptools.StringPtr("some-non-updatable-fragment"),
7814 }
7815 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007816 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007817
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007818 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007819 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007820 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7821 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007822 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007823
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007824 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007825 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007826 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7827 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007828 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007829
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007830 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007831 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007832 // Update the dexpreopt ArtApexJars directly.
7833 preparer := prepareSetArtJars("platform:some-platform-lib")
7834 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007835 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007836
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007837 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007838 preparer := android.GroupFixturePreparers(
7839 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7840 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7841 )
7842 fragments := []java.ApexVariantReference{
7843 {
7844 Apex: proptools.StringPtr("some-non-updatable-apex"),
7845 Module: proptools.StringPtr("some-non-updatable-fragment"),
7846 },
7847 }
7848 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007849 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007850}
7851
7852func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007853 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007854 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007855 fragment := java.ApexVariantReference{
7856 Apex: proptools.StringPtr("myapex"),
7857 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7858 }
7859
Paul Duffin064b70c2020-11-02 17:32:38 +00007860 testDexpreoptWithApexes(t, `
7861 prebuilt_apex {
7862 name: "myapex" ,
7863 arch: {
7864 arm64: {
7865 src: "myapex-arm64.apex",
7866 },
7867 arm: {
7868 src: "myapex-arm.apex",
7869 },
7870 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007871 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7872 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007873
Paul Duffin89f570a2021-06-16 01:42:33 +01007874 prebuilt_bootclasspath_fragment {
7875 name: "my-bootclasspath-fragment",
7876 contents: ["libfoo"],
7877 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007878 hidden_api: {
7879 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7880 metadata: "my-bootclasspath-fragment/metadata.csv",
7881 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007882 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7883 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7884 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007885 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007886 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007887
Paul Duffin89f570a2021-06-16 01:42:33 +01007888 java_import {
7889 name: "libfoo",
7890 jars: ["libfoo.jar"],
7891 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007892 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007893 }
7894 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007895 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007896}
7897
Spandan Dasf14e2542021-11-12 00:01:37 +00007898func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007899 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007900 bp += `
7901 apex_key {
7902 name: "myapex.key",
7903 public_key: "testkey.avbpubkey",
7904 private_key: "testkey.pem",
7905 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007906 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007907 "lib1/src/A.java": nil,
7908 "lib2/src/B.java": nil,
7909 "system/sepolicy/apex/myapex-file_contexts": nil,
7910 }
7911
Paul Duffin45338f02021-03-30 23:07:52 +01007912 errorHandler := android.FixtureExpectsNoErrors
7913 if errmsg != "" {
7914 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007915 }
Colin Crossae8600b2020-10-29 17:09:13 -07007916
Paul Duffin45338f02021-03-30 23:07:52 +01007917 android.GroupFixturePreparers(
7918 android.PrepareForTestWithAndroidBuildComponents,
7919 java.PrepareForTestWithJavaBuildComponents,
7920 PrepareForTestWithApexBuildComponents,
7921 android.PrepareForTestWithNeverallowRules(rules),
7922 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007923 apexBootJars := make([]string, 0, len(bootJars))
7924 for _, apexBootJar := range bootJars {
7925 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007926 }
satayevd604b212021-07-21 14:23:52 +01007927 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007928 }),
7929 fs.AddToFixture(),
7930 ).
7931 ExtendWithErrorHandler(errorHandler).
7932 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007933}
7934
7935func TestApexPermittedPackagesRules(t *testing.T) {
7936 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007937 name string
7938 expectedError string
7939 bp string
7940 bootJars []string
7941 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007942 }{
7943
7944 {
7945 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7946 expectedError: "",
7947 bp: `
7948 java_library {
7949 name: "bcp_lib1",
7950 srcs: ["lib1/src/*.java"],
7951 permitted_packages: ["foo.bar"],
7952 apex_available: ["myapex"],
7953 sdk_version: "none",
7954 system_modules: "none",
7955 }
7956 java_library {
7957 name: "nonbcp_lib2",
7958 srcs: ["lib2/src/*.java"],
7959 apex_available: ["myapex"],
7960 permitted_packages: ["a.b"],
7961 sdk_version: "none",
7962 system_modules: "none",
7963 }
7964 apex {
7965 name: "myapex",
7966 key: "myapex.key",
7967 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007968 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007969 }`,
7970 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007971 bcpPermittedPackages: map[string][]string{
7972 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007973 "foo.bar",
7974 },
7975 },
7976 },
7977 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007978 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007979 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 +01007980 bp: `
7981 java_library {
7982 name: "bcp_lib1",
7983 srcs: ["lib1/src/*.java"],
7984 apex_available: ["myapex"],
7985 permitted_packages: ["foo.bar"],
7986 sdk_version: "none",
7987 system_modules: "none",
7988 }
7989 java_library {
7990 name: "bcp_lib2",
7991 srcs: ["lib2/src/*.java"],
7992 apex_available: ["myapex"],
7993 permitted_packages: ["foo.bar", "bar.baz"],
7994 sdk_version: "none",
7995 system_modules: "none",
7996 }
7997 apex {
7998 name: "myapex",
7999 key: "myapex.key",
8000 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008001 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008002 }
8003 `,
8004 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008005 bcpPermittedPackages: map[string][]string{
8006 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008007 "foo.bar",
8008 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008009 "bcp_lib2": []string{
8010 "foo.bar",
8011 },
8012 },
8013 },
8014 {
8015 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8016 expectedError: "",
8017 bp: `
8018 java_library {
8019 name: "bcp_lib_restricted",
8020 srcs: ["lib1/src/*.java"],
8021 apex_available: ["myapex"],
8022 permitted_packages: ["foo.bar"],
8023 sdk_version: "none",
8024 min_sdk_version: "29",
8025 system_modules: "none",
8026 }
8027 java_library {
8028 name: "bcp_lib_unrestricted",
8029 srcs: ["lib2/src/*.java"],
8030 apex_available: ["myapex"],
8031 permitted_packages: ["foo.bar", "bar.baz"],
8032 sdk_version: "none",
8033 min_sdk_version: "29",
8034 system_modules: "none",
8035 }
8036 apex {
8037 name: "myapex",
8038 key: "myapex.key",
8039 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8040 updatable: true,
8041 min_sdk_version: "29",
8042 }
8043 `,
8044 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8045 bcpPermittedPackages: map[string][]string{
8046 "bcp_lib1_non_updateable": []string{
8047 "foo.bar",
8048 },
8049 // 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 +01008050 },
8051 },
8052 }
8053 for _, tc := range testcases {
8054 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008055 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8056 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008057 })
8058 }
8059}
8060
Jiyong Park62304bb2020-04-13 16:19:48 +09008061func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008062 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008063 apex {
8064 name: "myapex",
8065 key: "myapex.key",
8066 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008067 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008068 }
8069
8070 apex_key {
8071 name: "myapex.key",
8072 public_key: "testkey.avbpubkey",
8073 private_key: "testkey.pem",
8074 }
8075
8076 cc_library {
8077 name: "mylib",
8078 srcs: ["mylib.cpp"],
8079 system_shared_libs: [],
8080 stl: "none",
8081 stubs: {
8082 versions: ["1"],
8083 },
8084 apex_available: ["myapex"],
8085 }
8086
8087 cc_library {
8088 name: "myprivlib",
8089 srcs: ["mylib.cpp"],
8090 system_shared_libs: [],
8091 stl: "none",
8092 apex_available: ["myapex"],
8093 }
8094
8095
8096 cc_test {
8097 name: "mytest",
8098 gtest: false,
8099 srcs: ["mylib.cpp"],
8100 system_shared_libs: [],
8101 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008102 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008103 test_for: ["myapex"]
8104 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008105
8106 cc_library {
8107 name: "mytestlib",
8108 srcs: ["mylib.cpp"],
8109 system_shared_libs: [],
8110 shared_libs: ["mylib", "myprivlib"],
8111 stl: "none",
8112 test_for: ["myapex"],
8113 }
8114
8115 cc_benchmark {
8116 name: "mybench",
8117 srcs: ["mylib.cpp"],
8118 system_shared_libs: [],
8119 shared_libs: ["mylib", "myprivlib"],
8120 stl: "none",
8121 test_for: ["myapex"],
8122 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008123 `)
8124
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008125 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008126 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008127 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8128 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8129 }
8130
8131 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008132 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008133 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8134 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8135 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8136}
Jiyong Park46a512f2020-12-04 18:02:13 +09008137
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008138func TestIndirectTestFor(t *testing.T) {
8139 ctx := testApex(t, `
8140 apex {
8141 name: "myapex",
8142 key: "myapex.key",
8143 native_shared_libs: ["mylib", "myprivlib"],
8144 updatable: false,
8145 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008146
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008147 apex_key {
8148 name: "myapex.key",
8149 public_key: "testkey.avbpubkey",
8150 private_key: "testkey.pem",
8151 }
8152
8153 cc_library {
8154 name: "mylib",
8155 srcs: ["mylib.cpp"],
8156 system_shared_libs: [],
8157 stl: "none",
8158 stubs: {
8159 versions: ["1"],
8160 },
8161 apex_available: ["myapex"],
8162 }
8163
8164 cc_library {
8165 name: "myprivlib",
8166 srcs: ["mylib.cpp"],
8167 system_shared_libs: [],
8168 stl: "none",
8169 shared_libs: ["mylib"],
8170 apex_available: ["myapex"],
8171 }
8172
8173 cc_library {
8174 name: "mytestlib",
8175 srcs: ["mylib.cpp"],
8176 system_shared_libs: [],
8177 shared_libs: ["myprivlib"],
8178 stl: "none",
8179 test_for: ["myapex"],
8180 }
8181 `)
8182
8183 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008184 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008185 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8186 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8187 }
8188
8189 // The platform variant of mytestlib links to the platform variant of the
8190 // internal myprivlib.
8191 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8192
8193 // The platform variant of myprivlib links to the platform variant of mylib
8194 // and bypasses its stubs.
8195 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 +09008196}
8197
Martin Stjernholmec009002021-03-27 15:18:31 +00008198func TestTestForForLibInOtherApex(t *testing.T) {
8199 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8200 _ = testApex(t, `
8201 apex {
8202 name: "com.android.art",
8203 key: "myapex.key",
8204 native_shared_libs: ["mylib"],
8205 updatable: false,
8206 }
8207
8208 apex {
8209 name: "com.android.art.debug",
8210 key: "myapex.key",
8211 native_shared_libs: ["mylib", "mytestlib"],
8212 updatable: false,
8213 }
8214
8215 apex_key {
8216 name: "myapex.key",
8217 public_key: "testkey.avbpubkey",
8218 private_key: "testkey.pem",
8219 }
8220
8221 cc_library {
8222 name: "mylib",
8223 srcs: ["mylib.cpp"],
8224 system_shared_libs: [],
8225 stl: "none",
8226 stubs: {
8227 versions: ["1"],
8228 },
8229 apex_available: ["com.android.art", "com.android.art.debug"],
8230 }
8231
8232 cc_library {
8233 name: "mytestlib",
8234 srcs: ["mylib.cpp"],
8235 system_shared_libs: [],
8236 shared_libs: ["mylib"],
8237 stl: "none",
8238 apex_available: ["com.android.art.debug"],
8239 test_for: ["com.android.art"],
8240 }
8241 `,
8242 android.MockFS{
8243 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8244 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8245 }.AddToFixture())
8246}
8247
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008248// TODO(jungjw): Move this to proptools
8249func intPtr(i int) *int {
8250 return &i
8251}
8252
8253func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008254 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008255 apex_set {
8256 name: "myapex",
8257 set: "myapex.apks",
8258 filename: "foo_v2.apex",
8259 overrides: ["foo"],
8260 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008261 `,
8262 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8263 variables.Platform_sdk_version = intPtr(30)
8264 }),
8265 android.FixtureModifyConfig(func(config android.Config) {
8266 config.Targets[android.Android] = []android.Target{
8267 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8268 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8269 }
8270 }),
8271 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008272
Paul Duffin24704672021-04-06 16:09:30 +01008273 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008274
8275 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008276 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008277 actual := extractedApex.Args["abis"]
8278 expected := "ARMEABI_V7A,ARM64_V8A"
8279 if actual != expected {
8280 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8281 }
8282 actual = extractedApex.Args["sdk-version"]
8283 expected = "30"
8284 if actual != expected {
8285 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8286 }
8287
Paul Duffin6717d882021-06-15 19:09:41 +01008288 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008289 a := m.Module().(*ApexSet)
8290 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008291 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008292 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8293 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8294 }
8295}
8296
Jiyong Park7d95a512020-05-10 15:16:24 +09008297func TestNoStaticLinkingToStubsLib(t *testing.T) {
8298 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8299 apex {
8300 name: "myapex",
8301 key: "myapex.key",
8302 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008303 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008304 }
8305
8306 apex_key {
8307 name: "myapex.key",
8308 public_key: "testkey.avbpubkey",
8309 private_key: "testkey.pem",
8310 }
8311
8312 cc_library {
8313 name: "mylib",
8314 srcs: ["mylib.cpp"],
8315 static_libs: ["otherlib"],
8316 system_shared_libs: [],
8317 stl: "none",
8318 apex_available: [ "myapex" ],
8319 }
8320
8321 cc_library {
8322 name: "otherlib",
8323 srcs: ["mylib.cpp"],
8324 system_shared_libs: [],
8325 stl: "none",
8326 stubs: {
8327 versions: ["1", "2", "3"],
8328 },
8329 apex_available: [ "myapex" ],
8330 }
8331 `)
8332}
8333
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008334func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008335 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008336 apex {
8337 name: "myapex",
8338 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008339 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008340 custom_sign_tool: "sign_myapex",
8341 }
8342
8343 apex_key {
8344 name: "myapex.key",
8345 public_key: "testkey.avbpubkey",
8346 private_key: "testkey.pem",
8347 }
8348 `)
8349
8350 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8351 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8352 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"`)
8353}
8354
8355func TestApexKeysTxtOverrides(t *testing.T) {
8356 ctx := testApex(t, `
8357 apex {
8358 name: "myapex",
8359 key: "myapex.key",
8360 updatable: false,
8361 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008362 }
8363
8364 apex_key {
8365 name: "myapex.key",
8366 public_key: "testkey.avbpubkey",
8367 private_key: "testkey.pem",
8368 }
8369
8370 prebuilt_apex {
8371 name: "myapex",
8372 prefer: true,
8373 arch: {
8374 arm64: {
8375 src: "myapex-arm64.apex",
8376 },
8377 arm: {
8378 src: "myapex-arm.apex",
8379 },
8380 },
8381 }
8382
8383 apex_set {
8384 name: "myapex_set",
8385 set: "myapex.apks",
8386 filename: "myapex_set.apex",
8387 overrides: ["myapex"],
8388 }
8389 `)
8390
8391 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8392 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8393 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 +09008394 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 +09008395}
8396
Jooyung Han938b5932020-06-20 12:47:47 +09008397func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008398 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008399 apex {
8400 name: "myapex",
8401 key: "myapex.key",
8402 apps: ["app"],
8403 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008404 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008405 }
8406
8407 apex_key {
8408 name: "myapex.key",
8409 public_key: "testkey.avbpubkey",
8410 private_key: "testkey.pem",
8411 }
8412
8413 android_app {
8414 name: "app",
8415 srcs: ["foo/bar/MyClass.java"],
8416 package_name: "foo",
8417 sdk_version: "none",
8418 system_modules: "none",
8419 apex_available: [ "myapex" ],
8420 }
8421 `, withFiles(map[string][]byte{
8422 "sub/Android.bp": []byte(`
8423 override_apex {
8424 name: "override_myapex",
8425 base: "myapex",
8426 apps: ["override_app"],
8427 allowed_files: ":allowed",
8428 }
8429 // Overridable "path" property should be referenced indirectly
8430 filegroup {
8431 name: "allowed",
8432 srcs: ["allowed.txt"],
8433 }
8434 override_android_app {
8435 name: "override_app",
8436 base: "app",
8437 package_name: "bar",
8438 }
8439 `),
8440 }))
8441
8442 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8443 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8444 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8445 }
8446
8447 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8448 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8449 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8450 }
8451}
8452
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008453func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008454 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008455 apex {
8456 name: "myapex",
8457 key: "myapex.key",
8458 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008459 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008460 }
8461
8462 apex_key {
8463 name: "myapex.key",
8464 public_key: "testkey.avbpubkey",
8465 private_key: "testkey.pem",
8466 }
8467
8468 cc_library {
8469 name: "mylib",
8470 srcs: ["mylib.cpp"],
8471 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008472 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008473 },
8474 apex_available: ["myapex"],
8475 }
8476
8477 cc_prebuilt_library_shared {
8478 name: "mylib",
8479 prefer: false,
8480 srcs: ["prebuilt.so"],
8481 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008482 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008483 },
8484 apex_available: ["myapex"],
8485 }
8486 `)
8487}
8488
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008489func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008490 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008491 apex {
8492 name: "myapex",
8493 key: "myapex.key",
8494 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008495 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008496 }
8497 apex_key {
8498 name: "myapex.key",
8499 public_key: "testkey.avbpubkey",
8500 private_key: "testkey.pem",
8501 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008502 `,
8503 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8504 variables.CompressedApex = proptools.BoolPtr(true)
8505 }),
8506 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008507
8508 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8509 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8510
8511 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8512 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8513
8514 // Make sure output of bundle is .capex
8515 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8516 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8517
8518 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008519 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008520 var builder strings.Builder
8521 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8522 androidMk := builder.String()
8523 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8524}
8525
Martin Stjernholm2856c662020-12-02 15:03:42 +00008526func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008527 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008528 apex {
8529 name: "myapex",
8530 key: "myapex.key",
8531 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008532 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008533 }
8534
8535 apex_key {
8536 name: "myapex.key",
8537 public_key: "testkey.avbpubkey",
8538 private_key: "testkey.pem",
8539 }
8540
8541 cc_library {
8542 name: "mylib",
8543 srcs: ["mylib.cpp"],
8544 apex_available: ["myapex"],
8545 shared_libs: ["otherlib"],
8546 system_shared_libs: [],
8547 }
8548
8549 cc_library {
8550 name: "otherlib",
8551 srcs: ["mylib.cpp"],
8552 stubs: {
8553 versions: ["current"],
8554 },
8555 }
8556
8557 cc_prebuilt_library_shared {
8558 name: "otherlib",
8559 prefer: true,
8560 srcs: ["prebuilt.so"],
8561 stubs: {
8562 versions: ["current"],
8563 },
8564 }
8565 `)
8566
8567 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008568 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008569 var builder strings.Builder
8570 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8571 androidMk := builder.String()
8572
8573 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8574 // a thing there.
8575 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8576}
8577
Jiyong Parke3867542020-12-03 17:28:25 +09008578func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008579 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008580 apex {
8581 name: "myapex",
8582 key: "myapex.key",
8583 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008584 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008585 }
8586
8587 apex_key {
8588 name: "myapex.key",
8589 public_key: "testkey.avbpubkey",
8590 private_key: "testkey.pem",
8591 }
8592
8593 cc_library {
8594 name: "mylib",
8595 srcs: ["mylib.cpp"],
8596 system_shared_libs: [],
8597 stl: "none",
8598 apex_available: ["myapex"],
8599 shared_libs: ["mylib2"],
8600 target: {
8601 apex: {
8602 exclude_shared_libs: ["mylib2"],
8603 },
8604 },
8605 }
8606
8607 cc_library {
8608 name: "mylib2",
8609 srcs: ["mylib.cpp"],
8610 system_shared_libs: [],
8611 stl: "none",
8612 }
8613 `)
8614
8615 // Check if mylib is linked to mylib2 for the non-apex target
8616 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8617 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8618
8619 // Make sure that the link doesn't occur for the apex target
8620 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8621 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8622
8623 // It shouldn't appear in the copy cmd as well.
8624 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8625 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8626}
8627
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008628func TestPrebuiltStubLibDep(t *testing.T) {
8629 bpBase := `
8630 apex {
8631 name: "myapex",
8632 key: "myapex.key",
8633 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008634 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008635 }
8636 apex_key {
8637 name: "myapex.key",
8638 public_key: "testkey.avbpubkey",
8639 private_key: "testkey.pem",
8640 }
8641 cc_library {
8642 name: "mylib",
8643 srcs: ["mylib.cpp"],
8644 apex_available: ["myapex"],
8645 shared_libs: ["stublib"],
8646 system_shared_libs: [],
8647 }
8648 apex {
8649 name: "otherapex",
8650 enabled: %s,
8651 key: "myapex.key",
8652 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008653 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008654 }
8655 `
8656
8657 stublibSourceBp := `
8658 cc_library {
8659 name: "stublib",
8660 srcs: ["mylib.cpp"],
8661 apex_available: ["otherapex"],
8662 system_shared_libs: [],
8663 stl: "none",
8664 stubs: {
8665 versions: ["1"],
8666 },
8667 }
8668 `
8669
8670 stublibPrebuiltBp := `
8671 cc_prebuilt_library_shared {
8672 name: "stublib",
8673 srcs: ["prebuilt.so"],
8674 apex_available: ["otherapex"],
8675 stubs: {
8676 versions: ["1"],
8677 },
8678 %s
8679 }
8680 `
8681
8682 tests := []struct {
8683 name string
8684 stublibBp string
8685 usePrebuilt bool
8686 modNames []string // Modules to collect AndroidMkEntries for
8687 otherApexEnabled []string
8688 }{
8689 {
8690 name: "only_source",
8691 stublibBp: stublibSourceBp,
8692 usePrebuilt: false,
8693 modNames: []string{"stublib"},
8694 otherApexEnabled: []string{"true", "false"},
8695 },
8696 {
8697 name: "source_preferred",
8698 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8699 usePrebuilt: false,
8700 modNames: []string{"stublib", "prebuilt_stublib"},
8701 otherApexEnabled: []string{"true", "false"},
8702 },
8703 {
8704 name: "prebuilt_preferred",
8705 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8706 usePrebuilt: true,
8707 modNames: []string{"stublib", "prebuilt_stublib"},
8708 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8709 },
8710 {
8711 name: "only_prebuilt",
8712 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8713 usePrebuilt: true,
8714 modNames: []string{"stublib"},
8715 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8716 },
8717 }
8718
8719 for _, test := range tests {
8720 t.Run(test.name, func(t *testing.T) {
8721 for _, otherApexEnabled := range test.otherApexEnabled {
8722 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008723 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008724
8725 type modAndMkEntries struct {
8726 mod *cc.Module
8727 mkEntries android.AndroidMkEntries
8728 }
8729 entries := []*modAndMkEntries{}
8730
8731 // Gather shared lib modules that are installable
8732 for _, modName := range test.modNames {
8733 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8734 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8735 continue
8736 }
8737 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008738 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008739 continue
8740 }
Colin Crossaa255532020-07-03 13:18:24 -07008741 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008742 if ent.Disabled {
8743 continue
8744 }
8745 entries = append(entries, &modAndMkEntries{
8746 mod: mod,
8747 mkEntries: ent,
8748 })
8749 }
8750 }
8751 }
8752
8753 var entry *modAndMkEntries = nil
8754 for _, ent := range entries {
8755 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8756 if entry != nil {
8757 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8758 } else {
8759 entry = ent
8760 }
8761 }
8762 }
8763
8764 if entry == nil {
8765 t.Errorf("AndroidMk entry for \"stublib\" missing")
8766 } else {
8767 isPrebuilt := entry.mod.Prebuilt() != nil
8768 if isPrebuilt != test.usePrebuilt {
8769 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8770 }
8771 if !entry.mod.IsStubs() {
8772 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8773 }
8774 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8775 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8776 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008777 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008778 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008779 if !android.InList(expected, cflags) {
8780 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8781 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008782 }
8783 })
8784 }
8785 })
8786 }
8787}
8788
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008789func TestHostApexInHostOnlyBuild(t *testing.T) {
8790 testApex(t, `
8791 apex {
8792 name: "myapex",
8793 host_supported: true,
8794 key: "myapex.key",
8795 updatable: false,
8796 payload_type: "zip",
8797 }
8798 apex_key {
8799 name: "myapex.key",
8800 public_key: "testkey.avbpubkey",
8801 private_key: "testkey.pem",
8802 }
8803 `,
8804 android.FixtureModifyConfig(func(config android.Config) {
8805 // We may not have device targets in all builds, e.g. in
8806 // prebuilts/build-tools/build-prebuilts.sh
8807 config.Targets[android.Android] = []android.Target{}
8808 }))
8809}
8810
Colin Crossc33e5212021-05-25 18:16:02 -07008811func TestApexJavaCoverage(t *testing.T) {
8812 bp := `
8813 apex {
8814 name: "myapex",
8815 key: "myapex.key",
8816 java_libs: ["mylib"],
8817 bootclasspath_fragments: ["mybootclasspathfragment"],
8818 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8819 updatable: false,
8820 }
8821
8822 apex_key {
8823 name: "myapex.key",
8824 public_key: "testkey.avbpubkey",
8825 private_key: "testkey.pem",
8826 }
8827
8828 java_library {
8829 name: "mylib",
8830 srcs: ["mylib.java"],
8831 apex_available: ["myapex"],
8832 compile_dex: true,
8833 }
8834
8835 bootclasspath_fragment {
8836 name: "mybootclasspathfragment",
8837 contents: ["mybootclasspathlib"],
8838 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008839 hidden_api: {
8840 split_packages: ["*"],
8841 },
Colin Crossc33e5212021-05-25 18:16:02 -07008842 }
8843
8844 java_library {
8845 name: "mybootclasspathlib",
8846 srcs: ["mybootclasspathlib.java"],
8847 apex_available: ["myapex"],
8848 compile_dex: true,
8849 }
8850
8851 systemserverclasspath_fragment {
8852 name: "mysystemserverclasspathfragment",
8853 contents: ["mysystemserverclasspathlib"],
8854 apex_available: ["myapex"],
8855 }
8856
8857 java_library {
8858 name: "mysystemserverclasspathlib",
8859 srcs: ["mysystemserverclasspathlib.java"],
8860 apex_available: ["myapex"],
8861 compile_dex: true,
8862 }
8863 `
8864
8865 result := android.GroupFixturePreparers(
8866 PrepareForTestWithApexBuildComponents,
8867 prepareForTestWithMyapex,
8868 java.PrepareForTestWithJavaDefaultModules,
8869 android.PrepareForTestWithAndroidBuildComponents,
8870 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008871 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8872 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008873 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008874 ).RunTest(t)
8875
8876 // Make sure jacoco ran on both mylib and mybootclasspathlib
8877 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8878 t.Errorf("Failed to find jacoco rule for mylib")
8879 }
8880 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8881 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8882 }
8883 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8884 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8885 }
8886}
8887
Jiyong Park192600a2021-08-03 07:52:17 +00008888func TestProhibitStaticExecutable(t *testing.T) {
8889 testApexError(t, `executable mybin is static`, `
8890 apex {
8891 name: "myapex",
8892 key: "myapex.key",
8893 binaries: ["mybin"],
8894 min_sdk_version: "29",
8895 }
8896
8897 apex_key {
8898 name: "myapex.key",
8899 public_key: "testkey.avbpubkey",
8900 private_key: "testkey.pem",
8901 }
8902
8903 cc_binary {
8904 name: "mybin",
8905 srcs: ["mylib.cpp"],
8906 relative_install_path: "foo/bar",
8907 static_executable: true,
8908 system_shared_libs: [],
8909 stl: "none",
8910 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008911 min_sdk_version: "29",
8912 }
8913 `)
8914
8915 testApexError(t, `executable mybin.rust is static`, `
8916 apex {
8917 name: "myapex",
8918 key: "myapex.key",
8919 binaries: ["mybin.rust"],
8920 min_sdk_version: "29",
8921 }
8922
8923 apex_key {
8924 name: "myapex.key",
8925 public_key: "testkey.avbpubkey",
8926 private_key: "testkey.pem",
8927 }
8928
8929 rust_binary {
8930 name: "mybin.rust",
8931 srcs: ["foo.rs"],
8932 static_executable: true,
8933 apex_available: ["myapex"],
8934 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008935 }
8936 `)
8937}
8938
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008939func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8940 ctx := testApex(t, `
8941 apex {
8942 name: "myapex",
8943 key: "myapex.key",
8944 updatable: false,
8945 java_libs: ["foo"],
8946 }
8947
8948 apex_key {
8949 name: "myapex.key",
8950 public_key: "testkey.avbpubkey",
8951 private_key: "testkey.pem",
8952 }
8953
8954 java_library {
8955 name: "foo",
8956 srcs: ["foo.java"],
8957 apex_available: ["myapex"],
8958 installable: true,
8959 }
8960 `,
8961 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8962 )
8963
8964 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8965 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8966 var builder strings.Builder
8967 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8968 androidMk := builder.String()
8969 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")
8970}
8971
8972func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8973 ctx := testApex(t, `
8974 prebuilt_apex {
8975 name: "myapex",
8976 arch: {
8977 arm64: {
8978 src: "myapex-arm64.apex",
8979 },
8980 arm: {
8981 src: "myapex-arm.apex",
8982 },
8983 },
8984 exported_java_libs: ["foo"],
8985 }
8986
8987 java_import {
8988 name: "foo",
8989 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008990 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008991 }
8992 `,
8993 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8994 )
8995
8996 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8997 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8998 mainModuleEntries := entriesList[0]
8999 android.AssertArrayString(t,
9000 "LOCAL_REQUIRED_MODULES",
9001 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9002 []string{
9003 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9004 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9005 })
9006}
9007
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009008func TestAndroidMk_RequiredModules(t *testing.T) {
9009 ctx := testApex(t, `
9010 apex {
9011 name: "myapex",
9012 key: "myapex.key",
9013 updatable: false,
9014 java_libs: ["foo"],
9015 required: ["otherapex"],
9016 }
9017
9018 apex {
9019 name: "otherapex",
9020 key: "myapex.key",
9021 updatable: false,
9022 java_libs: ["foo"],
9023 required: ["otherapex"],
9024 }
9025
9026 apex_key {
9027 name: "myapex.key",
9028 public_key: "testkey.avbpubkey",
9029 private_key: "testkey.pem",
9030 }
9031
9032 java_library {
9033 name: "foo",
9034 srcs: ["foo.java"],
9035 apex_available: ["myapex", "otherapex"],
9036 installable: true,
9037 }
9038 `)
9039
9040 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9041 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9042 var builder strings.Builder
9043 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9044 androidMk := builder.String()
9045 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9046}
9047
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009048func TestAndroidMk_RequiredDeps(t *testing.T) {
9049 ctx := testApex(t, `
9050 apex {
9051 name: "myapex",
9052 key: "myapex.key",
9053 updatable: false,
9054 }
9055
9056 apex_key {
9057 name: "myapex.key",
9058 public_key: "testkey.avbpubkey",
9059 private_key: "testkey.pem",
9060 }
9061 `)
9062
9063 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9064 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9065 data := android.AndroidMkDataForTest(t, ctx, bundle)
9066 var builder strings.Builder
9067 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9068 androidMk := builder.String()
9069 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9070
9071 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9072 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9073 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9074 var flattenedBuilder strings.Builder
9075 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9076 flattenedAndroidMk := flattenedBuilder.String()
9077 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9078}
9079
Jooyung Hana6d36672022-02-24 13:58:07 +09009080func TestApexOutputFileProducer(t *testing.T) {
9081 for _, tc := range []struct {
9082 name string
9083 ref string
9084 expected_data []string
9085 }{
9086 {
9087 name: "test_using_output",
9088 ref: ":myapex",
9089 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9090 },
9091 {
9092 name: "test_using_apex",
9093 ref: ":myapex{.apex}",
9094 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9095 },
9096 } {
9097 t.Run(tc.name, func(t *testing.T) {
9098 ctx := testApex(t, `
9099 apex {
9100 name: "myapex",
9101 key: "myapex.key",
9102 compressible: true,
9103 updatable: false,
9104 }
9105
9106 apex_key {
9107 name: "myapex.key",
9108 public_key: "testkey.avbpubkey",
9109 private_key: "testkey.pem",
9110 }
9111
9112 java_test {
9113 name: "`+tc.name+`",
9114 srcs: ["a.java"],
9115 data: ["`+tc.ref+`"],
9116 }
9117 `,
9118 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9119 variables.CompressedApex = proptools.BoolPtr(true)
9120 }))
9121 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9122 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9123 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9124 })
9125 }
9126}
9127
satayev758968a2021-12-06 11:42:40 +00009128func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9129 preparer := android.GroupFixturePreparers(
9130 PrepareForTestWithApexBuildComponents,
9131 prepareForTestWithMyapex,
9132 java.PrepareForTestWithJavaSdkLibraryFiles,
9133 java.PrepareForTestWithJavaDefaultModules,
9134 android.PrepareForTestWithAndroidBuildComponents,
9135 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9136 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9137 )
9138
9139 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9140 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9141 preparer.RunTestWithBp(t, `
9142 apex {
9143 name: "myapex",
9144 key: "myapex.key",
9145 bootclasspath_fragments: ["mybootclasspathfragment"],
9146 min_sdk_version: "30",
9147 updatable: false,
9148 }
9149
9150 apex_key {
9151 name: "myapex.key",
9152 public_key: "testkey.avbpubkey",
9153 private_key: "testkey.pem",
9154 }
9155
9156 bootclasspath_fragment {
9157 name: "mybootclasspathfragment",
9158 contents: ["mybootclasspathlib"],
9159 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009160 hidden_api: {
9161 split_packages: ["*"],
9162 },
satayev758968a2021-12-06 11:42:40 +00009163 }
9164
9165 java_sdk_library {
9166 name: "mybootclasspathlib",
9167 srcs: ["mybootclasspathlib.java"],
9168 apex_available: ["myapex"],
9169 compile_dex: true,
9170 unsafe_ignore_missing_latest_api: true,
9171 min_sdk_version: "31",
9172 static_libs: ["util"],
9173 }
9174
9175 java_library {
9176 name: "util",
9177 srcs: ["a.java"],
9178 apex_available: ["myapex"],
9179 min_sdk_version: "31",
9180 static_libs: ["another_util"],
9181 }
9182
9183 java_library {
9184 name: "another_util",
9185 srcs: ["a.java"],
9186 min_sdk_version: "31",
9187 apex_available: ["myapex"],
9188 }
9189 `)
9190 })
9191
9192 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9193 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9194 preparer.RunTestWithBp(t, `
9195 apex {
9196 name: "myapex",
9197 key: "myapex.key",
9198 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9199 min_sdk_version: "30",
9200 updatable: false,
9201 }
9202
9203 apex_key {
9204 name: "myapex.key",
9205 public_key: "testkey.avbpubkey",
9206 private_key: "testkey.pem",
9207 }
9208
9209 systemserverclasspath_fragment {
9210 name: "mysystemserverclasspathfragment",
9211 contents: ["mysystemserverclasspathlib"],
9212 apex_available: ["myapex"],
9213 }
9214
9215 java_sdk_library {
9216 name: "mysystemserverclasspathlib",
9217 srcs: ["mysystemserverclasspathlib.java"],
9218 apex_available: ["myapex"],
9219 compile_dex: true,
9220 min_sdk_version: "32",
9221 unsafe_ignore_missing_latest_api: true,
9222 static_libs: ["util"],
9223 }
9224
9225 java_library {
9226 name: "util",
9227 srcs: ["a.java"],
9228 apex_available: ["myapex"],
9229 min_sdk_version: "31",
9230 static_libs: ["another_util"],
9231 }
9232
9233 java_library {
9234 name: "another_util",
9235 srcs: ["a.java"],
9236 min_sdk_version: "31",
9237 apex_available: ["myapex"],
9238 }
9239 `)
9240 })
9241
9242 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9243 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9244 RunTestWithBp(t, `
9245 apex {
9246 name: "myapex",
9247 key: "myapex.key",
9248 bootclasspath_fragments: ["mybootclasspathfragment"],
9249 min_sdk_version: "30",
9250 updatable: false,
9251 }
9252
9253 apex_key {
9254 name: "myapex.key",
9255 public_key: "testkey.avbpubkey",
9256 private_key: "testkey.pem",
9257 }
9258
9259 bootclasspath_fragment {
9260 name: "mybootclasspathfragment",
9261 contents: ["mybootclasspathlib"],
9262 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009263 hidden_api: {
9264 split_packages: ["*"],
9265 },
satayev758968a2021-12-06 11:42:40 +00009266 }
9267
9268 java_sdk_library {
9269 name: "mybootclasspathlib",
9270 srcs: ["mybootclasspathlib.java"],
9271 apex_available: ["myapex"],
9272 compile_dex: true,
9273 unsafe_ignore_missing_latest_api: true,
9274 }
9275 `)
9276 })
9277
9278 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9279 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9280 RunTestWithBp(t, `
9281 apex {
9282 name: "myapex",
9283 key: "myapex.key",
9284 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9285 min_sdk_version: "30",
9286 updatable: false,
9287 }
9288
9289 apex_key {
9290 name: "myapex.key",
9291 public_key: "testkey.avbpubkey",
9292 private_key: "testkey.pem",
9293 }
9294
9295 systemserverclasspath_fragment {
9296 name: "mysystemserverclasspathfragment",
9297 contents: ["mysystemserverclasspathlib"],
9298 apex_available: ["myapex"],
9299 }
9300
9301 java_sdk_library {
9302 name: "mysystemserverclasspathlib",
9303 srcs: ["mysystemserverclasspathlib.java"],
9304 apex_available: ["myapex"],
9305 compile_dex: true,
9306 unsafe_ignore_missing_latest_api: true,
9307 }
9308 `)
9309 })
9310}
9311
Jiakai Zhang6decef92022-01-12 17:56:19 +00009312// Verifies that the APEX depends on all the Make modules in the list.
9313func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9314 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9315 for _, dep := range deps {
9316 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9317 }
9318}
9319
9320// Verifies that the APEX does not depend on any of the Make modules in the list.
9321func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9322 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9323 for _, dep := range deps {
9324 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9325 }
9326}
9327
Spandan Das66773252022-01-15 00:23:18 +00009328func TestApexStrictUpdtabilityLint(t *testing.T) {
9329 bpTemplate := `
9330 apex {
9331 name: "myapex",
9332 key: "myapex.key",
9333 java_libs: ["myjavalib"],
9334 updatable: %v,
9335 min_sdk_version: "29",
9336 }
9337 apex_key {
9338 name: "myapex.key",
9339 }
9340 java_library {
9341 name: "myjavalib",
9342 srcs: ["MyClass.java"],
9343 apex_available: [ "myapex" ],
9344 lint: {
9345 strict_updatability_linting: %v,
9346 },
9347 sdk_version: "current",
9348 min_sdk_version: "29",
9349 }
9350 `
9351 fs := android.MockFS{
9352 "lint-baseline.xml": nil,
9353 }
9354
9355 testCases := []struct {
9356 testCaseName string
9357 apexUpdatable bool
9358 javaStrictUpdtabilityLint bool
9359 lintFileExists bool
9360 disallowedFlagExpected bool
9361 }{
9362 {
9363 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9364 apexUpdatable: true,
9365 javaStrictUpdtabilityLint: true,
9366 lintFileExists: false,
9367 disallowedFlagExpected: false,
9368 },
9369 {
9370 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9371 apexUpdatable: false,
9372 javaStrictUpdtabilityLint: false,
9373 lintFileExists: true,
9374 disallowedFlagExpected: false,
9375 },
9376 {
9377 testCaseName: "non-updatable apex respects strict updatability of javalib",
9378 apexUpdatable: false,
9379 javaStrictUpdtabilityLint: true,
9380 lintFileExists: true,
9381 disallowedFlagExpected: true,
9382 },
9383 {
9384 testCaseName: "updatable apex sets strict updatability of javalib to true",
9385 apexUpdatable: true,
9386 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9387 lintFileExists: true,
9388 disallowedFlagExpected: true,
9389 },
9390 }
9391
9392 for _, testCase := range testCases {
9393 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9394 fixtures := []android.FixturePreparer{}
9395 if testCase.lintFileExists {
9396 fixtures = append(fixtures, fs.AddToFixture())
9397 }
9398
9399 result := testApex(t, bp, fixtures...)
9400 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9401 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9402 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9403
9404 if disallowedFlagActual != testCase.disallowedFlagExpected {
9405 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9406 }
9407 }
9408}
9409
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009410func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9411 bp := `
9412 apex {
9413 name: "myapex",
9414 key: "myapex.key",
9415 java_libs: ["myjavalib"],
9416 updatable: true,
9417 min_sdk_version: "29",
9418 }
9419 apex_key {
9420 name: "myapex.key",
9421 }
9422 java_library {
9423 name: "myjavalib",
9424 srcs: ["MyClass.java"],
9425 apex_available: [ "myapex" ],
9426 sdk_version: "current",
9427 min_sdk_version: "29",
9428 }
9429 `
9430
9431 testCases := []struct {
9432 testCaseName string
9433 moduleDirectory string
9434 disallowedFlagExpected bool
9435 }{
9436 {
9437 testCaseName: "lintable module defined outside libcore",
9438 moduleDirectory: "",
9439 disallowedFlagExpected: true,
9440 },
9441 {
9442 testCaseName: "lintable module defined in libcore root directory",
9443 moduleDirectory: "libcore/",
9444 disallowedFlagExpected: false,
9445 },
9446 {
9447 testCaseName: "lintable module defined in libcore child directory",
9448 moduleDirectory: "libcore/childdir/",
9449 disallowedFlagExpected: true,
9450 },
9451 }
9452
9453 for _, testCase := range testCases {
9454 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9455 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9456 result := testApex(t, "", lintFileCreator, bpFileCreator)
9457 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9458 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9459 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9460 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9461
9462 if disallowedFlagActual != testCase.disallowedFlagExpected {
9463 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9464 }
9465 }
9466}
9467
Spandan Das66773252022-01-15 00:23:18 +00009468// checks transtive deps of an apex coming from bootclasspath_fragment
9469func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9470 bp := `
9471 apex {
9472 name: "myapex",
9473 key: "myapex.key",
9474 bootclasspath_fragments: ["mybootclasspathfragment"],
9475 updatable: true,
9476 min_sdk_version: "29",
9477 }
9478 apex_key {
9479 name: "myapex.key",
9480 }
9481 bootclasspath_fragment {
9482 name: "mybootclasspathfragment",
9483 contents: ["myjavalib"],
9484 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009485 hidden_api: {
9486 split_packages: ["*"],
9487 },
Spandan Das66773252022-01-15 00:23:18 +00009488 }
9489 java_library {
9490 name: "myjavalib",
9491 srcs: ["MyClass.java"],
9492 apex_available: [ "myapex" ],
9493 sdk_version: "current",
9494 min_sdk_version: "29",
9495 compile_dex: true,
9496 }
9497 `
9498 fs := android.MockFS{
9499 "lint-baseline.xml": nil,
9500 }
9501
9502 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9503 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9504 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9505 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9506 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9507 }
9508}
9509
Spandan Das42e89502022-05-06 22:12:55 +00009510// updatable apexes should propagate updatable=true to its apps
9511func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9512 bp := `
9513 apex {
9514 name: "myapex",
9515 key: "myapex.key",
9516 updatable: %v,
9517 apps: [
9518 "myapp",
9519 ],
9520 min_sdk_version: "30",
9521 }
9522 apex_key {
9523 name: "myapex.key",
9524 }
9525 android_app {
9526 name: "myapp",
9527 updatable: %v,
9528 apex_available: [
9529 "myapex",
9530 ],
9531 sdk_version: "current",
9532 min_sdk_version: "30",
9533 }
9534 `
9535 testCases := []struct {
9536 name string
9537 apex_is_updatable_bp bool
9538 app_is_updatable_bp bool
9539 app_is_updatable_expected bool
9540 }{
9541 {
9542 name: "Non-updatable apex respects updatable property of non-updatable app",
9543 apex_is_updatable_bp: false,
9544 app_is_updatable_bp: false,
9545 app_is_updatable_expected: false,
9546 },
9547 {
9548 name: "Non-updatable apex respects updatable property of updatable app",
9549 apex_is_updatable_bp: false,
9550 app_is_updatable_bp: true,
9551 app_is_updatable_expected: true,
9552 },
9553 {
9554 name: "Updatable apex respects updatable property of updatable app",
9555 apex_is_updatable_bp: true,
9556 app_is_updatable_bp: true,
9557 app_is_updatable_expected: true,
9558 },
9559 {
9560 name: "Updatable apex sets updatable=true on non-updatable app",
9561 apex_is_updatable_bp: true,
9562 app_is_updatable_bp: false,
9563 app_is_updatable_expected: true,
9564 },
9565 }
9566 for _, testCase := range testCases {
9567 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9568 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9569 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9570 }
9571}
9572
Kiyoung Kim487689e2022-07-26 09:48:22 +09009573func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9574 bp := `
9575 apex {
9576 name: "myapex",
9577 key: "myapex.key",
9578 native_shared_libs: ["libfoo"],
9579 min_sdk_version: "29",
9580 }
9581 apex_key {
9582 name: "myapex.key",
9583 }
9584 cc_library {
9585 name: "libfoo",
9586 shared_libs: ["libc"],
9587 apex_available: ["myapex"],
9588 min_sdk_version: "29",
9589 }
9590 cc_api_library {
9591 name: "libc",
9592 src: "libc.so",
9593 min_sdk_version: "29",
9594 recovery_available: true,
9595 }
9596 api_imports {
9597 name: "api_imports",
9598 shared_libs: [
9599 "libc",
9600 ],
9601 header_libs: [],
9602 }
9603 `
9604 result := testApex(t, bp)
9605
9606 hasDep := func(m android.Module, wantDep android.Module) bool {
9607 t.Helper()
9608 var found bool
9609 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9610 if dep == wantDep {
9611 found = true
9612 }
9613 })
9614 return found
9615 }
9616
9617 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9618 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9619
9620 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9621
9622 // libfoo core variant should be buildable in the same inner tree since
9623 // certain mcombo files might build system and apexes in the same inner tree
9624 // libfoo core variant should link against source libc
9625 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9626 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9627 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9628}
9629
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009630func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009631 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009632}