blob: 0ca8f95ea0ac72a2b29cee900fad8a048c0cf17b [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
Vinh Tran8f5310f2022-10-07 18:16:47 -04004101func TestCompileMultilibProp(t *testing.T) {
4102 testCases := []struct {
4103 compileMultiLibProp string
4104 containedLibs []string
4105 notContainedLibs []string
4106 }{
4107 {
4108 containedLibs: []string{
4109 "image.apex/lib64/mylib.so",
4110 "image.apex/lib/mylib.so",
4111 },
4112 compileMultiLibProp: `compile_multilib: "both",`,
4113 },
4114 {
4115 containedLibs: []string{"image.apex/lib64/mylib.so"},
4116 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4117 compileMultiLibProp: `compile_multilib: "first",`,
4118 },
4119 {
4120 containedLibs: []string{"image.apex/lib64/mylib.so"},
4121 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4122 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4123 },
4124 {
4125 containedLibs: []string{"image.apex/lib64/mylib.so"},
4126 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4127 compileMultiLibProp: `compile_multilib: "64",`,
4128 },
4129 {
4130 containedLibs: []string{"image.apex/lib/mylib.so"},
4131 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4132 compileMultiLibProp: `compile_multilib: "32",`,
4133 },
4134 }
4135 for _, testCase := range testCases {
4136 ctx := testApex(t, fmt.Sprintf(`
4137 apex {
4138 name: "myapex",
4139 key: "myapex.key",
4140 %s
4141 native_shared_libs: ["mylib"],
4142 updatable: false,
4143 }
4144 apex_key {
4145 name: "myapex.key",
4146 public_key: "testkey.avbpubkey",
4147 private_key: "testkey.pem",
4148 }
4149 cc_library {
4150 name: "mylib",
4151 srcs: ["mylib.cpp"],
4152 apex_available: [
4153 "//apex_available:platform",
4154 "myapex",
4155 ],
4156 }
4157 `, testCase.compileMultiLibProp),
4158 )
4159 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4160 apexRule := module.Rule("apexRule")
4161 copyCmds := apexRule.Args["copy_commands"]
4162 for _, containedLib := range testCase.containedLibs {
4163 ensureContains(t, copyCmds, containedLib)
4164 }
4165 for _, notContainedLib := range testCase.notContainedLibs {
4166 ensureNotContains(t, copyCmds, notContainedLib)
4167 }
4168 }
4169}
4170
Alex Light0851b882019-02-07 13:20:53 -08004171func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004172 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004173 apex {
4174 name: "myapex",
4175 key: "myapex.key",
4176 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004177 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004178 }
4179
4180 apex_key {
4181 name: "myapex.key",
4182 public_key: "testkey.avbpubkey",
4183 private_key: "testkey.pem",
4184 }
4185
4186 cc_library {
4187 name: "mylib_common",
4188 srcs: ["mylib.cpp"],
4189 system_shared_libs: [],
4190 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004191 apex_available: [
4192 "//apex_available:platform",
4193 "myapex",
4194 ],
Alex Light0851b882019-02-07 13:20:53 -08004195 }
4196 `)
4197
Sundong Ahnabb64432019-10-22 13:58:29 +09004198 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004199 apexRule := module.Rule("apexRule")
4200 copyCmds := apexRule.Args["copy_commands"]
4201
4202 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4203 t.Log("Apex was a test apex!")
4204 t.Fail()
4205 }
4206 // Ensure that main rule creates an output
4207 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4208
4209 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004210 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004211
4212 // Ensure that both direct and indirect deps are copied into apex
4213 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4214
Colin Cross7113d202019-11-20 16:39:12 -08004215 // Ensure that the platform variant ends with _shared
4216 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004217
Colin Cross56a83212020-09-15 18:30:11 -07004218 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004219 t.Log("Found mylib_common not in any apex!")
4220 t.Fail()
4221 }
4222}
4223
4224func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004225 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004226 apex_test {
4227 name: "myapex",
4228 key: "myapex.key",
4229 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004230 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004231 }
4232
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238
4239 cc_library {
4240 name: "mylib_common_test",
4241 srcs: ["mylib.cpp"],
4242 system_shared_libs: [],
4243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004244 // TODO: remove //apex_available:platform
4245 apex_available: [
4246 "//apex_available:platform",
4247 "myapex",
4248 ],
Alex Light0851b882019-02-07 13:20:53 -08004249 }
4250 `)
4251
Sundong Ahnabb64432019-10-22 13:58:29 +09004252 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004253 apexRule := module.Rule("apexRule")
4254 copyCmds := apexRule.Args["copy_commands"]
4255
4256 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4257 t.Log("Apex was not a test apex!")
4258 t.Fail()
4259 }
4260 // Ensure that main rule creates an output
4261 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4262
4263 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004264 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004265
4266 // Ensure that both direct and indirect deps are copied into apex
4267 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4268
Colin Cross7113d202019-11-20 16:39:12 -08004269 // Ensure that the platform variant ends with _shared
4270 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004271}
4272
Alex Light9670d332019-01-29 18:07:33 -08004273func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004274 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004275 apex {
4276 name: "myapex",
4277 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004278 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004279 multilib: {
4280 first: {
4281 native_shared_libs: ["mylib_common"],
4282 }
4283 },
4284 target: {
4285 android: {
4286 multilib: {
4287 first: {
4288 native_shared_libs: ["mylib"],
4289 }
4290 }
4291 },
4292 host: {
4293 multilib: {
4294 first: {
4295 native_shared_libs: ["mylib2"],
4296 }
4297 }
4298 }
4299 }
4300 }
4301
4302 apex_key {
4303 name: "myapex.key",
4304 public_key: "testkey.avbpubkey",
4305 private_key: "testkey.pem",
4306 }
4307
4308 cc_library {
4309 name: "mylib",
4310 srcs: ["mylib.cpp"],
4311 system_shared_libs: [],
4312 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004313 // TODO: remove //apex_available:platform
4314 apex_available: [
4315 "//apex_available:platform",
4316 "myapex",
4317 ],
Alex Light9670d332019-01-29 18:07:33 -08004318 }
4319
4320 cc_library {
4321 name: "mylib_common",
4322 srcs: ["mylib.cpp"],
4323 system_shared_libs: [],
4324 stl: "none",
4325 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004326 // TODO: remove //apex_available:platform
4327 apex_available: [
4328 "//apex_available:platform",
4329 "myapex",
4330 ],
Alex Light9670d332019-01-29 18:07:33 -08004331 }
4332
4333 cc_library {
4334 name: "mylib2",
4335 srcs: ["mylib.cpp"],
4336 system_shared_libs: [],
4337 stl: "none",
4338 compile_multilib: "first",
4339 }
4340 `)
4341
Sundong Ahnabb64432019-10-22 13:58:29 +09004342 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004343 copyCmds := apexRule.Args["copy_commands"]
4344
4345 // Ensure that main rule creates an output
4346 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4347
4348 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004349 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4350 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4351 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004352
4353 // Ensure that both direct and indirect deps are copied into apex
4354 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4355 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4356 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4357
Colin Cross7113d202019-11-20 16:39:12 -08004358 // Ensure that the platform variant ends with _shared
4359 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4360 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4361 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004362}
Jiyong Park04480cf2019-02-06 00:16:29 +09004363
Jiyong Park59140302020-12-14 18:44:04 +09004364func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004365 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004366 apex {
4367 name: "myapex",
4368 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004369 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004370 arch: {
4371 arm64: {
4372 native_shared_libs: ["mylib.arm64"],
4373 },
4374 x86_64: {
4375 native_shared_libs: ["mylib.x64"],
4376 },
4377 }
4378 }
4379
4380 apex_key {
4381 name: "myapex.key",
4382 public_key: "testkey.avbpubkey",
4383 private_key: "testkey.pem",
4384 }
4385
4386 cc_library {
4387 name: "mylib.arm64",
4388 srcs: ["mylib.cpp"],
4389 system_shared_libs: [],
4390 stl: "none",
4391 // TODO: remove //apex_available:platform
4392 apex_available: [
4393 "//apex_available:platform",
4394 "myapex",
4395 ],
4396 }
4397
4398 cc_library {
4399 name: "mylib.x64",
4400 srcs: ["mylib.cpp"],
4401 system_shared_libs: [],
4402 stl: "none",
4403 // TODO: remove //apex_available:platform
4404 apex_available: [
4405 "//apex_available:platform",
4406 "myapex",
4407 ],
4408 }
4409 `)
4410
4411 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4412 copyCmds := apexRule.Args["copy_commands"]
4413
4414 // Ensure that apex variant is created for the direct dep
4415 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4416 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4417
4418 // Ensure that both direct and indirect deps are copied into apex
4419 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4420 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4421}
4422
Jiyong Park04480cf2019-02-06 00:16:29 +09004423func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004424 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004425 apex {
4426 name: "myapex",
4427 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004428 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004429 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004430 }
4431
4432 apex_key {
4433 name: "myapex.key",
4434 public_key: "testkey.avbpubkey",
4435 private_key: "testkey.pem",
4436 }
4437
4438 sh_binary {
4439 name: "myscript",
4440 src: "mylib.cpp",
4441 filename: "myscript.sh",
4442 sub_dir: "script",
4443 }
4444 `)
4445
Sundong Ahnabb64432019-10-22 13:58:29 +09004446 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004447 copyCmds := apexRule.Args["copy_commands"]
4448
4449 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4450}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004451
Jooyung Han91df2082019-11-20 01:49:42 +09004452func TestApexInVariousPartition(t *testing.T) {
4453 testcases := []struct {
4454 propName, parition, flattenedPartition string
4455 }{
4456 {"", "system", "system_ext"},
4457 {"product_specific: true", "product", "product"},
4458 {"soc_specific: true", "vendor", "vendor"},
4459 {"proprietary: true", "vendor", "vendor"},
4460 {"vendor: true", "vendor", "vendor"},
4461 {"system_ext_specific: true", "system_ext", "system_ext"},
4462 }
4463 for _, tc := range testcases {
4464 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004465 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004466 apex {
4467 name: "myapex",
4468 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004469 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004470 `+tc.propName+`
4471 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004472
Jooyung Han91df2082019-11-20 01:49:42 +09004473 apex_key {
4474 name: "myapex.key",
4475 public_key: "testkey.avbpubkey",
4476 private_key: "testkey.pem",
4477 }
4478 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004479
Jooyung Han91df2082019-11-20 01:49:42 +09004480 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004481 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4482 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004483 if actual != expected {
4484 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4485 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004486
Jooyung Han91df2082019-11-20 01:49:42 +09004487 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004488 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4489 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004490 if actual != expected {
4491 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4492 }
4493 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004494 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004495}
Jiyong Park67882562019-03-21 01:11:21 +09004496
Jooyung Han580eb4f2020-06-24 19:33:06 +09004497func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004498 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004499 apex {
4500 name: "myapex",
4501 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004502 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004503 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004504
Jooyung Han580eb4f2020-06-24 19:33:06 +09004505 apex_key {
4506 name: "myapex.key",
4507 public_key: "testkey.avbpubkey",
4508 private_key: "testkey.pem",
4509 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004510 `)
4511 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004512 rule := module.Output("file_contexts")
4513 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4514}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004515
Jooyung Han580eb4f2020-06-24 19:33:06 +09004516func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004517 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004518 apex {
4519 name: "myapex",
4520 key: "myapex.key",
4521 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004522 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004523 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004524
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525 apex_key {
4526 name: "myapex.key",
4527 public_key: "testkey.avbpubkey",
4528 private_key: "testkey.pem",
4529 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004530 `, withFiles(map[string][]byte{
4531 "my_own_file_contexts": nil,
4532 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004533}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004534
Jooyung Han580eb4f2020-06-24 19:33:06 +09004535func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004536 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004537 apex {
4538 name: "myapex",
4539 key: "myapex.key",
4540 product_specific: true,
4541 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004542 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004543 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004544
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004550 `)
4551
Colin Cross1c460562021-02-16 17:55:47 -08004552 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553 apex {
4554 name: "myapex",
4555 key: "myapex.key",
4556 product_specific: true,
4557 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004558 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004559 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004560
Jooyung Han580eb4f2020-06-24 19:33:06 +09004561 apex_key {
4562 name: "myapex.key",
4563 public_key: "testkey.avbpubkey",
4564 private_key: "testkey.pem",
4565 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004566 `, withFiles(map[string][]byte{
4567 "product_specific_file_contexts": nil,
4568 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004569 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4570 rule := module.Output("file_contexts")
4571 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4572}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004573
Jooyung Han580eb4f2020-06-24 19:33:06 +09004574func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004575 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004576 apex {
4577 name: "myapex",
4578 key: "myapex.key",
4579 product_specific: true,
4580 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004581 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004582 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004583
Jooyung Han580eb4f2020-06-24 19:33:06 +09004584 apex_key {
4585 name: "myapex.key",
4586 public_key: "testkey.avbpubkey",
4587 private_key: "testkey.pem",
4588 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004589
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 filegroup {
4591 name: "my-file-contexts",
4592 srcs: ["product_specific_file_contexts"],
4593 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004594 `, withFiles(map[string][]byte{
4595 "product_specific_file_contexts": nil,
4596 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004597 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4598 rule := module.Output("file_contexts")
4599 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004600}
4601
Jiyong Park67882562019-03-21 01:11:21 +09004602func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004603 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004604 apex_key {
4605 name: "myapex.key",
4606 public_key: ":my.avbpubkey",
4607 private_key: ":my.pem",
4608 product_specific: true,
4609 }
4610
4611 filegroup {
4612 name: "my.avbpubkey",
4613 srcs: ["testkey2.avbpubkey"],
4614 }
4615
4616 filegroup {
4617 name: "my.pem",
4618 srcs: ["testkey2.pem"],
4619 }
4620 `)
4621
4622 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4623 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004624 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004625 if actual_pubkey != expected_pubkey {
4626 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4627 }
4628 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004629 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004630 if actual_privkey != expected_privkey {
4631 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4632 }
4633}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004634
4635func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004636 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004637 prebuilt_apex {
4638 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004639 arch: {
4640 arm64: {
4641 src: "myapex-arm64.apex",
4642 },
4643 arm: {
4644 src: "myapex-arm.apex",
4645 },
4646 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004647 }
4648 `)
4649
Wei Li340ee8e2022-03-18 17:33:24 -07004650 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4651 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004652
Jiyong Parkc95714e2019-03-29 14:23:10 +09004653 expectedInput := "myapex-arm64.apex"
4654 if prebuilt.inputApex.String() != expectedInput {
4655 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4656 }
Wei Li340ee8e2022-03-18 17:33:24 -07004657 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4658 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4659 rule := testingModule.Rule("genProvenanceMetaData")
4660 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4661 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4662 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4663 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004664}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004665
Paul Duffinc0609c62021-03-01 17:27:16 +00004666func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004667 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004668 prebuilt_apex {
4669 name: "myapex",
4670 }
4671 `)
4672}
4673
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004674func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004675 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004676 prebuilt_apex {
4677 name: "myapex",
4678 src: "myapex-arm.apex",
4679 filename: "notmyapex.apex",
4680 }
4681 `)
4682
Wei Li340ee8e2022-03-18 17:33:24 -07004683 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4684 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004685
4686 expected := "notmyapex.apex"
4687 if p.installFilename != expected {
4688 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4689 }
Wei Li340ee8e2022-03-18 17:33:24 -07004690 rule := testingModule.Rule("genProvenanceMetaData")
4691 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4692 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4693 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4694 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004695}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004696
Samiul Islam7c02e262021-09-08 17:48:28 +01004697func TestApexSetFilenameOverride(t *testing.T) {
4698 testApex(t, `
4699 apex_set {
4700 name: "com.company.android.myapex",
4701 apex_name: "com.android.myapex",
4702 set: "company-myapex.apks",
4703 filename: "com.company.android.myapex.apex"
4704 }
4705 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4706
4707 testApex(t, `
4708 apex_set {
4709 name: "com.company.android.myapex",
4710 apex_name: "com.android.myapex",
4711 set: "company-myapex.apks",
4712 filename: "com.company.android.myapex.capex"
4713 }
4714 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4715
4716 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4717 apex_set {
4718 name: "com.company.android.myapex",
4719 apex_name: "com.android.myapex",
4720 set: "company-myapex.apks",
4721 filename: "some-random-suffix"
4722 }
4723 `)
4724}
4725
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004726func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004727 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004728 prebuilt_apex {
4729 name: "myapex.prebuilt",
4730 src: "myapex-arm.apex",
4731 overrides: [
4732 "myapex",
4733 ],
4734 }
4735 `)
4736
Wei Li340ee8e2022-03-18 17:33:24 -07004737 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4738 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004739
4740 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004741 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004742 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004743 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004744 }
Wei Li340ee8e2022-03-18 17:33:24 -07004745 rule := testingModule.Rule("genProvenanceMetaData")
4746 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4747 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4748 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4749 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004750}
4751
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004752func TestPrebuiltApexName(t *testing.T) {
4753 testApex(t, `
4754 prebuilt_apex {
4755 name: "com.company.android.myapex",
4756 apex_name: "com.android.myapex",
4757 src: "company-myapex-arm.apex",
4758 }
4759 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4760
4761 testApex(t, `
4762 apex_set {
4763 name: "com.company.android.myapex",
4764 apex_name: "com.android.myapex",
4765 set: "company-myapex.apks",
4766 }
4767 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4768}
4769
4770func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4771 _ = android.GroupFixturePreparers(
4772 java.PrepareForTestWithJavaDefaultModules,
4773 PrepareForTestWithApexBuildComponents,
4774 android.FixtureWithRootAndroidBp(`
4775 platform_bootclasspath {
4776 name: "platform-bootclasspath",
4777 fragments: [
4778 {
4779 apex: "com.android.art",
4780 module: "art-bootclasspath-fragment",
4781 },
4782 ],
4783 }
4784
4785 prebuilt_apex {
4786 name: "com.company.android.art",
4787 apex_name: "com.android.art",
4788 src: "com.company.android.art-arm.apex",
4789 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4790 }
4791
4792 prebuilt_bootclasspath_fragment {
4793 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004794 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004795 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004796 hidden_api: {
4797 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4798 metadata: "my-bootclasspath-fragment/metadata.csv",
4799 index: "my-bootclasspath-fragment/index.csv",
4800 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4801 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4802 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004803 }
4804
4805 java_import {
4806 name: "core-oj",
4807 jars: ["prebuilt.jar"],
4808 }
4809 `),
4810 ).RunTest(t)
4811}
4812
Paul Duffin092153d2021-01-26 11:42:39 +00004813// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4814// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004815func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004816 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004817
Paul Duffin89886cb2021-02-05 16:44:03 +00004818 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004819 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004820 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004821 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004822 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004823 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004824 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4825 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4826 android.NormalizePathForTesting(dexJarBuildPath))
4827 }
4828
4829 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004830 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004831 // Make sure the import has been given the correct path to the dex jar.
4832 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4833 dexJarBuildPath := p.DexJarInstallPath()
4834 stem := android.RemoveOptionalPrebuiltPrefix(name)
4835 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4836 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4837 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004838 }
4839
Paul Duffin39853512021-02-26 11:09:39 +00004840 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004841 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004842 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004843 android.AssertArrayString(t, "Check if there is no source variant",
4844 []string{"android_common"},
4845 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004846 }
4847
4848 t.Run("prebuilt only", func(t *testing.T) {
4849 bp := `
4850 prebuilt_apex {
4851 name: "myapex",
4852 arch: {
4853 arm64: {
4854 src: "myapex-arm64.apex",
4855 },
4856 arm: {
4857 src: "myapex-arm.apex",
4858 },
4859 },
Paul Duffin39853512021-02-26 11:09:39 +00004860 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004861 }
4862
4863 java_import {
4864 name: "libfoo",
4865 jars: ["libfoo.jar"],
4866 }
Paul Duffin39853512021-02-26 11:09:39 +00004867
4868 java_sdk_library_import {
4869 name: "libbar",
4870 public: {
4871 jars: ["libbar.jar"],
4872 },
4873 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004874 `
4875
4876 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4877 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4878
Martin Stjernholm44825602021-09-17 01:44:12 +01004879 deapexerName := deapexerModuleName("myapex")
4880 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4881
Paul Duffinf6932af2021-02-26 18:21:56 +00004882 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004883 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004884 rule := deapexer.Rule("deapexer")
4885 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4886 t.Errorf("expected: %q, found: %q", expected, actual)
4887 }
4888
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004889 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004890 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004891 rule = prebuiltApex.Rule("android/soong/android.Cp")
4892 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4893 t.Errorf("expected: %q, found: %q", expected, actual)
4894 }
4895
Paul Duffin89886cb2021-02-05 16:44:03 +00004896 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004897 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004898
4899 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004900 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004901 })
4902
4903 t.Run("prebuilt with source preferred", func(t *testing.T) {
4904
4905 bp := `
4906 prebuilt_apex {
4907 name: "myapex",
4908 arch: {
4909 arm64: {
4910 src: "myapex-arm64.apex",
4911 },
4912 arm: {
4913 src: "myapex-arm.apex",
4914 },
4915 },
Paul Duffin39853512021-02-26 11:09:39 +00004916 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004917 }
4918
4919 java_import {
4920 name: "libfoo",
4921 jars: ["libfoo.jar"],
4922 }
4923
4924 java_library {
4925 name: "libfoo",
4926 }
Paul Duffin39853512021-02-26 11:09:39 +00004927
4928 java_sdk_library_import {
4929 name: "libbar",
4930 public: {
4931 jars: ["libbar.jar"],
4932 },
4933 }
4934
4935 java_sdk_library {
4936 name: "libbar",
4937 srcs: ["foo/bar/MyClass.java"],
4938 unsafe_ignore_missing_latest_api: true,
4939 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004940 `
4941
4942 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4943 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4944
Paul Duffin89886cb2021-02-05 16:44:03 +00004945 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004946 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004947 ensureNoSourceVariant(t, ctx, "libfoo")
4948
4949 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004950 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004951 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004952 })
4953
4954 t.Run("prebuilt preferred with source", func(t *testing.T) {
4955 bp := `
4956 prebuilt_apex {
4957 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004958 arch: {
4959 arm64: {
4960 src: "myapex-arm64.apex",
4961 },
4962 arm: {
4963 src: "myapex-arm.apex",
4964 },
4965 },
Paul Duffin39853512021-02-26 11:09:39 +00004966 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004967 }
4968
4969 java_import {
4970 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004971 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004972 jars: ["libfoo.jar"],
4973 }
4974
4975 java_library {
4976 name: "libfoo",
4977 }
Paul Duffin39853512021-02-26 11:09:39 +00004978
4979 java_sdk_library_import {
4980 name: "libbar",
4981 prefer: true,
4982 public: {
4983 jars: ["libbar.jar"],
4984 },
4985 }
4986
4987 java_sdk_library {
4988 name: "libbar",
4989 srcs: ["foo/bar/MyClass.java"],
4990 unsafe_ignore_missing_latest_api: true,
4991 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004992 `
4993
4994 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4995 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4996
Paul Duffin89886cb2021-02-05 16:44:03 +00004997 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004998 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004999 ensureNoSourceVariant(t, ctx, "libfoo")
5000
5001 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005002 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005003 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005004 })
5005}
5006
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005007func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005008 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005009 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005010 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5011 // is disabled.
5012 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5013 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005014
Paul Duffin37856732021-02-26 14:24:15 +00005015 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5016 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005017 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005018 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005019 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005020 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005021 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005022 foundLibfooJar = true
5023 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005024 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005025 }
5026 }
5027 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005028 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 +00005029 }
5030 }
5031
Paul Duffin40a3f652021-07-19 13:11:24 +01005032 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005033 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005034 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005035 var rule android.TestingBuildParams
5036
5037 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5038 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005039 }
5040
Paul Duffin40a3f652021-07-19 13:11:24 +01005041 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5042 t.Helper()
5043 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5044 var rule android.TestingBuildParams
5045
5046 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5047 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5048 }
5049
Paul Duffin89f570a2021-06-16 01:42:33 +01005050 fragment := java.ApexVariantReference{
5051 Apex: proptools.StringPtr("myapex"),
5052 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5053 }
5054
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005055 t.Run("prebuilt only", func(t *testing.T) {
5056 bp := `
5057 prebuilt_apex {
5058 name: "myapex",
5059 arch: {
5060 arm64: {
5061 src: "myapex-arm64.apex",
5062 },
5063 arm: {
5064 src: "myapex-arm.apex",
5065 },
5066 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005067 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5068 }
5069
5070 prebuilt_bootclasspath_fragment {
5071 name: "my-bootclasspath-fragment",
5072 contents: ["libfoo", "libbar"],
5073 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005074 hidden_api: {
5075 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5076 metadata: "my-bootclasspath-fragment/metadata.csv",
5077 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005078 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5079 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5080 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005081 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005082 }
5083
5084 java_import {
5085 name: "libfoo",
5086 jars: ["libfoo.jar"],
5087 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005088 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005089 }
Paul Duffin37856732021-02-26 14:24:15 +00005090
5091 java_sdk_library_import {
5092 name: "libbar",
5093 public: {
5094 jars: ["libbar.jar"],
5095 },
5096 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005097 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005098 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005099 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005100 `
5101
Paul Duffin89f570a2021-06-16 01:42:33 +01005102 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005103 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5104 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005105
Paul Duffin537ea3d2021-05-14 10:38:00 +01005106 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005107 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005108 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005109 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005110 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5111 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005112 })
5113
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005114 t.Run("apex_set only", func(t *testing.T) {
5115 bp := `
5116 apex_set {
5117 name: "myapex",
5118 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005119 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5120 }
5121
5122 prebuilt_bootclasspath_fragment {
5123 name: "my-bootclasspath-fragment",
5124 contents: ["libfoo", "libbar"],
5125 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005126 hidden_api: {
5127 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5128 metadata: "my-bootclasspath-fragment/metadata.csv",
5129 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005130 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5131 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5132 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005133 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005134 }
5135
5136 java_import {
5137 name: "libfoo",
5138 jars: ["libfoo.jar"],
5139 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005140 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005141 }
5142
5143 java_sdk_library_import {
5144 name: "libbar",
5145 public: {
5146 jars: ["libbar.jar"],
5147 },
5148 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005149 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005150 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005151 }
5152 `
5153
Paul Duffin89f570a2021-06-16 01:42:33 +01005154 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005155 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5156 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5157
Paul Duffin537ea3d2021-05-14 10:38:00 +01005158 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005159 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005160 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005161 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005162 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5163 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005164 })
5165
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005166 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5167 bp := `
5168 prebuilt_apex {
5169 name: "myapex",
5170 arch: {
5171 arm64: {
5172 src: "myapex-arm64.apex",
5173 },
5174 arm: {
5175 src: "myapex-arm.apex",
5176 },
5177 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005178 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5179 }
5180
5181 prebuilt_bootclasspath_fragment {
5182 name: "my-bootclasspath-fragment",
5183 contents: ["libfoo", "libbar"],
5184 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005185 hidden_api: {
5186 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5187 metadata: "my-bootclasspath-fragment/metadata.csv",
5188 index: "my-bootclasspath-fragment/index.csv",
5189 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5190 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5191 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 }
5193
5194 java_import {
5195 name: "libfoo",
5196 jars: ["libfoo.jar"],
5197 apex_available: ["myapex"],
5198 }
5199
5200 java_library {
5201 name: "libfoo",
5202 srcs: ["foo/bar/MyClass.java"],
5203 apex_available: ["myapex"],
5204 }
Paul Duffin37856732021-02-26 14:24:15 +00005205
5206 java_sdk_library_import {
5207 name: "libbar",
5208 public: {
5209 jars: ["libbar.jar"],
5210 },
5211 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005212 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005213 }
5214
5215 java_sdk_library {
5216 name: "libbar",
5217 srcs: ["foo/bar/MyClass.java"],
5218 unsafe_ignore_missing_latest_api: true,
5219 apex_available: ["myapex"],
5220 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005221 `
5222
5223 // In this test the source (java_library) libfoo is active since the
5224 // prebuilt (java_import) defaults to prefer:false. However the
5225 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5226 // find the dex boot jar in it. We either need to disable the source libfoo
5227 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005228 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005229 // dexbootjar check is skipped if AllowMissingDependencies is true
5230 preparerAllowMissingDeps := android.GroupFixturePreparers(
5231 preparer,
5232 android.PrepareForTestWithAllowMissingDependencies,
5233 )
5234 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005235 })
5236
5237 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5238 bp := `
5239 prebuilt_apex {
5240 name: "myapex",
5241 arch: {
5242 arm64: {
5243 src: "myapex-arm64.apex",
5244 },
5245 arm: {
5246 src: "myapex-arm.apex",
5247 },
5248 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005249 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5250 }
5251
5252 prebuilt_bootclasspath_fragment {
5253 name: "my-bootclasspath-fragment",
5254 contents: ["libfoo", "libbar"],
5255 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005256 hidden_api: {
5257 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5258 metadata: "my-bootclasspath-fragment/metadata.csv",
5259 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005260 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5261 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5262 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005263 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005264 }
5265
5266 java_import {
5267 name: "libfoo",
5268 prefer: true,
5269 jars: ["libfoo.jar"],
5270 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005271 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005272 }
5273
5274 java_library {
5275 name: "libfoo",
5276 srcs: ["foo/bar/MyClass.java"],
5277 apex_available: ["myapex"],
5278 }
Paul Duffin37856732021-02-26 14:24:15 +00005279
5280 java_sdk_library_import {
5281 name: "libbar",
5282 prefer: true,
5283 public: {
5284 jars: ["libbar.jar"],
5285 },
5286 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005287 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005288 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005289 }
5290
5291 java_sdk_library {
5292 name: "libbar",
5293 srcs: ["foo/bar/MyClass.java"],
5294 unsafe_ignore_missing_latest_api: true,
5295 apex_available: ["myapex"],
5296 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005297 `
5298
Paul Duffin89f570a2021-06-16 01:42:33 +01005299 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005300 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5301 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005302
Paul Duffin537ea3d2021-05-14 10:38:00 +01005303 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005304 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005305 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005306 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005307 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5308 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005309 })
5310
5311 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5312 bp := `
5313 apex {
5314 name: "myapex",
5315 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005316 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005317 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 }
5319
5320 apex_key {
5321 name: "myapex.key",
5322 public_key: "testkey.avbpubkey",
5323 private_key: "testkey.pem",
5324 }
5325
5326 prebuilt_apex {
5327 name: "myapex",
5328 arch: {
5329 arm64: {
5330 src: "myapex-arm64.apex",
5331 },
5332 arm: {
5333 src: "myapex-arm.apex",
5334 },
5335 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005336 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5337 }
5338
5339 prebuilt_bootclasspath_fragment {
5340 name: "my-bootclasspath-fragment",
5341 contents: ["libfoo", "libbar"],
5342 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005343 hidden_api: {
5344 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5345 metadata: "my-bootclasspath-fragment/metadata.csv",
5346 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005347 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5348 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5349 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005350 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005351 }
5352
5353 java_import {
5354 name: "libfoo",
5355 jars: ["libfoo.jar"],
5356 apex_available: ["myapex"],
5357 }
5358
5359 java_library {
5360 name: "libfoo",
5361 srcs: ["foo/bar/MyClass.java"],
5362 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005363 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
Paul Duffin37856732021-02-26 14:24:15 +00005365
5366 java_sdk_library_import {
5367 name: "libbar",
5368 public: {
5369 jars: ["libbar.jar"],
5370 },
5371 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005372 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005373 }
5374
5375 java_sdk_library {
5376 name: "libbar",
5377 srcs: ["foo/bar/MyClass.java"],
5378 unsafe_ignore_missing_latest_api: true,
5379 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005380 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005381 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 `
5383
Paul Duffin89f570a2021-06-16 01:42:33 +01005384 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005385 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5386 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005387
Paul Duffin537ea3d2021-05-14 10:38:00 +01005388 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005389 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005390 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005391 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005392 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5393 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005394 })
5395
5396 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5397 bp := `
5398 apex {
5399 name: "myapex",
5400 enabled: false,
5401 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005402 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005403 }
5404
5405 apex_key {
5406 name: "myapex.key",
5407 public_key: "testkey.avbpubkey",
5408 private_key: "testkey.pem",
5409 }
5410
5411 prebuilt_apex {
5412 name: "myapex",
5413 arch: {
5414 arm64: {
5415 src: "myapex-arm64.apex",
5416 },
5417 arm: {
5418 src: "myapex-arm.apex",
5419 },
5420 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005421 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5422 }
5423
5424 prebuilt_bootclasspath_fragment {
5425 name: "my-bootclasspath-fragment",
5426 contents: ["libfoo", "libbar"],
5427 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005428 hidden_api: {
5429 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5430 metadata: "my-bootclasspath-fragment/metadata.csv",
5431 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005432 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5433 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5434 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005435 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005436 }
5437
5438 java_import {
5439 name: "libfoo",
5440 prefer: true,
5441 jars: ["libfoo.jar"],
5442 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005443 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005444 }
5445
5446 java_library {
5447 name: "libfoo",
5448 srcs: ["foo/bar/MyClass.java"],
5449 apex_available: ["myapex"],
5450 }
Paul Duffin37856732021-02-26 14:24:15 +00005451
5452 java_sdk_library_import {
5453 name: "libbar",
5454 prefer: true,
5455 public: {
5456 jars: ["libbar.jar"],
5457 },
5458 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005459 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005460 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005461 }
5462
5463 java_sdk_library {
5464 name: "libbar",
5465 srcs: ["foo/bar/MyClass.java"],
5466 unsafe_ignore_missing_latest_api: true,
5467 apex_available: ["myapex"],
5468 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 `
5470
Paul Duffin89f570a2021-06-16 01:42:33 +01005471 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005472 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5473 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005474
Paul Duffin537ea3d2021-05-14 10:38:00 +01005475 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005476 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005478 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005479 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5480 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005481 })
5482}
5483
Roland Levillain630846d2019-06-26 12:48:34 +01005484func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005485 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005486 apex_test {
5487 name: "myapex",
5488 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005489 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005490 tests: [
5491 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005492 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005493 ],
5494 }
5495
5496 apex_key {
5497 name: "myapex.key",
5498 public_key: "testkey.avbpubkey",
5499 private_key: "testkey.pem",
5500 }
5501
Liz Kammer1c14a212020-05-12 15:26:55 -07005502 filegroup {
5503 name: "fg",
5504 srcs: [
5505 "baz",
5506 "bar/baz"
5507 ],
5508 }
5509
Roland Levillain630846d2019-06-26 12:48:34 +01005510 cc_test {
5511 name: "mytest",
5512 gtest: false,
5513 srcs: ["mytest.cpp"],
5514 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005515 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005516 system_shared_libs: [],
5517 static_executable: true,
5518 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005519 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005520 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005521
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005522 cc_library {
5523 name: "mylib",
5524 srcs: ["mylib.cpp"],
5525 system_shared_libs: [],
5526 stl: "none",
5527 }
5528
Liz Kammer5bd365f2020-05-27 15:15:11 -07005529 filegroup {
5530 name: "fg2",
5531 srcs: [
5532 "testdata/baz"
5533 ],
5534 }
5535
Roland Levillain9b5fde92019-06-28 15:41:19 +01005536 cc_test {
5537 name: "mytests",
5538 gtest: false,
5539 srcs: [
5540 "mytest1.cpp",
5541 "mytest2.cpp",
5542 "mytest3.cpp",
5543 ],
5544 test_per_src: true,
5545 relative_install_path: "test",
5546 system_shared_libs: [],
5547 static_executable: true,
5548 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005549 data: [
5550 ":fg",
5551 ":fg2",
5552 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005553 }
Roland Levillain630846d2019-06-26 12:48:34 +01005554 `)
5555
Sundong Ahnabb64432019-10-22 13:58:29 +09005556 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005557 copyCmds := apexRule.Args["copy_commands"]
5558
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005559 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005560 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005562
Liz Kammer1c14a212020-05-12 15:26:55 -07005563 //Ensure that test data are copied into apex.
5564 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5565 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5566
Roland Levillain9b5fde92019-06-28 15:41:19 +01005567 // Ensure that test deps built with `test_per_src` are copied into apex.
5568 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5569 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5570 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005571
5572 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005573 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005574 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005575 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005576 prefix := "TARGET_"
5577 var builder strings.Builder
5578 data.Custom(&builder, name, prefix, "", data)
5579 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005580 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5581 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5582 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5583 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005584 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005585 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005586 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005587
5588 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005589 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005590 data.Custom(&builder, name, prefix, "", data)
5591 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005592 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5593 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005594}
5595
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005596func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005597 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005598 apex {
5599 name: "myapex",
5600 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005601 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005602 }
5603 apex_key {
5604 name: "myapex.key",
5605 public_key: "testkey.avbpubkey",
5606 private_key: "testkey.pem",
5607 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005608 `,
5609 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5610 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5611 }),
5612 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005613 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005614 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005615 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005616 var builder strings.Builder
5617 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5618 androidMk := builder.String()
5619 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5620}
5621
Jooyung Hand48f3c32019-08-23 11:18:57 +09005622func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5623 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5624 apex {
5625 name: "myapex",
5626 key: "myapex.key",
5627 native_shared_libs: ["libfoo"],
5628 }
5629
5630 apex_key {
5631 name: "myapex.key",
5632 public_key: "testkey.avbpubkey",
5633 private_key: "testkey.pem",
5634 }
5635
5636 cc_library {
5637 name: "libfoo",
5638 stl: "none",
5639 system_shared_libs: [],
5640 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005641 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005642 }
5643 `)
5644 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5645 apex {
5646 name: "myapex",
5647 key: "myapex.key",
5648 java_libs: ["myjar"],
5649 }
5650
5651 apex_key {
5652 name: "myapex.key",
5653 public_key: "testkey.avbpubkey",
5654 private_key: "testkey.pem",
5655 }
5656
5657 java_library {
5658 name: "myjar",
5659 srcs: ["foo/bar/MyClass.java"],
5660 sdk_version: "none",
5661 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005662 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005663 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005664 }
5665 `)
5666}
5667
Bill Peckhama41a6962021-01-11 10:58:54 -08005668func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005669 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005670 apex {
5671 name: "myapex",
5672 key: "myapex.key",
5673 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005674 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005675 }
5676
5677 apex_key {
5678 name: "myapex.key",
5679 public_key: "testkey.avbpubkey",
5680 private_key: "testkey.pem",
5681 }
5682
5683 java_import {
5684 name: "myjavaimport",
5685 apex_available: ["myapex"],
5686 jars: ["my.jar"],
5687 compile_dex: true,
5688 }
5689 `)
5690
5691 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5692 apexRule := module.Rule("apexRule")
5693 copyCmds := apexRule.Args["copy_commands"]
5694 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5695}
5696
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005697func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005698 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005699 apex {
5700 name: "myapex",
5701 key: "myapex.key",
5702 apps: [
5703 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005704 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005705 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005706 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005707 }
5708
5709 apex_key {
5710 name: "myapex.key",
5711 public_key: "testkey.avbpubkey",
5712 private_key: "testkey.pem",
5713 }
5714
5715 android_app {
5716 name: "AppFoo",
5717 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005718 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005719 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005720 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005721 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005722 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005723 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005724
5725 android_app {
5726 name: "AppFooPriv",
5727 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005728 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005729 system_modules: "none",
5730 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005731 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005732 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005733 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005734
5735 cc_library_shared {
5736 name: "libjni",
5737 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005738 shared_libs: ["libfoo"],
5739 stl: "none",
5740 system_shared_libs: [],
5741 apex_available: [ "myapex" ],
5742 sdk_version: "current",
5743 }
5744
5745 cc_library_shared {
5746 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005747 stl: "none",
5748 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005749 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005750 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005751 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005752 `)
5753
Sundong Ahnabb64432019-10-22 13:58:29 +09005754 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005755 apexRule := module.Rule("apexRule")
5756 copyCmds := apexRule.Args["copy_commands"]
5757
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005758 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5759 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005760
Colin Crossaede88c2020-08-11 12:17:01 -07005761 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005762 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005763 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005764 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005765 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005766 // JNI libraries including transitive deps are
5767 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005768 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005769 // ... embedded inside APK (jnilibs.zip)
5770 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5771 // ... and not directly inside the APEX
5772 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5773 }
Dario Frenicde2a032019-10-27 00:29:22 +01005774}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005775
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005776func TestApexWithAppImportBuildId(t *testing.T) {
5777 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5778 for _, id := range invalidBuildIds {
5779 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5780 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5781 variables.BuildId = proptools.StringPtr(id)
5782 })
5783 testApexError(t, message, `apex {
5784 name: "myapex",
5785 key: "myapex.key",
5786 apps: ["AppFooPrebuilt"],
5787 updatable: false,
5788 }
5789
5790 apex_key {
5791 name: "myapex.key",
5792 public_key: "testkey.avbpubkey",
5793 private_key: "testkey.pem",
5794 }
5795
5796 android_app_import {
5797 name: "AppFooPrebuilt",
5798 apk: "PrebuiltAppFoo.apk",
5799 presigned: true,
5800 apex_available: ["myapex"],
5801 }
5802 `, fixture)
5803 }
5804}
5805
Dario Frenicde2a032019-10-27 00:29:22 +01005806func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005807 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005808 apex {
5809 name: "myapex",
5810 key: "myapex.key",
5811 apps: [
5812 "AppFooPrebuilt",
5813 "AppFooPrivPrebuilt",
5814 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005815 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005816 }
5817
5818 apex_key {
5819 name: "myapex.key",
5820 public_key: "testkey.avbpubkey",
5821 private_key: "testkey.pem",
5822 }
5823
5824 android_app_import {
5825 name: "AppFooPrebuilt",
5826 apk: "PrebuiltAppFoo.apk",
5827 presigned: true,
5828 dex_preopt: {
5829 enabled: false,
5830 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005831 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005832 }
5833
5834 android_app_import {
5835 name: "AppFooPrivPrebuilt",
5836 apk: "PrebuiltAppFooPriv.apk",
5837 privileged: true,
5838 presigned: true,
5839 dex_preopt: {
5840 enabled: false,
5841 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005842 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005843 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005844 }
5845 `)
5846
Sundong Ahnabb64432019-10-22 13:58:29 +09005847 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005848 apexRule := module.Rule("apexRule")
5849 copyCmds := apexRule.Args["copy_commands"]
5850
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005851 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5852 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005853}
5854
5855func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005856 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005857 apex {
5858 name: "myapex",
5859 key: "myapex.key",
5860 apps: [
5861 "AppFoo",
5862 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005863 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005864 }
5865
5866 apex_key {
5867 name: "myapex.key",
5868 public_key: "testkey.avbpubkey",
5869 private_key: "testkey.pem",
5870 }
5871
5872 android_app {
5873 name: "AppFoo",
5874 srcs: ["foo/bar/MyClass.java"],
5875 sdk_version: "none",
5876 system_modules: "none",
5877 apex_available: [ "myapex" ],
5878 }
5879
5880 android_app_import {
5881 name: "AppFoo",
5882 apk: "AppFooPrebuilt.apk",
5883 filename: "AppFooPrebuilt.apk",
5884 presigned: true,
5885 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005886 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005887 }
5888 `, withFiles(map[string][]byte{
5889 "AppFooPrebuilt.apk": nil,
5890 }))
5891
5892 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005893 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005894 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005895}
5896
Dario Freni6f3937c2019-12-20 22:58:03 +00005897func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005898 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005899 apex {
5900 name: "myapex",
5901 key: "myapex.key",
5902 apps: [
5903 "TesterHelpAppFoo",
5904 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005905 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005906 }
5907
5908 apex_key {
5909 name: "myapex.key",
5910 public_key: "testkey.avbpubkey",
5911 private_key: "testkey.pem",
5912 }
5913
5914 android_test_helper_app {
5915 name: "TesterHelpAppFoo",
5916 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005917 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005918 }
5919
5920 `)
5921
5922 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5923 apexRule := module.Rule("apexRule")
5924 copyCmds := apexRule.Args["copy_commands"]
5925
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005926 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005927}
5928
Jooyung Han18020ea2019-11-13 10:50:48 +09005929func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5930 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005931 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005932 apex {
5933 name: "myapex",
5934 key: "myapex.key",
5935 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005936 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005937 }
5938
5939 apex_key {
5940 name: "myapex.key",
5941 public_key: "testkey.avbpubkey",
5942 private_key: "testkey.pem",
5943 }
5944
5945 apex {
5946 name: "otherapex",
5947 key: "myapex.key",
5948 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005949 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005950 }
5951
5952 cc_defaults {
5953 name: "libfoo-defaults",
5954 apex_available: ["otherapex"],
5955 }
5956
5957 cc_library {
5958 name: "libfoo",
5959 defaults: ["libfoo-defaults"],
5960 stl: "none",
5961 system_shared_libs: [],
5962 }`)
5963}
5964
Paul Duffine52e66f2020-03-30 17:54:29 +01005965func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005966 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005967 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005968 apex {
5969 name: "myapex",
5970 key: "myapex.key",
5971 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005972 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005973 }
5974
5975 apex_key {
5976 name: "myapex.key",
5977 public_key: "testkey.avbpubkey",
5978 private_key: "testkey.pem",
5979 }
5980
5981 apex {
5982 name: "otherapex",
5983 key: "otherapex.key",
5984 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005985 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005986 }
5987
5988 apex_key {
5989 name: "otherapex.key",
5990 public_key: "testkey.avbpubkey",
5991 private_key: "testkey.pem",
5992 }
5993
5994 cc_library {
5995 name: "libfoo",
5996 stl: "none",
5997 system_shared_libs: [],
5998 apex_available: ["otherapex"],
5999 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006000}
Jiyong Park127b40b2019-09-30 16:04:35 +09006001
Paul Duffine52e66f2020-03-30 17:54:29 +01006002func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006003 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006004 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006005.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006006.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006007.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006008.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006009.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006010.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006011 apex {
6012 name: "myapex",
6013 key: "myapex.key",
6014 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006015 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006016 }
6017
6018 apex_key {
6019 name: "myapex.key",
6020 public_key: "testkey.avbpubkey",
6021 private_key: "testkey.pem",
6022 }
6023
Jiyong Park127b40b2019-09-30 16:04:35 +09006024 cc_library {
6025 name: "libfoo",
6026 stl: "none",
6027 shared_libs: ["libbar"],
6028 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006029 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006030 }
6031
6032 cc_library {
6033 name: "libbar",
6034 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006035 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006036 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006037 apex_available: ["myapex"],
6038 }
6039
6040 cc_library {
6041 name: "libbaz",
6042 stl: "none",
6043 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006044 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006045}
Jiyong Park127b40b2019-09-30 16:04:35 +09006046
Paul Duffine52e66f2020-03-30 17:54:29 +01006047func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006048 testApexError(t, "\"otherapex\" is not a valid module name", `
6049 apex {
6050 name: "myapex",
6051 key: "myapex.key",
6052 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006053 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006054 }
6055
6056 apex_key {
6057 name: "myapex.key",
6058 public_key: "testkey.avbpubkey",
6059 private_key: "testkey.pem",
6060 }
6061
6062 cc_library {
6063 name: "libfoo",
6064 stl: "none",
6065 system_shared_libs: [],
6066 apex_available: ["otherapex"],
6067 }`)
6068
Paul Duffine52e66f2020-03-30 17:54:29 +01006069 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006070 apex {
6071 name: "myapex",
6072 key: "myapex.key",
6073 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006074 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006075 }
6076
6077 apex_key {
6078 name: "myapex.key",
6079 public_key: "testkey.avbpubkey",
6080 private_key: "testkey.pem",
6081 }
6082
6083 cc_library {
6084 name: "libfoo",
6085 stl: "none",
6086 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006087 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006088 apex_available: ["myapex"],
6089 }
6090
6091 cc_library {
6092 name: "libbar",
6093 stl: "none",
6094 system_shared_libs: [],
6095 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006096 }
6097
6098 cc_library {
6099 name: "libbaz",
6100 stl: "none",
6101 system_shared_libs: [],
6102 stubs: {
6103 versions: ["10", "20", "30"],
6104 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006105 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006106}
Jiyong Park127b40b2019-09-30 16:04:35 +09006107
Jiyong Park89e850a2020-04-07 16:37:39 +09006108func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006109 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006110 apex {
6111 name: "myapex",
6112 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006113 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006114 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006115 }
6116
6117 apex_key {
6118 name: "myapex.key",
6119 public_key: "testkey.avbpubkey",
6120 private_key: "testkey.pem",
6121 }
6122
6123 cc_library {
6124 name: "libfoo",
6125 stl: "none",
6126 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006127 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006128 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006129 }
6130
6131 cc_library {
6132 name: "libfoo2",
6133 stl: "none",
6134 system_shared_libs: [],
6135 shared_libs: ["libbaz"],
6136 apex_available: ["//apex_available:platform"],
6137 }
6138
6139 cc_library {
6140 name: "libbar",
6141 stl: "none",
6142 system_shared_libs: [],
6143 apex_available: ["myapex"],
6144 }
6145
6146 cc_library {
6147 name: "libbaz",
6148 stl: "none",
6149 system_shared_libs: [],
6150 apex_available: ["myapex"],
6151 stubs: {
6152 versions: ["1"],
6153 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006154 }`)
6155
Jiyong Park89e850a2020-04-07 16:37:39 +09006156 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6157 // because it depends on libbar which isn't available to platform
6158 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6159 if libfoo.NotAvailableForPlatform() != true {
6160 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6161 }
6162
6163 // libfoo2 however can be available to platform because it depends on libbaz which provides
6164 // stubs
6165 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6166 if libfoo2.NotAvailableForPlatform() == true {
6167 t.Errorf("%q should be available to platform", libfoo2.String())
6168 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006169}
Jiyong Parka90ca002019-10-07 15:47:24 +09006170
Paul Duffine52e66f2020-03-30 17:54:29 +01006171func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006172 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006173 apex {
6174 name: "myapex",
6175 key: "myapex.key",
6176 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006177 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006178 }
6179
6180 apex_key {
6181 name: "myapex.key",
6182 public_key: "testkey.avbpubkey",
6183 private_key: "testkey.pem",
6184 }
6185
6186 cc_library {
6187 name: "libfoo",
6188 stl: "none",
6189 system_shared_libs: [],
6190 apex_available: ["myapex"],
6191 static: {
6192 apex_available: ["//apex_available:platform"],
6193 },
6194 }`)
6195
Jiyong Park89e850a2020-04-07 16:37:39 +09006196 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6197 if libfooShared.NotAvailableForPlatform() != true {
6198 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6199 }
6200 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6201 if libfooStatic.NotAvailableForPlatform() != false {
6202 t.Errorf("%q should be available to platform", libfooStatic.String())
6203 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006204}
6205
Jiyong Park5d790c32019-11-15 18:40:32 +09006206func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006207 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006208 apex {
6209 name: "myapex",
6210 key: "myapex.key",
6211 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006212 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006213 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006214 bootclasspath_fragments: ["mybootclasspath_fragment"],
6215 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6216 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006217 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006218 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006219 }
6220
6221 override_apex {
6222 name: "override_myapex",
6223 base: "myapex",
6224 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006225 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006226 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006227 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6228 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6229 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006230 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006231 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006232 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006233 key: "mynewapex.key",
6234 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006235 }
6236
6237 apex_key {
6238 name: "myapex.key",
6239 public_key: "testkey.avbpubkey",
6240 private_key: "testkey.pem",
6241 }
6242
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006243 apex_key {
6244 name: "mynewapex.key",
6245 public_key: "testkey2.avbpubkey",
6246 private_key: "testkey2.pem",
6247 }
6248
6249 android_app_certificate {
6250 name: "myapex.certificate",
6251 certificate: "testkey",
6252 }
6253
Jiyong Park5d790c32019-11-15 18:40:32 +09006254 android_app {
6255 name: "app",
6256 srcs: ["foo/bar/MyClass.java"],
6257 package_name: "foo",
6258 sdk_version: "none",
6259 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006260 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006261 }
6262
6263 override_android_app {
6264 name: "override_app",
6265 base: "app",
6266 package_name: "bar",
6267 }
markchien7c803b82021-08-26 22:10:06 +08006268
6269 bpf {
6270 name: "bpf",
6271 srcs: ["bpf.c"],
6272 }
6273
6274 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006275 name: "overrideBpf",
6276 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006277 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006278
6279 prebuilt_etc {
6280 name: "myetc",
6281 src: "myprebuilt",
6282 }
6283
6284 prebuilt_etc {
6285 name: "override_myetc",
6286 src: "override_myprebuilt",
6287 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006288
6289 java_library {
6290 name: "bcplib",
6291 srcs: ["a.java"],
6292 compile_dex: true,
6293 apex_available: ["myapex"],
6294 permitted_packages: ["bcp.lib"],
6295 }
6296
6297 bootclasspath_fragment {
6298 name: "mybootclasspath_fragment",
6299 contents: ["bcplib"],
6300 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006301 hidden_api: {
6302 split_packages: ["*"],
6303 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006304 }
6305
6306 java_library {
6307 name: "override_bcplib",
6308 srcs: ["a.java"],
6309 compile_dex: true,
6310 apex_available: ["myapex"],
6311 permitted_packages: ["override.bcp.lib"],
6312 }
6313
6314 bootclasspath_fragment {
6315 name: "override_bootclasspath_fragment",
6316 contents: ["override_bcplib"],
6317 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006318 hidden_api: {
6319 split_packages: ["*"],
6320 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006321 }
6322
6323 java_library {
6324 name: "systemserverlib",
6325 srcs: ["a.java"],
6326 apex_available: ["myapex"],
6327 }
6328
6329 systemserverclasspath_fragment {
6330 name: "mysystemserverclasspath_fragment",
6331 standalone_contents: ["systemserverlib"],
6332 apex_available: ["myapex"],
6333 }
6334
6335 java_library {
6336 name: "override_systemserverlib",
6337 srcs: ["a.java"],
6338 apex_available: ["myapex"],
6339 }
6340
6341 systemserverclasspath_fragment {
6342 name: "override_systemserverclasspath_fragment",
6343 standalone_contents: ["override_systemserverlib"],
6344 apex_available: ["myapex"],
6345 }
6346
6347 java_library {
6348 name: "myjava_library",
6349 srcs: ["a.java"],
6350 compile_dex: true,
6351 apex_available: ["myapex"],
6352 }
6353
6354 java_library {
6355 name: "override_java_library",
6356 srcs: ["a.java"],
6357 compile_dex: true,
6358 apex_available: ["myapex"],
6359 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006360 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006361
Jiyong Park317645e2019-12-05 13:20:58 +09006362 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6363 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6364 if originalVariant.GetOverriddenBy() != "" {
6365 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6366 }
6367 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6368 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6369 }
6370
Jiyong Park5d790c32019-11-15 18:40:32 +09006371 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6372 apexRule := module.Rule("apexRule")
6373 copyCmds := apexRule.Args["copy_commands"]
6374
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006375 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6376 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006377
markchien7c803b82021-08-26 22:10:06 +08006378 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006379 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006380
Daniel Norman5a3ce132021-08-26 15:44:43 -07006381 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6382 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6383
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006384 apexBundle := module.Module().(*apexBundle)
6385 name := apexBundle.Name()
6386 if name != "override_myapex" {
6387 t.Errorf("name should be \"override_myapex\", but was %q", name)
6388 }
6389
Baligh Uddin004d7172020-02-19 21:29:28 -08006390 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6391 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6392 }
6393
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006394 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6395 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6396 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6397 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6398 android.AssertArrayString(t, "Java_libs does not match",
6399 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6400
Jiyong Park20bacab2020-03-03 11:45:41 +09006401 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006402 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006403 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6404
6405 signApkRule := module.Rule("signapk")
6406 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006407
Colin Crossaa255532020-07-03 13:18:24 -07006408 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006409 var builder strings.Builder
6410 data.Custom(&builder, name, "TARGET_", "", data)
6411 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006412 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Ken Chen5372a242022-07-07 17:48:06 +08006413 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006414 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006415 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6416 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6417 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006418 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006419 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006420 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006421 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006422 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006423 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006424 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6425 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6426 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006427 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006428}
6429
Albert Martineefabcf2022-03-21 20:11:16 +00006430func TestMinSdkVersionOverride(t *testing.T) {
6431 // Override from 29 to 31
6432 minSdkOverride31 := "31"
6433 ctx := testApex(t, `
6434 apex {
6435 name: "myapex",
6436 key: "myapex.key",
6437 native_shared_libs: ["mylib"],
6438 updatable: true,
6439 min_sdk_version: "29"
6440 }
6441
6442 override_apex {
6443 name: "override_myapex",
6444 base: "myapex",
6445 logging_parent: "com.foo.bar",
6446 package_name: "test.overridden.package"
6447 }
6448
6449 apex_key {
6450 name: "myapex.key",
6451 public_key: "testkey.avbpubkey",
6452 private_key: "testkey.pem",
6453 }
6454
6455 cc_library {
6456 name: "mylib",
6457 srcs: ["mylib.cpp"],
6458 runtime_libs: ["libbar"],
6459 system_shared_libs: [],
6460 stl: "none",
6461 apex_available: [ "myapex" ],
6462 min_sdk_version: "apex_inherit"
6463 }
6464
6465 cc_library {
6466 name: "libbar",
6467 srcs: ["mylib.cpp"],
6468 system_shared_libs: [],
6469 stl: "none",
6470 apex_available: [ "myapex" ],
6471 min_sdk_version: "apex_inherit"
6472 }
6473
6474 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6475
6476 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6477 copyCmds := apexRule.Args["copy_commands"]
6478
6479 // Ensure that direct non-stubs dep is always included
6480 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6481
6482 // Ensure that runtime_libs dep in included
6483 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6484
6485 // Ensure libraries target overridden min_sdk_version value
6486 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6487}
6488
6489func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6490 // Attempt to override from 31 to 29, should be a NOOP
6491 minSdkOverride29 := "29"
6492 ctx := testApex(t, `
6493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["mylib"],
6497 updatable: true,
6498 min_sdk_version: "31"
6499 }
6500
6501 override_apex {
6502 name: "override_myapex",
6503 base: "myapex",
6504 logging_parent: "com.foo.bar",
6505 package_name: "test.overridden.package"
6506 }
6507
6508 apex_key {
6509 name: "myapex.key",
6510 public_key: "testkey.avbpubkey",
6511 private_key: "testkey.pem",
6512 }
6513
6514 cc_library {
6515 name: "mylib",
6516 srcs: ["mylib.cpp"],
6517 runtime_libs: ["libbar"],
6518 system_shared_libs: [],
6519 stl: "none",
6520 apex_available: [ "myapex" ],
6521 min_sdk_version: "apex_inherit"
6522 }
6523
6524 cc_library {
6525 name: "libbar",
6526 srcs: ["mylib.cpp"],
6527 system_shared_libs: [],
6528 stl: "none",
6529 apex_available: [ "myapex" ],
6530 min_sdk_version: "apex_inherit"
6531 }
6532
6533 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6534
6535 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6536 copyCmds := apexRule.Args["copy_commands"]
6537
6538 // Ensure that direct non-stubs dep is always included
6539 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6540
6541 // Ensure that runtime_libs dep in included
6542 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6543
6544 // Ensure libraries target the original min_sdk_version value rather than the overridden
6545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6546}
6547
Jooyung Han214bf372019-11-12 13:03:50 +09006548func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006549 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006550 apex {
6551 name: "myapex",
6552 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006553 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006554 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006555 }
6556
6557 apex_key {
6558 name: "myapex.key",
6559 public_key: "testkey.avbpubkey",
6560 private_key: "testkey.pem",
6561 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006562
6563 cc_library {
6564 name: "mylib",
6565 srcs: ["mylib.cpp"],
6566 stl: "libc++",
6567 system_shared_libs: [],
6568 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006569 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006570 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006571 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006572
6573 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6574 args := module.Rule("apexRule").Args
6575 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006576 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006577
6578 // The copies of the libraries in the apex should have one more dependency than
6579 // the ones outside the apex, namely the unwinder. Ideally we should check
6580 // the dependency names directly here but for some reason the names are blank in
6581 // this test.
6582 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006583 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006584 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6585 if len(apexImplicits) != len(nonApexImplicits)+1 {
6586 t.Errorf("%q missing unwinder dep", lib)
6587 }
6588 }
Jooyung Han214bf372019-11-12 13:03:50 +09006589}
6590
Paul Duffine05480a2021-03-08 15:07:14 +00006591var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006592 "api/current.txt": nil,
6593 "api/removed.txt": nil,
6594 "api/system-current.txt": nil,
6595 "api/system-removed.txt": nil,
6596 "api/test-current.txt": nil,
6597 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006598
Anton Hanssondff2c782020-12-21 17:10:01 +00006599 "100/public/api/foo.txt": nil,
6600 "100/public/api/foo-removed.txt": nil,
6601 "100/system/api/foo.txt": nil,
6602 "100/system/api/foo-removed.txt": nil,
6603
Paul Duffineedc5d52020-06-12 17:46:39 +01006604 // For java_sdk_library_import
6605 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006606}
6607
Jooyung Han58f26ab2019-12-18 15:34:32 +09006608func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006609 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006610 apex {
6611 name: "myapex",
6612 key: "myapex.key",
6613 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006614 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006615 }
6616
6617 apex_key {
6618 name: "myapex.key",
6619 public_key: "testkey.avbpubkey",
6620 private_key: "testkey.pem",
6621 }
6622
6623 java_sdk_library {
6624 name: "foo",
6625 srcs: ["a.java"],
6626 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006627 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006628 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006629
6630 prebuilt_apis {
6631 name: "sdk",
6632 api_dirs: ["100"],
6633 }
Paul Duffin9b879592020-05-26 13:21:35 +01006634 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006635
6636 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006637 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006638 "javalib/foo.jar",
6639 "etc/permissions/foo.xml",
6640 })
6641 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006642 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006643 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 +09006644}
6645
Paul Duffin9b879592020-05-26 13:21:35 +01006646func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006647 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006648 apex {
6649 name: "myapex",
6650 key: "myapex.key",
6651 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006652 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006653 }
6654
6655 apex_key {
6656 name: "myapex.key",
6657 public_key: "testkey.avbpubkey",
6658 private_key: "testkey.pem",
6659 }
6660
6661 java_sdk_library {
6662 name: "foo",
6663 srcs: ["a.java"],
6664 api_packages: ["foo"],
6665 apex_available: ["myapex"],
6666 sdk_version: "none",
6667 system_modules: "none",
6668 }
6669
6670 java_library {
6671 name: "bar",
6672 srcs: ["a.java"],
6673 libs: ["foo"],
6674 apex_available: ["myapex"],
6675 sdk_version: "none",
6676 system_modules: "none",
6677 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006678
6679 prebuilt_apis {
6680 name: "sdk",
6681 api_dirs: ["100"],
6682 }
Paul Duffin9b879592020-05-26 13:21:35 +01006683 `, withFiles(filesForSdkLibrary))
6684
6685 // java_sdk_library installs both impl jar and permission XML
6686 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6687 "javalib/bar.jar",
6688 "javalib/foo.jar",
6689 "etc/permissions/foo.xml",
6690 })
6691
6692 // The bar library should depend on the implementation jar.
6693 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006694 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006695 t.Errorf("expected %q, found %#q", expected, actual)
6696 }
6697}
6698
6699func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006700 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006701 apex {
6702 name: "myapex",
6703 key: "myapex.key",
6704 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006705 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006706 }
6707
6708 apex_key {
6709 name: "myapex.key",
6710 public_key: "testkey.avbpubkey",
6711 private_key: "testkey.pem",
6712 }
6713
6714 java_sdk_library {
6715 name: "foo",
6716 srcs: ["a.java"],
6717 api_packages: ["foo"],
6718 apex_available: ["myapex"],
6719 sdk_version: "none",
6720 system_modules: "none",
6721 }
6722
6723 java_library {
6724 name: "bar",
6725 srcs: ["a.java"],
6726 libs: ["foo"],
6727 sdk_version: "none",
6728 system_modules: "none",
6729 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006730
6731 prebuilt_apis {
6732 name: "sdk",
6733 api_dirs: ["100"],
6734 }
Paul Duffin9b879592020-05-26 13:21:35 +01006735 `, withFiles(filesForSdkLibrary))
6736
6737 // java_sdk_library installs both impl jar and permission XML
6738 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6739 "javalib/foo.jar",
6740 "etc/permissions/foo.xml",
6741 })
6742
6743 // The bar library should depend on the stubs jar.
6744 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006745 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006746 t.Errorf("expected %q, found %#q", expected, actual)
6747 }
6748}
6749
Paul Duffineedc5d52020-06-12 17:46:39 +01006750func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006751 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006752 prebuilt_apis {
6753 name: "sdk",
6754 api_dirs: ["100"],
6755 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006756 withFiles(map[string][]byte{
6757 "apex/a.java": nil,
6758 "apex/apex_manifest.json": nil,
6759 "apex/Android.bp": []byte(`
6760 package {
6761 default_visibility: ["//visibility:private"],
6762 }
6763
6764 apex {
6765 name: "myapex",
6766 key: "myapex.key",
6767 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006768 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006769 }
6770
6771 apex_key {
6772 name: "myapex.key",
6773 public_key: "testkey.avbpubkey",
6774 private_key: "testkey.pem",
6775 }
6776
6777 java_library {
6778 name: "bar",
6779 srcs: ["a.java"],
6780 libs: ["foo"],
6781 apex_available: ["myapex"],
6782 sdk_version: "none",
6783 system_modules: "none",
6784 }
6785`),
6786 "source/a.java": nil,
6787 "source/api/current.txt": nil,
6788 "source/api/removed.txt": nil,
6789 "source/Android.bp": []byte(`
6790 package {
6791 default_visibility: ["//visibility:private"],
6792 }
6793
6794 java_sdk_library {
6795 name: "foo",
6796 visibility: ["//apex"],
6797 srcs: ["a.java"],
6798 api_packages: ["foo"],
6799 apex_available: ["myapex"],
6800 sdk_version: "none",
6801 system_modules: "none",
6802 public: {
6803 enabled: true,
6804 },
6805 }
6806`),
6807 "prebuilt/a.jar": nil,
6808 "prebuilt/Android.bp": []byte(`
6809 package {
6810 default_visibility: ["//visibility:private"],
6811 }
6812
6813 java_sdk_library_import {
6814 name: "foo",
6815 visibility: ["//apex", "//source"],
6816 apex_available: ["myapex"],
6817 prefer: true,
6818 public: {
6819 jars: ["a.jar"],
6820 },
6821 }
6822`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006823 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006824 )
6825
6826 // java_sdk_library installs both impl jar and permission XML
6827 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6828 "javalib/bar.jar",
6829 "javalib/foo.jar",
6830 "etc/permissions/foo.xml",
6831 })
6832
6833 // The bar library should depend on the implementation jar.
6834 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006835 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006836 t.Errorf("expected %q, found %#q", expected, actual)
6837 }
6838}
6839
6840func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6841 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6842 apex {
6843 name: "myapex",
6844 key: "myapex.key",
6845 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006846 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006847 }
6848
6849 apex_key {
6850 name: "myapex.key",
6851 public_key: "testkey.avbpubkey",
6852 private_key: "testkey.pem",
6853 }
6854
6855 java_sdk_library_import {
6856 name: "foo",
6857 apex_available: ["myapex"],
6858 prefer: true,
6859 public: {
6860 jars: ["a.jar"],
6861 },
6862 }
6863
6864 `, withFiles(filesForSdkLibrary))
6865}
6866
atrost6e126252020-01-27 17:01:16 +00006867func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006868 result := android.GroupFixturePreparers(
6869 prepareForApexTest,
6870 java.PrepareForTestWithPlatformCompatConfig,
6871 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006872 apex {
6873 name: "myapex",
6874 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006875 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006876 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006877 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006878 }
6879
6880 apex_key {
6881 name: "myapex.key",
6882 public_key: "testkey.avbpubkey",
6883 private_key: "testkey.pem",
6884 }
6885
6886 platform_compat_config {
6887 name: "myjar-platform-compat-config",
6888 src: ":myjar",
6889 }
6890
6891 java_library {
6892 name: "myjar",
6893 srcs: ["foo/bar/MyClass.java"],
6894 sdk_version: "none",
6895 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006896 apex_available: [ "myapex" ],
6897 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006898
6899 // Make sure that a preferred prebuilt does not affect the apex contents.
6900 prebuilt_platform_compat_config {
6901 name: "myjar-platform-compat-config",
6902 metadata: "compat-config/metadata.xml",
6903 prefer: true,
6904 }
atrost6e126252020-01-27 17:01:16 +00006905 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006906 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006907 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6908 "etc/compatconfig/myjar-platform-compat-config.xml",
6909 "javalib/myjar.jar",
6910 })
6911}
6912
Jiyong Park479321d2019-12-16 11:47:12 +09006913func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6914 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6915 apex {
6916 name: "myapex",
6917 key: "myapex.key",
6918 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006919 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006920 }
6921
6922 apex_key {
6923 name: "myapex.key",
6924 public_key: "testkey.avbpubkey",
6925 private_key: "testkey.pem",
6926 }
6927
6928 java_library {
6929 name: "myjar",
6930 srcs: ["foo/bar/MyClass.java"],
6931 sdk_version: "none",
6932 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006933 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006934 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006935 }
6936 `)
6937}
6938
Jiyong Park7afd1072019-12-30 16:56:33 +09006939func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006940 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006941 apex {
6942 name: "myapex",
6943 key: "myapex.key",
6944 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006945 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006946 }
6947
6948 apex_key {
6949 name: "myapex.key",
6950 public_key: "testkey.avbpubkey",
6951 private_key: "testkey.pem",
6952 }
6953
6954 cc_library {
6955 name: "mylib",
6956 srcs: ["mylib.cpp"],
6957 system_shared_libs: [],
6958 stl: "none",
6959 required: ["a", "b"],
6960 host_required: ["c", "d"],
6961 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006962 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006963 }
6964 `)
6965
6966 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006967 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006968 name := apexBundle.BaseModuleName()
6969 prefix := "TARGET_"
6970 var builder strings.Builder
6971 data.Custom(&builder, name, prefix, "", data)
6972 androidMk := builder.String()
6973 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6974 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6975 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6976}
6977
Jiyong Park7cd10e32020-01-14 09:22:18 +09006978func TestSymlinksFromApexToSystem(t *testing.T) {
6979 bp := `
6980 apex {
6981 name: "myapex",
6982 key: "myapex.key",
6983 native_shared_libs: ["mylib"],
6984 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006985 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006986 }
6987
Jiyong Park9d677202020-02-19 16:29:35 +09006988 apex {
6989 name: "myapex.updatable",
6990 key: "myapex.key",
6991 native_shared_libs: ["mylib"],
6992 java_libs: ["myjar"],
6993 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006994 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006995 }
6996
Jiyong Park7cd10e32020-01-14 09:22:18 +09006997 apex_key {
6998 name: "myapex.key",
6999 public_key: "testkey.avbpubkey",
7000 private_key: "testkey.pem",
7001 }
7002
7003 cc_library {
7004 name: "mylib",
7005 srcs: ["mylib.cpp"],
7006 shared_libs: ["myotherlib"],
7007 system_shared_libs: [],
7008 stl: "none",
7009 apex_available: [
7010 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007011 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007012 "//apex_available:platform",
7013 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007014 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007015 }
7016
7017 cc_library {
7018 name: "myotherlib",
7019 srcs: ["mylib.cpp"],
7020 system_shared_libs: [],
7021 stl: "none",
7022 apex_available: [
7023 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007024 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007025 "//apex_available:platform",
7026 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007027 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007028 }
7029
7030 java_library {
7031 name: "myjar",
7032 srcs: ["foo/bar/MyClass.java"],
7033 sdk_version: "none",
7034 system_modules: "none",
7035 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007036 apex_available: [
7037 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007038 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007039 "//apex_available:platform",
7040 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007041 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007042 }
7043
7044 java_library {
7045 name: "myotherjar",
7046 srcs: ["foo/bar/MyClass.java"],
7047 sdk_version: "none",
7048 system_modules: "none",
7049 apex_available: [
7050 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007051 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007052 "//apex_available:platform",
7053 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007054 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007055 }
7056 `
7057
7058 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7059 for _, f := range files {
7060 if f.path == file {
7061 if f.isLink {
7062 t.Errorf("%q is not a real file", file)
7063 }
7064 return
7065 }
7066 }
7067 t.Errorf("%q is not found", file)
7068 }
7069
7070 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7071 for _, f := range files {
7072 if f.path == file {
7073 if !f.isLink {
7074 t.Errorf("%q is not a symlink", file)
7075 }
7076 return
7077 }
7078 }
7079 t.Errorf("%q is not found", file)
7080 }
7081
Jiyong Park9d677202020-02-19 16:29:35 +09007082 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7083 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007084 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007085 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007086 ensureRealfileExists(t, files, "javalib/myjar.jar")
7087 ensureRealfileExists(t, files, "lib64/mylib.so")
7088 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7089
Jiyong Park9d677202020-02-19 16:29:35 +09007090 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7091 ensureRealfileExists(t, files, "javalib/myjar.jar")
7092 ensureRealfileExists(t, files, "lib64/mylib.so")
7093 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7094
7095 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007096 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007097 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007098 ensureRealfileExists(t, files, "javalib/myjar.jar")
7099 ensureRealfileExists(t, files, "lib64/mylib.so")
7100 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007101
7102 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7103 ensureRealfileExists(t, files, "javalib/myjar.jar")
7104 ensureRealfileExists(t, files, "lib64/mylib.so")
7105 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007106}
7107
Yo Chiange8128052020-07-23 20:09:18 +08007108func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007109 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007110 apex {
7111 name: "myapex",
7112 key: "myapex.key",
7113 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007114 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007115 }
7116
7117 apex_key {
7118 name: "myapex.key",
7119 public_key: "testkey.avbpubkey",
7120 private_key: "testkey.pem",
7121 }
7122
7123 cc_library_shared {
7124 name: "mylib",
7125 srcs: ["mylib.cpp"],
7126 shared_libs: ["myotherlib"],
7127 system_shared_libs: [],
7128 stl: "none",
7129 apex_available: [
7130 "myapex",
7131 "//apex_available:platform",
7132 ],
7133 }
7134
7135 cc_prebuilt_library_shared {
7136 name: "myotherlib",
7137 srcs: ["prebuilt.so"],
7138 system_shared_libs: [],
7139 stl: "none",
7140 apex_available: [
7141 "myapex",
7142 "//apex_available:platform",
7143 ],
7144 }
7145 `)
7146
7147 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007148 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007149 var builder strings.Builder
7150 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7151 androidMk := builder.String()
7152 // `myotherlib` is added to `myapex` as symlink
7153 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7154 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7155 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7156 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007157 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 +08007158}
7159
Jooyung Han643adc42020-02-27 13:50:06 +09007160func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007161 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007162 apex {
7163 name: "myapex",
7164 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007165 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007166 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007167 }
7168
7169 apex_key {
7170 name: "myapex.key",
7171 public_key: "testkey.avbpubkey",
7172 private_key: "testkey.pem",
7173 }
7174
7175 cc_library {
7176 name: "mylib",
7177 srcs: ["mylib.cpp"],
7178 shared_libs: ["mylib2"],
7179 system_shared_libs: [],
7180 stl: "none",
7181 apex_available: [ "myapex" ],
7182 }
7183
7184 cc_library {
7185 name: "mylib2",
7186 srcs: ["mylib.cpp"],
7187 system_shared_libs: [],
7188 stl: "none",
7189 apex_available: [ "myapex" ],
7190 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007191
7192 rust_ffi_shared {
7193 name: "libfoo.rust",
7194 crate_name: "foo",
7195 srcs: ["foo.rs"],
7196 shared_libs: ["libfoo.shared_from_rust"],
7197 prefer_rlib: true,
7198 apex_available: ["myapex"],
7199 }
7200
7201 cc_library_shared {
7202 name: "libfoo.shared_from_rust",
7203 srcs: ["mylib.cpp"],
7204 system_shared_libs: [],
7205 stl: "none",
7206 stubs: {
7207 versions: ["10", "11", "12"],
7208 },
7209 }
7210
Jooyung Han643adc42020-02-27 13:50:06 +09007211 `)
7212
7213 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7214 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007215 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007216 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7217 "lib64/mylib.so",
7218 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007219 "lib64/libfoo.rust.so",
7220 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7221 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007222 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007223
7224 // b/220397949
7225 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007226}
7227
Jooyung Han49f67012020-04-17 13:43:10 +09007228func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007229 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007230 apex {
7231 name: "myapex",
7232 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007233 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007234 }
7235 apex_key {
7236 name: "myapex.key",
7237 public_key: "testkey.avbpubkey",
7238 private_key: "testkey.pem",
7239 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007240 `,
7241 android.FixtureModifyConfig(func(config android.Config) {
7242 delete(config.Targets, android.Android)
7243 config.AndroidCommonTarget = android.Target{}
7244 }),
7245 )
Jooyung Han49f67012020-04-17 13:43:10 +09007246
7247 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7248 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7249 }
7250}
7251
Jiyong Parkbd159612020-02-28 15:22:21 +09007252func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007253 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007254 apex {
7255 name: "myapex",
7256 key: "myapex.key",
7257 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007258 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007259 }
7260
7261 apex_key {
7262 name: "myapex.key",
7263 public_key: "testkey.avbpubkey",
7264 private_key: "testkey.pem",
7265 }
7266
7267 android_app {
7268 name: "AppFoo",
7269 srcs: ["foo/bar/MyClass.java"],
7270 sdk_version: "none",
7271 system_modules: "none",
7272 apex_available: [ "myapex" ],
7273 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007274 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007275
Colin Crosscf371cc2020-11-13 11:48:42 -08007276 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007277 content := bundleConfigRule.Args["content"]
7278
7279 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007280 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 +09007281}
7282
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007283func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007284 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007285 apex {
7286 name: "myapex",
7287 key: "myapex.key",
7288 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007289 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007290 }
7291
7292 apex_key {
7293 name: "myapex.key",
7294 public_key: "testkey.avbpubkey",
7295 private_key: "testkey.pem",
7296 }
7297
7298 android_app_set {
7299 name: "AppSet",
7300 set: "AppSet.apks",
7301 }`)
7302 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007303 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007304 content := bundleConfigRule.Args["content"]
7305 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7306 s := mod.Rule("apexRule").Args["copy_commands"]
7307 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007308 if len(copyCmds) != 4 {
7309 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007310 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007311 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7312 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007313 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7314 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007315
7316 // Ensure that canned_fs_config has an entry for the app set zip file
7317 generateFsRule := mod.Rule("generateFsConfig")
7318 cmd := generateFsRule.RuleParams.Command
7319 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007320}
7321
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007322func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007323 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007324 apex_set {
7325 name: "myapex",
7326 filename: "foo_v2.apex",
7327 sanitized: {
7328 none: { set: "myapex.apks", },
7329 hwaddress: { set: "myapex.hwasan.apks", },
7330 },
Paul Duffin24704672021-04-06 16:09:30 +01007331 }
7332 `
7333 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007334
Paul Duffin24704672021-04-06 16:09:30 +01007335 // Check that the extractor produces the correct output file from the correct input file.
7336 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007337
Paul Duffin24704672021-04-06 16:09:30 +01007338 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7339 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007340
Paul Duffin24704672021-04-06 16:09:30 +01007341 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7342
7343 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007344 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7345 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007346
7347 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007348}
7349
Pranav Guptaeba03b02022-09-27 00:27:08 +00007350func TestApexSetApksModuleAssignment(t *testing.T) {
7351 ctx := testApex(t, `
7352 apex_set {
7353 name: "myapex",
7354 set: ":myapex_apks_file",
7355 }
7356
7357 filegroup {
7358 name: "myapex_apks_file",
7359 srcs: ["myapex.apks"],
7360 }
7361 `)
7362
7363 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7364
7365 // Check that the extractor produces the correct apks file from the input module
7366 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7367 extractedApex := m.Output(extractorOutput)
7368
7369 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7370}
7371
Paul Duffin89f570a2021-06-16 01:42:33 +01007372func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007373 t.Helper()
7374
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007375 bp := `
7376 java_library {
7377 name: "some-updatable-apex-lib",
7378 srcs: ["a.java"],
7379 sdk_version: "current",
7380 apex_available: [
7381 "some-updatable-apex",
7382 ],
satayevabcd5972021-08-06 17:49:46 +01007383 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007384 }
7385
7386 java_library {
7387 name: "some-non-updatable-apex-lib",
7388 srcs: ["a.java"],
7389 apex_available: [
7390 "some-non-updatable-apex",
7391 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007392 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007393 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007394 }
7395
7396 bootclasspath_fragment {
7397 name: "some-non-updatable-fragment",
7398 contents: ["some-non-updatable-apex-lib"],
7399 apex_available: [
7400 "some-non-updatable-apex",
7401 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007402 hidden_api: {
7403 split_packages: ["*"],
7404 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007405 }
7406
7407 java_library {
7408 name: "some-platform-lib",
7409 srcs: ["a.java"],
7410 sdk_version: "current",
7411 installable: true,
7412 }
7413
7414 java_library {
7415 name: "some-art-lib",
7416 srcs: ["a.java"],
7417 sdk_version: "current",
7418 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007419 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007420 ],
7421 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007422 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007423 }
7424
7425 apex {
7426 name: "some-updatable-apex",
7427 key: "some-updatable-apex.key",
7428 java_libs: ["some-updatable-apex-lib"],
7429 updatable: true,
7430 min_sdk_version: "current",
7431 }
7432
7433 apex {
7434 name: "some-non-updatable-apex",
7435 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007436 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007437 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007438 }
7439
7440 apex_key {
7441 name: "some-updatable-apex.key",
7442 }
7443
7444 apex_key {
7445 name: "some-non-updatable-apex.key",
7446 }
7447
7448 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007449 name: "com.android.art.debug",
7450 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007451 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007452 updatable: true,
7453 min_sdk_version: "current",
7454 }
7455
Paul Duffinf23bc472021-04-27 12:42:20 +01007456 bootclasspath_fragment {
7457 name: "art-bootclasspath-fragment",
7458 image_name: "art",
7459 contents: ["some-art-lib"],
7460 apex_available: [
7461 "com.android.art.debug",
7462 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007463 hidden_api: {
7464 split_packages: ["*"],
7465 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007466 }
7467
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007468 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007469 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007470 }
7471
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007472 filegroup {
7473 name: "some-updatable-apex-file_contexts",
7474 srcs: [
7475 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7476 ],
7477 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007478
7479 filegroup {
7480 name: "some-non-updatable-apex-file_contexts",
7481 srcs: [
7482 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7483 ],
7484 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007485 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007486
Paul Duffin89f570a2021-06-16 01:42:33 +01007487 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007488}
7489
Paul Duffin89f570a2021-06-16 01:42:33 +01007490func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007491 t.Helper()
7492
Paul Duffin55607122021-03-30 23:32:51 +01007493 fs := android.MockFS{
7494 "a.java": nil,
7495 "a.jar": nil,
7496 "apex_manifest.json": nil,
7497 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007498 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007499 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7500 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7501 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007502 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007503 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007504
Paul Duffin55607122021-03-30 23:32:51 +01007505 errorHandler := android.FixtureExpectsNoErrors
7506 if errmsg != "" {
7507 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007508 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007509
Paul Duffin55607122021-03-30 23:32:51 +01007510 result := android.GroupFixturePreparers(
7511 cc.PrepareForTestWithCcDefaultModules,
7512 java.PrepareForTestWithHiddenApiBuildComponents,
7513 java.PrepareForTestWithJavaDefaultModules,
7514 java.PrepareForTestWithJavaSdkLibraryFiles,
7515 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007516 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007517 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007518 android.FixtureModifyMockFS(func(fs android.MockFS) {
7519 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7520 insert := ""
7521 for _, fragment := range fragments {
7522 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7523 }
7524 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7525 platform_bootclasspath {
7526 name: "platform-bootclasspath",
7527 fragments: [
7528 %s
7529 ],
7530 }
7531 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007532 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007533 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007534 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007535 ).
7536 ExtendWithErrorHandler(errorHandler).
7537 RunTestWithBp(t, bp)
7538
7539 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007540}
7541
Paul Duffin5556c5f2022-06-09 17:32:21 +00007542func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007543 preparers := android.GroupFixturePreparers(
7544 java.PrepareForTestWithJavaDefaultModules,
7545 PrepareForTestWithApexBuildComponents,
7546 ).
7547 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7548 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7549
7550 bpBase := `
7551 apex_set {
7552 name: "com.android.myapex",
7553 installable: true,
7554 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7555 set: "myapex.apks",
7556 }
7557
7558 apex_set {
7559 name: "com.mycompany.android.myapex",
7560 apex_name: "com.android.myapex",
7561 installable: true,
7562 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7563 set: "company-myapex.apks",
7564 }
7565
7566 prebuilt_bootclasspath_fragment {
7567 name: "my-bootclasspath-fragment",
7568 apex_available: ["com.android.myapex"],
7569 %s
7570 }
7571 `
7572
7573 t.Run("java_import", func(t *testing.T) {
7574 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7575 java_import {
7576 name: "libfoo",
7577 jars: ["libfoo.jar"],
7578 apex_available: ["com.android.myapex"],
7579 }
7580 `)
7581 })
7582
7583 t.Run("java_sdk_library_import", func(t *testing.T) {
7584 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7585 java_sdk_library_import {
7586 name: "libfoo",
7587 public: {
7588 jars: ["libbar.jar"],
7589 },
7590 apex_available: ["com.android.myapex"],
7591 }
7592 `)
7593 })
7594
7595 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7596 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7597 image_name: "art",
7598 contents: ["libfoo"],
7599 `)+`
7600 java_sdk_library_import {
7601 name: "libfoo",
7602 public: {
7603 jars: ["libbar.jar"],
7604 },
7605 apex_available: ["com.android.myapex"],
7606 }
7607 `)
7608 })
7609}
7610
Paul Duffin5556c5f2022-06-09 17:32:21 +00007611func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7612 preparers := android.GroupFixturePreparers(
7613 java.PrepareForTestWithJavaDefaultModules,
7614 PrepareForTestWithApexBuildComponents,
7615 )
7616
7617 bpBase := `
7618 apex_set {
7619 name: "com.android.myapex",
7620 installable: true,
7621 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7622 set: "myapex.apks",
7623 }
7624
7625 apex_set {
7626 name: "com.android.myapex_compressed",
7627 apex_name: "com.android.myapex",
7628 installable: true,
7629 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7630 set: "myapex_compressed.apks",
7631 }
7632
7633 prebuilt_bootclasspath_fragment {
7634 name: "my-bootclasspath-fragment",
7635 apex_available: [
7636 "com.android.myapex",
7637 "com.android.myapex_compressed",
7638 ],
7639 hidden_api: {
7640 annotation_flags: "annotation-flags.csv",
7641 metadata: "metadata.csv",
7642 index: "index.csv",
7643 signature_patterns: "signature_patterns.csv",
7644 },
7645 %s
7646 }
7647 `
7648
7649 t.Run("java_import", func(t *testing.T) {
7650 result := preparers.RunTestWithBp(t,
7651 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7652 java_import {
7653 name: "libfoo",
7654 jars: ["libfoo.jar"],
7655 apex_available: [
7656 "com.android.myapex",
7657 "com.android.myapex_compressed",
7658 ],
7659 }
7660 `)
7661
7662 module := result.Module("libfoo", "android_common_com.android.myapex")
7663 usesLibraryDep := module.(java.UsesLibraryDependency)
7664 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7665 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7666 usesLibraryDep.DexJarBuildPath().Path())
7667 })
7668
7669 t.Run("java_sdk_library_import", func(t *testing.T) {
7670 result := preparers.RunTestWithBp(t,
7671 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7672 java_sdk_library_import {
7673 name: "libfoo",
7674 public: {
7675 jars: ["libbar.jar"],
7676 },
7677 apex_available: [
7678 "com.android.myapex",
7679 "com.android.myapex_compressed",
7680 ],
7681 compile_dex: true,
7682 }
7683 `)
7684
7685 module := result.Module("libfoo", "android_common_com.android.myapex")
7686 usesLibraryDep := module.(java.UsesLibraryDependency)
7687 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7688 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7689 usesLibraryDep.DexJarBuildPath().Path())
7690 })
7691
7692 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7693 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7694 image_name: "art",
7695 contents: ["libfoo"],
7696 `)+`
7697 java_sdk_library_import {
7698 name: "libfoo",
7699 public: {
7700 jars: ["libbar.jar"],
7701 },
7702 apex_available: [
7703 "com.android.myapex",
7704 "com.android.myapex_compressed",
7705 ],
7706 compile_dex: true,
7707 }
7708 `)
7709 })
7710}
7711
Jooyung Han548640b2020-04-27 12:10:30 +09007712func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7713 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7714 apex {
7715 name: "myapex",
7716 key: "myapex.key",
7717 updatable: true,
7718 }
7719
7720 apex_key {
7721 name: "myapex.key",
7722 public_key: "testkey.avbpubkey",
7723 private_key: "testkey.pem",
7724 }
7725 `)
7726}
7727
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007728func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7729 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7730 apex {
7731 name: "myapex",
7732 key: "myapex.key",
7733 }
7734
7735 apex_key {
7736 name: "myapex.key",
7737 public_key: "testkey.avbpubkey",
7738 private_key: "testkey.pem",
7739 }
7740 `)
7741}
7742
Daniel Norman69109112021-12-02 12:52:42 -08007743func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7744 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7745 apex {
7746 name: "myapex",
7747 key: "myapex.key",
7748 updatable: true,
7749 soc_specific: true,
7750 }
7751
7752 apex_key {
7753 name: "myapex.key",
7754 public_key: "testkey.avbpubkey",
7755 private_key: "testkey.pem",
7756 }
7757 `)
7758}
7759
satayevb98371c2021-06-15 16:49:50 +01007760func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7761 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7762 apex {
7763 name: "myapex",
7764 key: "myapex.key",
7765 systemserverclasspath_fragments: [
7766 "mysystemserverclasspathfragment",
7767 ],
7768 min_sdk_version: "29",
7769 updatable: true,
7770 }
7771
7772 apex_key {
7773 name: "myapex.key",
7774 public_key: "testkey.avbpubkey",
7775 private_key: "testkey.pem",
7776 }
7777
7778 java_library {
7779 name: "foo",
7780 srcs: ["b.java"],
7781 min_sdk_version: "29",
7782 installable: true,
7783 apex_available: [
7784 "myapex",
7785 ],
7786 }
7787
7788 systemserverclasspath_fragment {
7789 name: "mysystemserverclasspathfragment",
7790 generate_classpaths_proto: false,
7791 contents: [
7792 "foo",
7793 ],
7794 apex_available: [
7795 "myapex",
7796 ],
7797 }
satayevabcd5972021-08-06 17:49:46 +01007798 `,
7799 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7800 )
satayevb98371c2021-06-15 16:49:50 +01007801}
7802
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007803func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007804 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7805 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7806 // modules to be included in the BootJars.
7807 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7808 return android.GroupFixturePreparers(
7809 dexpreopt.FixtureSetBootJars(bootJars...),
7810 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7811 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7812 }),
7813 )
7814 }
7815
7816 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7817 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7818 // specified in the ArtApexJars configuration.
7819 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7820 return android.GroupFixturePreparers(
7821 dexpreopt.FixtureSetArtBootJars(bootJars...),
7822 dexpreopt.FixtureSetBootJars(bootJars...),
7823 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7824 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7825 }),
7826 )
7827 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007828
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007829 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007830 preparer := android.GroupFixturePreparers(
7831 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7832 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7833 )
7834 fragments := []java.ApexVariantReference{
7835 {
7836 Apex: proptools.StringPtr("com.android.art.debug"),
7837 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7838 },
7839 {
7840 Apex: proptools.StringPtr("some-non-updatable-apex"),
7841 Module: proptools.StringPtr("some-non-updatable-fragment"),
7842 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007843 }
satayevabcd5972021-08-06 17:49:46 +01007844 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007845 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007846
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007847 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007848 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7849 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007850 preparer := android.GroupFixturePreparers(
7851 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7852 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7853 )
Paul Duffin60264a02021-04-12 20:02:36 +01007854 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007855 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007856
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007857 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 +01007858 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 +01007859 // Update the dexpreopt ArtApexJars directly.
7860 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7861 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007862 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007863
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007864 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 +01007865 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 +01007866 // Update the dexpreopt ArtApexJars directly.
7867 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7868 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007869 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007870
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007871 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 +01007872 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 +01007873 preparer := android.GroupFixturePreparers(
7874 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7875 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7876 )
Paul Duffin60264a02021-04-12 20:02:36 +01007877 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007878 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007879
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007880 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 +01007881 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007882 fragment := java.ApexVariantReference{
7883 Apex: proptools.StringPtr("some-non-updatable-apex"),
7884 Module: proptools.StringPtr("some-non-updatable-fragment"),
7885 }
7886 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007887 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007888
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007889 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007890 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007891 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7892 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007893 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007894
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007895 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007896 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007897 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7898 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007899 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007900
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007901 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007902 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007903 // Update the dexpreopt ArtApexJars directly.
7904 preparer := prepareSetArtJars("platform:some-platform-lib")
7905 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007906 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007907
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007908 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007909 preparer := android.GroupFixturePreparers(
7910 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7911 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7912 )
7913 fragments := []java.ApexVariantReference{
7914 {
7915 Apex: proptools.StringPtr("some-non-updatable-apex"),
7916 Module: proptools.StringPtr("some-non-updatable-fragment"),
7917 },
7918 }
7919 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007920 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007921}
7922
7923func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007924 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007925 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007926 fragment := java.ApexVariantReference{
7927 Apex: proptools.StringPtr("myapex"),
7928 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7929 }
7930
Paul Duffin064b70c2020-11-02 17:32:38 +00007931 testDexpreoptWithApexes(t, `
7932 prebuilt_apex {
7933 name: "myapex" ,
7934 arch: {
7935 arm64: {
7936 src: "myapex-arm64.apex",
7937 },
7938 arm: {
7939 src: "myapex-arm.apex",
7940 },
7941 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007942 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7943 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007944
Paul Duffin89f570a2021-06-16 01:42:33 +01007945 prebuilt_bootclasspath_fragment {
7946 name: "my-bootclasspath-fragment",
7947 contents: ["libfoo"],
7948 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007949 hidden_api: {
7950 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7951 metadata: "my-bootclasspath-fragment/metadata.csv",
7952 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007953 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7954 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7955 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007956 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007957 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007958
Paul Duffin89f570a2021-06-16 01:42:33 +01007959 java_import {
7960 name: "libfoo",
7961 jars: ["libfoo.jar"],
7962 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007963 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007964 }
7965 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007966 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007967}
7968
Spandan Dasf14e2542021-11-12 00:01:37 +00007969func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007970 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007971 bp += `
7972 apex_key {
7973 name: "myapex.key",
7974 public_key: "testkey.avbpubkey",
7975 private_key: "testkey.pem",
7976 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007977 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007978 "lib1/src/A.java": nil,
7979 "lib2/src/B.java": nil,
7980 "system/sepolicy/apex/myapex-file_contexts": nil,
7981 }
7982
Paul Duffin45338f02021-03-30 23:07:52 +01007983 errorHandler := android.FixtureExpectsNoErrors
7984 if errmsg != "" {
7985 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007986 }
Colin Crossae8600b2020-10-29 17:09:13 -07007987
Paul Duffin45338f02021-03-30 23:07:52 +01007988 android.GroupFixturePreparers(
7989 android.PrepareForTestWithAndroidBuildComponents,
7990 java.PrepareForTestWithJavaBuildComponents,
7991 PrepareForTestWithApexBuildComponents,
7992 android.PrepareForTestWithNeverallowRules(rules),
7993 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007994 apexBootJars := make([]string, 0, len(bootJars))
7995 for _, apexBootJar := range bootJars {
7996 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007997 }
satayevd604b212021-07-21 14:23:52 +01007998 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007999 }),
8000 fs.AddToFixture(),
8001 ).
8002 ExtendWithErrorHandler(errorHandler).
8003 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008004}
8005
8006func TestApexPermittedPackagesRules(t *testing.T) {
8007 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008008 name string
8009 expectedError string
8010 bp string
8011 bootJars []string
8012 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008013 }{
8014
8015 {
8016 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8017 expectedError: "",
8018 bp: `
8019 java_library {
8020 name: "bcp_lib1",
8021 srcs: ["lib1/src/*.java"],
8022 permitted_packages: ["foo.bar"],
8023 apex_available: ["myapex"],
8024 sdk_version: "none",
8025 system_modules: "none",
8026 }
8027 java_library {
8028 name: "nonbcp_lib2",
8029 srcs: ["lib2/src/*.java"],
8030 apex_available: ["myapex"],
8031 permitted_packages: ["a.b"],
8032 sdk_version: "none",
8033 system_modules: "none",
8034 }
8035 apex {
8036 name: "myapex",
8037 key: "myapex.key",
8038 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008039 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008040 }`,
8041 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008042 bcpPermittedPackages: map[string][]string{
8043 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008044 "foo.bar",
8045 },
8046 },
8047 },
8048 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008049 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008050 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 +01008051 bp: `
8052 java_library {
8053 name: "bcp_lib1",
8054 srcs: ["lib1/src/*.java"],
8055 apex_available: ["myapex"],
8056 permitted_packages: ["foo.bar"],
8057 sdk_version: "none",
8058 system_modules: "none",
8059 }
8060 java_library {
8061 name: "bcp_lib2",
8062 srcs: ["lib2/src/*.java"],
8063 apex_available: ["myapex"],
8064 permitted_packages: ["foo.bar", "bar.baz"],
8065 sdk_version: "none",
8066 system_modules: "none",
8067 }
8068 apex {
8069 name: "myapex",
8070 key: "myapex.key",
8071 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008072 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008073 }
8074 `,
8075 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008076 bcpPermittedPackages: map[string][]string{
8077 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008078 "foo.bar",
8079 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008080 "bcp_lib2": []string{
8081 "foo.bar",
8082 },
8083 },
8084 },
8085 {
8086 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8087 expectedError: "",
8088 bp: `
8089 java_library {
8090 name: "bcp_lib_restricted",
8091 srcs: ["lib1/src/*.java"],
8092 apex_available: ["myapex"],
8093 permitted_packages: ["foo.bar"],
8094 sdk_version: "none",
8095 min_sdk_version: "29",
8096 system_modules: "none",
8097 }
8098 java_library {
8099 name: "bcp_lib_unrestricted",
8100 srcs: ["lib2/src/*.java"],
8101 apex_available: ["myapex"],
8102 permitted_packages: ["foo.bar", "bar.baz"],
8103 sdk_version: "none",
8104 min_sdk_version: "29",
8105 system_modules: "none",
8106 }
8107 apex {
8108 name: "myapex",
8109 key: "myapex.key",
8110 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8111 updatable: true,
8112 min_sdk_version: "29",
8113 }
8114 `,
8115 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8116 bcpPermittedPackages: map[string][]string{
8117 "bcp_lib1_non_updateable": []string{
8118 "foo.bar",
8119 },
8120 // 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 +01008121 },
8122 },
8123 }
8124 for _, tc := range testcases {
8125 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008126 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8127 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008128 })
8129 }
8130}
8131
Jiyong Park62304bb2020-04-13 16:19:48 +09008132func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008133 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008134 apex {
8135 name: "myapex",
8136 key: "myapex.key",
8137 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008138 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008139 }
8140
8141 apex_key {
8142 name: "myapex.key",
8143 public_key: "testkey.avbpubkey",
8144 private_key: "testkey.pem",
8145 }
8146
8147 cc_library {
8148 name: "mylib",
8149 srcs: ["mylib.cpp"],
8150 system_shared_libs: [],
8151 stl: "none",
8152 stubs: {
8153 versions: ["1"],
8154 },
8155 apex_available: ["myapex"],
8156 }
8157
8158 cc_library {
8159 name: "myprivlib",
8160 srcs: ["mylib.cpp"],
8161 system_shared_libs: [],
8162 stl: "none",
8163 apex_available: ["myapex"],
8164 }
8165
8166
8167 cc_test {
8168 name: "mytest",
8169 gtest: false,
8170 srcs: ["mylib.cpp"],
8171 system_shared_libs: [],
8172 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008173 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008174 test_for: ["myapex"]
8175 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008176
8177 cc_library {
8178 name: "mytestlib",
8179 srcs: ["mylib.cpp"],
8180 system_shared_libs: [],
8181 shared_libs: ["mylib", "myprivlib"],
8182 stl: "none",
8183 test_for: ["myapex"],
8184 }
8185
8186 cc_benchmark {
8187 name: "mybench",
8188 srcs: ["mylib.cpp"],
8189 system_shared_libs: [],
8190 shared_libs: ["mylib", "myprivlib"],
8191 stl: "none",
8192 test_for: ["myapex"],
8193 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008194 `)
8195
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008196 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008197 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008198 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8199 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8200 }
8201
8202 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008203 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008204 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8205 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8206 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8207}
Jiyong Park46a512f2020-12-04 18:02:13 +09008208
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008209func TestIndirectTestFor(t *testing.T) {
8210 ctx := testApex(t, `
8211 apex {
8212 name: "myapex",
8213 key: "myapex.key",
8214 native_shared_libs: ["mylib", "myprivlib"],
8215 updatable: false,
8216 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008217
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008218 apex_key {
8219 name: "myapex.key",
8220 public_key: "testkey.avbpubkey",
8221 private_key: "testkey.pem",
8222 }
8223
8224 cc_library {
8225 name: "mylib",
8226 srcs: ["mylib.cpp"],
8227 system_shared_libs: [],
8228 stl: "none",
8229 stubs: {
8230 versions: ["1"],
8231 },
8232 apex_available: ["myapex"],
8233 }
8234
8235 cc_library {
8236 name: "myprivlib",
8237 srcs: ["mylib.cpp"],
8238 system_shared_libs: [],
8239 stl: "none",
8240 shared_libs: ["mylib"],
8241 apex_available: ["myapex"],
8242 }
8243
8244 cc_library {
8245 name: "mytestlib",
8246 srcs: ["mylib.cpp"],
8247 system_shared_libs: [],
8248 shared_libs: ["myprivlib"],
8249 stl: "none",
8250 test_for: ["myapex"],
8251 }
8252 `)
8253
8254 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008255 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008256 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8257 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8258 }
8259
8260 // The platform variant of mytestlib links to the platform variant of the
8261 // internal myprivlib.
8262 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8263
8264 // The platform variant of myprivlib links to the platform variant of mylib
8265 // and bypasses its stubs.
8266 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 +09008267}
8268
Martin Stjernholmec009002021-03-27 15:18:31 +00008269func TestTestForForLibInOtherApex(t *testing.T) {
8270 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8271 _ = testApex(t, `
8272 apex {
8273 name: "com.android.art",
8274 key: "myapex.key",
8275 native_shared_libs: ["mylib"],
8276 updatable: false,
8277 }
8278
8279 apex {
8280 name: "com.android.art.debug",
8281 key: "myapex.key",
8282 native_shared_libs: ["mylib", "mytestlib"],
8283 updatable: false,
8284 }
8285
8286 apex_key {
8287 name: "myapex.key",
8288 public_key: "testkey.avbpubkey",
8289 private_key: "testkey.pem",
8290 }
8291
8292 cc_library {
8293 name: "mylib",
8294 srcs: ["mylib.cpp"],
8295 system_shared_libs: [],
8296 stl: "none",
8297 stubs: {
8298 versions: ["1"],
8299 },
8300 apex_available: ["com.android.art", "com.android.art.debug"],
8301 }
8302
8303 cc_library {
8304 name: "mytestlib",
8305 srcs: ["mylib.cpp"],
8306 system_shared_libs: [],
8307 shared_libs: ["mylib"],
8308 stl: "none",
8309 apex_available: ["com.android.art.debug"],
8310 test_for: ["com.android.art"],
8311 }
8312 `,
8313 android.MockFS{
8314 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8315 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8316 }.AddToFixture())
8317}
8318
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008319// TODO(jungjw): Move this to proptools
8320func intPtr(i int) *int {
8321 return &i
8322}
8323
8324func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008325 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008326 apex_set {
8327 name: "myapex",
8328 set: "myapex.apks",
8329 filename: "foo_v2.apex",
8330 overrides: ["foo"],
8331 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008332 `,
8333 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8334 variables.Platform_sdk_version = intPtr(30)
8335 }),
8336 android.FixtureModifyConfig(func(config android.Config) {
8337 config.Targets[android.Android] = []android.Target{
8338 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8339 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8340 }
8341 }),
8342 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008343
Paul Duffin24704672021-04-06 16:09:30 +01008344 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008345
8346 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008347 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008348 actual := extractedApex.Args["abis"]
8349 expected := "ARMEABI_V7A,ARM64_V8A"
8350 if actual != expected {
8351 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8352 }
8353 actual = extractedApex.Args["sdk-version"]
8354 expected = "30"
8355 if actual != expected {
8356 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8357 }
8358
Paul Duffin6717d882021-06-15 19:09:41 +01008359 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008360 a := m.Module().(*ApexSet)
8361 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008362 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008363 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8364 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8365 }
8366}
8367
Jiyong Park7d95a512020-05-10 15:16:24 +09008368func TestNoStaticLinkingToStubsLib(t *testing.T) {
8369 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8370 apex {
8371 name: "myapex",
8372 key: "myapex.key",
8373 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008374 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008375 }
8376
8377 apex_key {
8378 name: "myapex.key",
8379 public_key: "testkey.avbpubkey",
8380 private_key: "testkey.pem",
8381 }
8382
8383 cc_library {
8384 name: "mylib",
8385 srcs: ["mylib.cpp"],
8386 static_libs: ["otherlib"],
8387 system_shared_libs: [],
8388 stl: "none",
8389 apex_available: [ "myapex" ],
8390 }
8391
8392 cc_library {
8393 name: "otherlib",
8394 srcs: ["mylib.cpp"],
8395 system_shared_libs: [],
8396 stl: "none",
8397 stubs: {
8398 versions: ["1", "2", "3"],
8399 },
8400 apex_available: [ "myapex" ],
8401 }
8402 `)
8403}
8404
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008405func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008406 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008407 apex {
8408 name: "myapex",
8409 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008410 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008411 custom_sign_tool: "sign_myapex",
8412 }
8413
8414 apex_key {
8415 name: "myapex.key",
8416 public_key: "testkey.avbpubkey",
8417 private_key: "testkey.pem",
8418 }
8419 `)
8420
8421 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8422 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8423 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"`)
8424}
8425
8426func TestApexKeysTxtOverrides(t *testing.T) {
8427 ctx := testApex(t, `
8428 apex {
8429 name: "myapex",
8430 key: "myapex.key",
8431 updatable: false,
8432 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008433 }
8434
8435 apex_key {
8436 name: "myapex.key",
8437 public_key: "testkey.avbpubkey",
8438 private_key: "testkey.pem",
8439 }
8440
8441 prebuilt_apex {
8442 name: "myapex",
8443 prefer: true,
8444 arch: {
8445 arm64: {
8446 src: "myapex-arm64.apex",
8447 },
8448 arm: {
8449 src: "myapex-arm.apex",
8450 },
8451 },
8452 }
8453
8454 apex_set {
8455 name: "myapex_set",
8456 set: "myapex.apks",
8457 filename: "myapex_set.apex",
8458 overrides: ["myapex"],
8459 }
8460 `)
8461
8462 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8463 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8464 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 +09008465 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 +09008466}
8467
Jooyung Han938b5932020-06-20 12:47:47 +09008468func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008469 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008470 apex {
8471 name: "myapex",
8472 key: "myapex.key",
8473 apps: ["app"],
8474 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008475 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008476 }
8477
8478 apex_key {
8479 name: "myapex.key",
8480 public_key: "testkey.avbpubkey",
8481 private_key: "testkey.pem",
8482 }
8483
8484 android_app {
8485 name: "app",
8486 srcs: ["foo/bar/MyClass.java"],
8487 package_name: "foo",
8488 sdk_version: "none",
8489 system_modules: "none",
8490 apex_available: [ "myapex" ],
8491 }
8492 `, withFiles(map[string][]byte{
8493 "sub/Android.bp": []byte(`
8494 override_apex {
8495 name: "override_myapex",
8496 base: "myapex",
8497 apps: ["override_app"],
8498 allowed_files: ":allowed",
8499 }
8500 // Overridable "path" property should be referenced indirectly
8501 filegroup {
8502 name: "allowed",
8503 srcs: ["allowed.txt"],
8504 }
8505 override_android_app {
8506 name: "override_app",
8507 base: "app",
8508 package_name: "bar",
8509 }
8510 `),
8511 }))
8512
8513 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8514 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8515 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8516 }
8517
8518 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8519 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8520 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8521 }
8522}
8523
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008524func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008525 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008526 apex {
8527 name: "myapex",
8528 key: "myapex.key",
8529 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008530 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008531 }
8532
8533 apex_key {
8534 name: "myapex.key",
8535 public_key: "testkey.avbpubkey",
8536 private_key: "testkey.pem",
8537 }
8538
8539 cc_library {
8540 name: "mylib",
8541 srcs: ["mylib.cpp"],
8542 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008543 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008544 },
8545 apex_available: ["myapex"],
8546 }
8547
8548 cc_prebuilt_library_shared {
8549 name: "mylib",
8550 prefer: false,
8551 srcs: ["prebuilt.so"],
8552 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008553 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008554 },
8555 apex_available: ["myapex"],
8556 }
8557 `)
8558}
8559
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008560func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008561 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008562 apex {
8563 name: "myapex",
8564 key: "myapex.key",
8565 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008566 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008567 }
8568 apex_key {
8569 name: "myapex.key",
8570 public_key: "testkey.avbpubkey",
8571 private_key: "testkey.pem",
8572 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008573 `,
8574 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8575 variables.CompressedApex = proptools.BoolPtr(true)
8576 }),
8577 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008578
8579 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8580 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8581
8582 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8583 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8584
8585 // Make sure output of bundle is .capex
8586 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8587 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8588
8589 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008590 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008591 var builder strings.Builder
8592 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8593 androidMk := builder.String()
8594 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8595}
8596
Martin Stjernholm2856c662020-12-02 15:03:42 +00008597func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008598 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008599 apex {
8600 name: "myapex",
8601 key: "myapex.key",
8602 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008603 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008604 }
8605
8606 apex_key {
8607 name: "myapex.key",
8608 public_key: "testkey.avbpubkey",
8609 private_key: "testkey.pem",
8610 }
8611
8612 cc_library {
8613 name: "mylib",
8614 srcs: ["mylib.cpp"],
8615 apex_available: ["myapex"],
8616 shared_libs: ["otherlib"],
8617 system_shared_libs: [],
8618 }
8619
8620 cc_library {
8621 name: "otherlib",
8622 srcs: ["mylib.cpp"],
8623 stubs: {
8624 versions: ["current"],
8625 },
8626 }
8627
8628 cc_prebuilt_library_shared {
8629 name: "otherlib",
8630 prefer: true,
8631 srcs: ["prebuilt.so"],
8632 stubs: {
8633 versions: ["current"],
8634 },
8635 }
8636 `)
8637
8638 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008639 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008640 var builder strings.Builder
8641 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8642 androidMk := builder.String()
8643
8644 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8645 // a thing there.
8646 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8647}
8648
Jiyong Parke3867542020-12-03 17:28:25 +09008649func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008650 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008651 apex {
8652 name: "myapex",
8653 key: "myapex.key",
8654 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008655 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008656 }
8657
8658 apex_key {
8659 name: "myapex.key",
8660 public_key: "testkey.avbpubkey",
8661 private_key: "testkey.pem",
8662 }
8663
8664 cc_library {
8665 name: "mylib",
8666 srcs: ["mylib.cpp"],
8667 system_shared_libs: [],
8668 stl: "none",
8669 apex_available: ["myapex"],
8670 shared_libs: ["mylib2"],
8671 target: {
8672 apex: {
8673 exclude_shared_libs: ["mylib2"],
8674 },
8675 },
8676 }
8677
8678 cc_library {
8679 name: "mylib2",
8680 srcs: ["mylib.cpp"],
8681 system_shared_libs: [],
8682 stl: "none",
8683 }
8684 `)
8685
8686 // Check if mylib is linked to mylib2 for the non-apex target
8687 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8688 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8689
8690 // Make sure that the link doesn't occur for the apex target
8691 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8692 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8693
8694 // It shouldn't appear in the copy cmd as well.
8695 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8696 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8697}
8698
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008699func TestPrebuiltStubLibDep(t *testing.T) {
8700 bpBase := `
8701 apex {
8702 name: "myapex",
8703 key: "myapex.key",
8704 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008705 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008706 }
8707 apex_key {
8708 name: "myapex.key",
8709 public_key: "testkey.avbpubkey",
8710 private_key: "testkey.pem",
8711 }
8712 cc_library {
8713 name: "mylib",
8714 srcs: ["mylib.cpp"],
8715 apex_available: ["myapex"],
8716 shared_libs: ["stublib"],
8717 system_shared_libs: [],
8718 }
8719 apex {
8720 name: "otherapex",
8721 enabled: %s,
8722 key: "myapex.key",
8723 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008725 }
8726 `
8727
8728 stublibSourceBp := `
8729 cc_library {
8730 name: "stublib",
8731 srcs: ["mylib.cpp"],
8732 apex_available: ["otherapex"],
8733 system_shared_libs: [],
8734 stl: "none",
8735 stubs: {
8736 versions: ["1"],
8737 },
8738 }
8739 `
8740
8741 stublibPrebuiltBp := `
8742 cc_prebuilt_library_shared {
8743 name: "stublib",
8744 srcs: ["prebuilt.so"],
8745 apex_available: ["otherapex"],
8746 stubs: {
8747 versions: ["1"],
8748 },
8749 %s
8750 }
8751 `
8752
8753 tests := []struct {
8754 name string
8755 stublibBp string
8756 usePrebuilt bool
8757 modNames []string // Modules to collect AndroidMkEntries for
8758 otherApexEnabled []string
8759 }{
8760 {
8761 name: "only_source",
8762 stublibBp: stublibSourceBp,
8763 usePrebuilt: false,
8764 modNames: []string{"stublib"},
8765 otherApexEnabled: []string{"true", "false"},
8766 },
8767 {
8768 name: "source_preferred",
8769 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8770 usePrebuilt: false,
8771 modNames: []string{"stublib", "prebuilt_stublib"},
8772 otherApexEnabled: []string{"true", "false"},
8773 },
8774 {
8775 name: "prebuilt_preferred",
8776 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8777 usePrebuilt: true,
8778 modNames: []string{"stublib", "prebuilt_stublib"},
8779 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8780 },
8781 {
8782 name: "only_prebuilt",
8783 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8784 usePrebuilt: true,
8785 modNames: []string{"stublib"},
8786 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8787 },
8788 }
8789
8790 for _, test := range tests {
8791 t.Run(test.name, func(t *testing.T) {
8792 for _, otherApexEnabled := range test.otherApexEnabled {
8793 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008794 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008795
8796 type modAndMkEntries struct {
8797 mod *cc.Module
8798 mkEntries android.AndroidMkEntries
8799 }
8800 entries := []*modAndMkEntries{}
8801
8802 // Gather shared lib modules that are installable
8803 for _, modName := range test.modNames {
8804 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8805 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8806 continue
8807 }
8808 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008809 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008810 continue
8811 }
Colin Crossaa255532020-07-03 13:18:24 -07008812 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008813 if ent.Disabled {
8814 continue
8815 }
8816 entries = append(entries, &modAndMkEntries{
8817 mod: mod,
8818 mkEntries: ent,
8819 })
8820 }
8821 }
8822 }
8823
8824 var entry *modAndMkEntries = nil
8825 for _, ent := range entries {
8826 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8827 if entry != nil {
8828 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8829 } else {
8830 entry = ent
8831 }
8832 }
8833 }
8834
8835 if entry == nil {
8836 t.Errorf("AndroidMk entry for \"stublib\" missing")
8837 } else {
8838 isPrebuilt := entry.mod.Prebuilt() != nil
8839 if isPrebuilt != test.usePrebuilt {
8840 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8841 }
8842 if !entry.mod.IsStubs() {
8843 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8844 }
8845 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8846 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8847 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008848 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008849 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008850 if !android.InList(expected, cflags) {
8851 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8852 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008853 }
8854 })
8855 }
8856 })
8857 }
8858}
8859
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008860func TestHostApexInHostOnlyBuild(t *testing.T) {
8861 testApex(t, `
8862 apex {
8863 name: "myapex",
8864 host_supported: true,
8865 key: "myapex.key",
8866 updatable: false,
8867 payload_type: "zip",
8868 }
8869 apex_key {
8870 name: "myapex.key",
8871 public_key: "testkey.avbpubkey",
8872 private_key: "testkey.pem",
8873 }
8874 `,
8875 android.FixtureModifyConfig(func(config android.Config) {
8876 // We may not have device targets in all builds, e.g. in
8877 // prebuilts/build-tools/build-prebuilts.sh
8878 config.Targets[android.Android] = []android.Target{}
8879 }))
8880}
8881
Colin Crossc33e5212021-05-25 18:16:02 -07008882func TestApexJavaCoverage(t *testing.T) {
8883 bp := `
8884 apex {
8885 name: "myapex",
8886 key: "myapex.key",
8887 java_libs: ["mylib"],
8888 bootclasspath_fragments: ["mybootclasspathfragment"],
8889 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8890 updatable: false,
8891 }
8892
8893 apex_key {
8894 name: "myapex.key",
8895 public_key: "testkey.avbpubkey",
8896 private_key: "testkey.pem",
8897 }
8898
8899 java_library {
8900 name: "mylib",
8901 srcs: ["mylib.java"],
8902 apex_available: ["myapex"],
8903 compile_dex: true,
8904 }
8905
8906 bootclasspath_fragment {
8907 name: "mybootclasspathfragment",
8908 contents: ["mybootclasspathlib"],
8909 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008910 hidden_api: {
8911 split_packages: ["*"],
8912 },
Colin Crossc33e5212021-05-25 18:16:02 -07008913 }
8914
8915 java_library {
8916 name: "mybootclasspathlib",
8917 srcs: ["mybootclasspathlib.java"],
8918 apex_available: ["myapex"],
8919 compile_dex: true,
8920 }
8921
8922 systemserverclasspath_fragment {
8923 name: "mysystemserverclasspathfragment",
8924 contents: ["mysystemserverclasspathlib"],
8925 apex_available: ["myapex"],
8926 }
8927
8928 java_library {
8929 name: "mysystemserverclasspathlib",
8930 srcs: ["mysystemserverclasspathlib.java"],
8931 apex_available: ["myapex"],
8932 compile_dex: true,
8933 }
8934 `
8935
8936 result := android.GroupFixturePreparers(
8937 PrepareForTestWithApexBuildComponents,
8938 prepareForTestWithMyapex,
8939 java.PrepareForTestWithJavaDefaultModules,
8940 android.PrepareForTestWithAndroidBuildComponents,
8941 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008942 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8943 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008944 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008945 ).RunTest(t)
8946
8947 // Make sure jacoco ran on both mylib and mybootclasspathlib
8948 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8949 t.Errorf("Failed to find jacoco rule for mylib")
8950 }
8951 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8952 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8953 }
8954 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8955 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8956 }
8957}
8958
Jiyong Park192600a2021-08-03 07:52:17 +00008959func TestProhibitStaticExecutable(t *testing.T) {
8960 testApexError(t, `executable mybin is static`, `
8961 apex {
8962 name: "myapex",
8963 key: "myapex.key",
8964 binaries: ["mybin"],
8965 min_sdk_version: "29",
8966 }
8967
8968 apex_key {
8969 name: "myapex.key",
8970 public_key: "testkey.avbpubkey",
8971 private_key: "testkey.pem",
8972 }
8973
8974 cc_binary {
8975 name: "mybin",
8976 srcs: ["mylib.cpp"],
8977 relative_install_path: "foo/bar",
8978 static_executable: true,
8979 system_shared_libs: [],
8980 stl: "none",
8981 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008982 min_sdk_version: "29",
8983 }
8984 `)
8985
8986 testApexError(t, `executable mybin.rust is static`, `
8987 apex {
8988 name: "myapex",
8989 key: "myapex.key",
8990 binaries: ["mybin.rust"],
8991 min_sdk_version: "29",
8992 }
8993
8994 apex_key {
8995 name: "myapex.key",
8996 public_key: "testkey.avbpubkey",
8997 private_key: "testkey.pem",
8998 }
8999
9000 rust_binary {
9001 name: "mybin.rust",
9002 srcs: ["foo.rs"],
9003 static_executable: true,
9004 apex_available: ["myapex"],
9005 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009006 }
9007 `)
9008}
9009
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009010func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9011 ctx := testApex(t, `
9012 apex {
9013 name: "myapex",
9014 key: "myapex.key",
9015 updatable: false,
9016 java_libs: ["foo"],
9017 }
9018
9019 apex_key {
9020 name: "myapex.key",
9021 public_key: "testkey.avbpubkey",
9022 private_key: "testkey.pem",
9023 }
9024
9025 java_library {
9026 name: "foo",
9027 srcs: ["foo.java"],
9028 apex_available: ["myapex"],
9029 installable: true,
9030 }
9031 `,
9032 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9033 )
9034
9035 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9036 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9037 var builder strings.Builder
9038 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9039 androidMk := builder.String()
9040 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")
9041}
9042
9043func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9044 ctx := testApex(t, `
9045 prebuilt_apex {
9046 name: "myapex",
9047 arch: {
9048 arm64: {
9049 src: "myapex-arm64.apex",
9050 },
9051 arm: {
9052 src: "myapex-arm.apex",
9053 },
9054 },
9055 exported_java_libs: ["foo"],
9056 }
9057
9058 java_import {
9059 name: "foo",
9060 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009061 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009062 }
9063 `,
9064 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9065 )
9066
9067 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9068 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9069 mainModuleEntries := entriesList[0]
9070 android.AssertArrayString(t,
9071 "LOCAL_REQUIRED_MODULES",
9072 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9073 []string{
9074 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9075 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9076 })
9077}
9078
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009079func TestAndroidMk_RequiredModules(t *testing.T) {
9080 ctx := testApex(t, `
9081 apex {
9082 name: "myapex",
9083 key: "myapex.key",
9084 updatable: false,
9085 java_libs: ["foo"],
9086 required: ["otherapex"],
9087 }
9088
9089 apex {
9090 name: "otherapex",
9091 key: "myapex.key",
9092 updatable: false,
9093 java_libs: ["foo"],
9094 required: ["otherapex"],
9095 }
9096
9097 apex_key {
9098 name: "myapex.key",
9099 public_key: "testkey.avbpubkey",
9100 private_key: "testkey.pem",
9101 }
9102
9103 java_library {
9104 name: "foo",
9105 srcs: ["foo.java"],
9106 apex_available: ["myapex", "otherapex"],
9107 installable: true,
9108 }
9109 `)
9110
9111 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9112 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9113 var builder strings.Builder
9114 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9115 androidMk := builder.String()
9116 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9117}
9118
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009119func TestAndroidMk_RequiredDeps(t *testing.T) {
9120 ctx := testApex(t, `
9121 apex {
9122 name: "myapex",
9123 key: "myapex.key",
9124 updatable: false,
9125 }
9126
9127 apex_key {
9128 name: "myapex.key",
9129 public_key: "testkey.avbpubkey",
9130 private_key: "testkey.pem",
9131 }
9132 `)
9133
9134 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9135 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9136 data := android.AndroidMkDataForTest(t, ctx, bundle)
9137 var builder strings.Builder
9138 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9139 androidMk := builder.String()
9140 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9141
9142 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9143 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9144 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9145 var flattenedBuilder strings.Builder
9146 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9147 flattenedAndroidMk := flattenedBuilder.String()
9148 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9149}
9150
Jooyung Hana6d36672022-02-24 13:58:07 +09009151func TestApexOutputFileProducer(t *testing.T) {
9152 for _, tc := range []struct {
9153 name string
9154 ref string
9155 expected_data []string
9156 }{
9157 {
9158 name: "test_using_output",
9159 ref: ":myapex",
9160 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9161 },
9162 {
9163 name: "test_using_apex",
9164 ref: ":myapex{.apex}",
9165 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9166 },
9167 } {
9168 t.Run(tc.name, func(t *testing.T) {
9169 ctx := testApex(t, `
9170 apex {
9171 name: "myapex",
9172 key: "myapex.key",
9173 compressible: true,
9174 updatable: false,
9175 }
9176
9177 apex_key {
9178 name: "myapex.key",
9179 public_key: "testkey.avbpubkey",
9180 private_key: "testkey.pem",
9181 }
9182
9183 java_test {
9184 name: "`+tc.name+`",
9185 srcs: ["a.java"],
9186 data: ["`+tc.ref+`"],
9187 }
9188 `,
9189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9190 variables.CompressedApex = proptools.BoolPtr(true)
9191 }))
9192 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9193 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9194 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9195 })
9196 }
9197}
9198
satayev758968a2021-12-06 11:42:40 +00009199func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9200 preparer := android.GroupFixturePreparers(
9201 PrepareForTestWithApexBuildComponents,
9202 prepareForTestWithMyapex,
9203 java.PrepareForTestWithJavaSdkLibraryFiles,
9204 java.PrepareForTestWithJavaDefaultModules,
9205 android.PrepareForTestWithAndroidBuildComponents,
9206 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9207 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9208 )
9209
9210 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9211 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9212 preparer.RunTestWithBp(t, `
9213 apex {
9214 name: "myapex",
9215 key: "myapex.key",
9216 bootclasspath_fragments: ["mybootclasspathfragment"],
9217 min_sdk_version: "30",
9218 updatable: false,
9219 }
9220
9221 apex_key {
9222 name: "myapex.key",
9223 public_key: "testkey.avbpubkey",
9224 private_key: "testkey.pem",
9225 }
9226
9227 bootclasspath_fragment {
9228 name: "mybootclasspathfragment",
9229 contents: ["mybootclasspathlib"],
9230 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009231 hidden_api: {
9232 split_packages: ["*"],
9233 },
satayev758968a2021-12-06 11:42:40 +00009234 }
9235
9236 java_sdk_library {
9237 name: "mybootclasspathlib",
9238 srcs: ["mybootclasspathlib.java"],
9239 apex_available: ["myapex"],
9240 compile_dex: true,
9241 unsafe_ignore_missing_latest_api: true,
9242 min_sdk_version: "31",
9243 static_libs: ["util"],
9244 }
9245
9246 java_library {
9247 name: "util",
9248 srcs: ["a.java"],
9249 apex_available: ["myapex"],
9250 min_sdk_version: "31",
9251 static_libs: ["another_util"],
9252 }
9253
9254 java_library {
9255 name: "another_util",
9256 srcs: ["a.java"],
9257 min_sdk_version: "31",
9258 apex_available: ["myapex"],
9259 }
9260 `)
9261 })
9262
9263 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9264 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9265 preparer.RunTestWithBp(t, `
9266 apex {
9267 name: "myapex",
9268 key: "myapex.key",
9269 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9270 min_sdk_version: "30",
9271 updatable: false,
9272 }
9273
9274 apex_key {
9275 name: "myapex.key",
9276 public_key: "testkey.avbpubkey",
9277 private_key: "testkey.pem",
9278 }
9279
9280 systemserverclasspath_fragment {
9281 name: "mysystemserverclasspathfragment",
9282 contents: ["mysystemserverclasspathlib"],
9283 apex_available: ["myapex"],
9284 }
9285
9286 java_sdk_library {
9287 name: "mysystemserverclasspathlib",
9288 srcs: ["mysystemserverclasspathlib.java"],
9289 apex_available: ["myapex"],
9290 compile_dex: true,
9291 min_sdk_version: "32",
9292 unsafe_ignore_missing_latest_api: true,
9293 static_libs: ["util"],
9294 }
9295
9296 java_library {
9297 name: "util",
9298 srcs: ["a.java"],
9299 apex_available: ["myapex"],
9300 min_sdk_version: "31",
9301 static_libs: ["another_util"],
9302 }
9303
9304 java_library {
9305 name: "another_util",
9306 srcs: ["a.java"],
9307 min_sdk_version: "31",
9308 apex_available: ["myapex"],
9309 }
9310 `)
9311 })
9312
9313 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9314 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9315 RunTestWithBp(t, `
9316 apex {
9317 name: "myapex",
9318 key: "myapex.key",
9319 bootclasspath_fragments: ["mybootclasspathfragment"],
9320 min_sdk_version: "30",
9321 updatable: false,
9322 }
9323
9324 apex_key {
9325 name: "myapex.key",
9326 public_key: "testkey.avbpubkey",
9327 private_key: "testkey.pem",
9328 }
9329
9330 bootclasspath_fragment {
9331 name: "mybootclasspathfragment",
9332 contents: ["mybootclasspathlib"],
9333 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009334 hidden_api: {
9335 split_packages: ["*"],
9336 },
satayev758968a2021-12-06 11:42:40 +00009337 }
9338
9339 java_sdk_library {
9340 name: "mybootclasspathlib",
9341 srcs: ["mybootclasspathlib.java"],
9342 apex_available: ["myapex"],
9343 compile_dex: true,
9344 unsafe_ignore_missing_latest_api: true,
9345 }
9346 `)
9347 })
9348
9349 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9350 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9351 RunTestWithBp(t, `
9352 apex {
9353 name: "myapex",
9354 key: "myapex.key",
9355 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9356 min_sdk_version: "30",
9357 updatable: false,
9358 }
9359
9360 apex_key {
9361 name: "myapex.key",
9362 public_key: "testkey.avbpubkey",
9363 private_key: "testkey.pem",
9364 }
9365
9366 systemserverclasspath_fragment {
9367 name: "mysystemserverclasspathfragment",
9368 contents: ["mysystemserverclasspathlib"],
9369 apex_available: ["myapex"],
9370 }
9371
9372 java_sdk_library {
9373 name: "mysystemserverclasspathlib",
9374 srcs: ["mysystemserverclasspathlib.java"],
9375 apex_available: ["myapex"],
9376 compile_dex: true,
9377 unsafe_ignore_missing_latest_api: true,
9378 }
9379 `)
9380 })
9381}
9382
Jiakai Zhang6decef92022-01-12 17:56:19 +00009383// Verifies that the APEX depends on all the Make modules in the list.
9384func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9385 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9386 for _, dep := range deps {
9387 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9388 }
9389}
9390
9391// Verifies that the APEX does not depend on any of the Make modules in the list.
9392func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9393 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9394 for _, dep := range deps {
9395 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9396 }
9397}
9398
Spandan Das66773252022-01-15 00:23:18 +00009399func TestApexStrictUpdtabilityLint(t *testing.T) {
9400 bpTemplate := `
9401 apex {
9402 name: "myapex",
9403 key: "myapex.key",
9404 java_libs: ["myjavalib"],
9405 updatable: %v,
9406 min_sdk_version: "29",
9407 }
9408 apex_key {
9409 name: "myapex.key",
9410 }
9411 java_library {
9412 name: "myjavalib",
9413 srcs: ["MyClass.java"],
9414 apex_available: [ "myapex" ],
9415 lint: {
9416 strict_updatability_linting: %v,
9417 },
9418 sdk_version: "current",
9419 min_sdk_version: "29",
9420 }
9421 `
9422 fs := android.MockFS{
9423 "lint-baseline.xml": nil,
9424 }
9425
9426 testCases := []struct {
9427 testCaseName string
9428 apexUpdatable bool
9429 javaStrictUpdtabilityLint bool
9430 lintFileExists bool
9431 disallowedFlagExpected bool
9432 }{
9433 {
9434 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9435 apexUpdatable: true,
9436 javaStrictUpdtabilityLint: true,
9437 lintFileExists: false,
9438 disallowedFlagExpected: false,
9439 },
9440 {
9441 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9442 apexUpdatable: false,
9443 javaStrictUpdtabilityLint: false,
9444 lintFileExists: true,
9445 disallowedFlagExpected: false,
9446 },
9447 {
9448 testCaseName: "non-updatable apex respects strict updatability of javalib",
9449 apexUpdatable: false,
9450 javaStrictUpdtabilityLint: true,
9451 lintFileExists: true,
9452 disallowedFlagExpected: true,
9453 },
9454 {
9455 testCaseName: "updatable apex sets strict updatability of javalib to true",
9456 apexUpdatable: true,
9457 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9458 lintFileExists: true,
9459 disallowedFlagExpected: true,
9460 },
9461 }
9462
9463 for _, testCase := range testCases {
9464 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9465 fixtures := []android.FixturePreparer{}
9466 if testCase.lintFileExists {
9467 fixtures = append(fixtures, fs.AddToFixture())
9468 }
9469
9470 result := testApex(t, bp, fixtures...)
9471 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9472 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9473 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9474
9475 if disallowedFlagActual != testCase.disallowedFlagExpected {
9476 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9477 }
9478 }
9479}
9480
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009481func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9482 bp := `
9483 apex {
9484 name: "myapex",
9485 key: "myapex.key",
9486 java_libs: ["myjavalib"],
9487 updatable: true,
9488 min_sdk_version: "29",
9489 }
9490 apex_key {
9491 name: "myapex.key",
9492 }
9493 java_library {
9494 name: "myjavalib",
9495 srcs: ["MyClass.java"],
9496 apex_available: [ "myapex" ],
9497 sdk_version: "current",
9498 min_sdk_version: "29",
9499 }
9500 `
9501
9502 testCases := []struct {
9503 testCaseName string
9504 moduleDirectory string
9505 disallowedFlagExpected bool
9506 }{
9507 {
9508 testCaseName: "lintable module defined outside libcore",
9509 moduleDirectory: "",
9510 disallowedFlagExpected: true,
9511 },
9512 {
9513 testCaseName: "lintable module defined in libcore root directory",
9514 moduleDirectory: "libcore/",
9515 disallowedFlagExpected: false,
9516 },
9517 {
9518 testCaseName: "lintable module defined in libcore child directory",
9519 moduleDirectory: "libcore/childdir/",
9520 disallowedFlagExpected: true,
9521 },
9522 }
9523
9524 for _, testCase := range testCases {
9525 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9526 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9527 result := testApex(t, "", lintFileCreator, bpFileCreator)
9528 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9529 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9530 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9531 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9532
9533 if disallowedFlagActual != testCase.disallowedFlagExpected {
9534 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9535 }
9536 }
9537}
9538
Spandan Das66773252022-01-15 00:23:18 +00009539// checks transtive deps of an apex coming from bootclasspath_fragment
9540func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9541 bp := `
9542 apex {
9543 name: "myapex",
9544 key: "myapex.key",
9545 bootclasspath_fragments: ["mybootclasspathfragment"],
9546 updatable: true,
9547 min_sdk_version: "29",
9548 }
9549 apex_key {
9550 name: "myapex.key",
9551 }
9552 bootclasspath_fragment {
9553 name: "mybootclasspathfragment",
9554 contents: ["myjavalib"],
9555 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009556 hidden_api: {
9557 split_packages: ["*"],
9558 },
Spandan Das66773252022-01-15 00:23:18 +00009559 }
9560 java_library {
9561 name: "myjavalib",
9562 srcs: ["MyClass.java"],
9563 apex_available: [ "myapex" ],
9564 sdk_version: "current",
9565 min_sdk_version: "29",
9566 compile_dex: true,
9567 }
9568 `
9569 fs := android.MockFS{
9570 "lint-baseline.xml": nil,
9571 }
9572
9573 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9574 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9575 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9576 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9577 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9578 }
9579}
9580
Spandan Das42e89502022-05-06 22:12:55 +00009581// updatable apexes should propagate updatable=true to its apps
9582func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9583 bp := `
9584 apex {
9585 name: "myapex",
9586 key: "myapex.key",
9587 updatable: %v,
9588 apps: [
9589 "myapp",
9590 ],
9591 min_sdk_version: "30",
9592 }
9593 apex_key {
9594 name: "myapex.key",
9595 }
9596 android_app {
9597 name: "myapp",
9598 updatable: %v,
9599 apex_available: [
9600 "myapex",
9601 ],
9602 sdk_version: "current",
9603 min_sdk_version: "30",
9604 }
9605 `
9606 testCases := []struct {
9607 name string
9608 apex_is_updatable_bp bool
9609 app_is_updatable_bp bool
9610 app_is_updatable_expected bool
9611 }{
9612 {
9613 name: "Non-updatable apex respects updatable property of non-updatable app",
9614 apex_is_updatable_bp: false,
9615 app_is_updatable_bp: false,
9616 app_is_updatable_expected: false,
9617 },
9618 {
9619 name: "Non-updatable apex respects updatable property of updatable app",
9620 apex_is_updatable_bp: false,
9621 app_is_updatable_bp: true,
9622 app_is_updatable_expected: true,
9623 },
9624 {
9625 name: "Updatable apex respects updatable property of updatable app",
9626 apex_is_updatable_bp: true,
9627 app_is_updatable_bp: true,
9628 app_is_updatable_expected: true,
9629 },
9630 {
9631 name: "Updatable apex sets updatable=true on non-updatable app",
9632 apex_is_updatable_bp: true,
9633 app_is_updatable_bp: false,
9634 app_is_updatable_expected: true,
9635 },
9636 }
9637 for _, testCase := range testCases {
9638 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9639 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9640 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9641 }
9642}
9643
Kiyoung Kim487689e2022-07-26 09:48:22 +09009644func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9645 bp := `
9646 apex {
9647 name: "myapex",
9648 key: "myapex.key",
9649 native_shared_libs: ["libfoo"],
9650 min_sdk_version: "29",
9651 }
9652 apex_key {
9653 name: "myapex.key",
9654 }
9655 cc_library {
9656 name: "libfoo",
9657 shared_libs: ["libc"],
9658 apex_available: ["myapex"],
9659 min_sdk_version: "29",
9660 }
9661 cc_api_library {
9662 name: "libc",
9663 src: "libc.so",
9664 min_sdk_version: "29",
9665 recovery_available: true,
9666 }
9667 api_imports {
9668 name: "api_imports",
9669 shared_libs: [
9670 "libc",
9671 ],
9672 header_libs: [],
9673 }
9674 `
9675 result := testApex(t, bp)
9676
9677 hasDep := func(m android.Module, wantDep android.Module) bool {
9678 t.Helper()
9679 var found bool
9680 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9681 if dep == wantDep {
9682 found = true
9683 }
9684 })
9685 return found
9686 }
9687
9688 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9689 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9690
9691 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9692
9693 // libfoo core variant should be buildable in the same inner tree since
9694 // certain mcombo files might build system and apexes in the same inner tree
9695 // libfoo core variant should link against source libc
9696 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9697 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9698 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9699}
9700
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009701func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009702 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009703}