blob: 93fa41ee0f02d35a682cf9ea2b957c798fe68da8 [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()
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // 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 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
2999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
3000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003333
Jooyung Hanccce2f22020-03-07 03:45:53 +09003334 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003335 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338
Jooyung Hanccce2f22020-03-07 03:45:53 +09003339 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003340 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Colin Crossaede88c2020-08-11 12:17:01 -07003344 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3345 // each variant defines additional macros to distinguish which apex variant it is built for
3346
3347 // non-APEX variant does not have __ANDROID_APEX__ defined
3348 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3349 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3350
Dan Albertb19953d2020-11-17 15:29:36 -08003351 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003352 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003355
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 // non-APEX variant does not have __ANDROID_APEX__ defined
3357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3359
Dan Albertb19953d2020-11-17 15:29:36 -08003360 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003361 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003364}
Jiyong Park7e636d02019-01-28 16:16:54 +09003365
3366func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_library_headers {
3382 name: "mylib_headers",
3383 export_include_dirs: ["my_include"],
3384 system_shared_libs: [],
3385 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003386 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003387 }
3388
3389 cc_library {
3390 name: "mylib",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
3394 header_libs: ["mylib_headers"],
3395 export_header_lib_headers: ["mylib_headers"],
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003399 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003400 }
3401
3402 cc_library {
3403 name: "otherlib",
3404 srcs: ["mylib.cpp"],
3405 system_shared_libs: [],
3406 stl: "none",
3407 shared_libs: ["mylib"],
3408 }
3409 `)
3410
Colin Cross7113d202019-11-20 16:39:12 -08003411 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003412
3413 // Ensure that the include path of the header lib is exported to 'otherlib'
3414 ensureContains(t, cFlags, "-Imy_include")
3415}
Alex Light9670d332019-01-29 18:07:33 -08003416
Jiyong Park7cd10e32020-01-14 09:22:18 +09003417type fileInApex struct {
3418 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink bool
3421}
3422
Jooyung Hana57af4a2020-01-23 05:36:59 +00003423func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 copyCmds := apexRule.Args["copy_commands"]
3427 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003428 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 for _, cmd := range strings.Split(copyCmds, "&&") {
3430 cmd = strings.TrimSpace(cmd)
3431 if cmd == "" {
3432 continue
3433 }
3434 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003436 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 switch terms[0] {
3438 case "mkdir":
3439 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 t.Fatal("copyCmds contains invalid cp command", cmd)
3442 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 isLink = false
3446 case "ln":
3447 if len(terms) != 3 && len(terms) != 4 {
3448 // ln LINK TARGET or ln -s LINK TARGET
3449 t.Fatal("copyCmds contains invalid ln command", cmd)
3450 }
3451 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003452 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 isLink = true
3454 default:
3455 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3456 }
3457 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 index := strings.Index(dst, imageApexDir)
3459 if index == -1 {
3460 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3461 }
3462 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003463 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 }
3465 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003466 return ret
3467}
3468
Jooyung Hana57af4a2020-01-23 05:36:59 +00003469func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3470 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 var failed bool
3472 var surplus []string
3473 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003475 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003476 for _, expected := range files {
3477 if matched, _ := path.Match(expected, file.path); matched {
3478 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 mactchFound = true
3480 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003481 }
3482 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 if !mactchFound {
3484 surplus = append(surplus, file.path)
3485 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003486 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003487
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003489 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 t.Log("surplus files", surplus)
3491 failed = true
3492 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003493
3494 if len(files) > len(filesMatched) {
3495 var missing []string
3496 for _, expected := range files {
3497 if !filesMatched[expected] {
3498 missing = append(missing, expected)
3499 }
3500 }
3501 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Log("missing files", missing)
3503 failed = true
3504 }
3505 if failed {
3506 t.Fail()
3507 }
3508}
3509
Jooyung Han344d5432019-08-23 11:17:39 +09003510func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003511 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003512 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003514 "etc/llndk.libraries.29.txt",
3515 "etc/vndkcore.libraries.29.txt",
3516 "etc/vndksp.libraries.29.txt",
3517 "etc/vndkprivate.libraries.29.txt",
3518 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003519 }
3520 testCases := []struct {
3521 vndkVersion string
3522 expectedFiles []string
3523 }{
3524 {
3525 vndkVersion: "current",
3526 expectedFiles: append(commonFiles,
3527 "lib/libvndk.so",
3528 "lib/libvndksp.so",
3529 "lib64/libvndk.so",
3530 "lib64/libvndksp.so"),
3531 },
3532 {
3533 vndkVersion: "",
3534 expectedFiles: append(commonFiles,
3535 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3536 "lib/libvndksp.so",
3537 "lib64/libvndksp.so"),
3538 },
3539 }
3540 for _, tc := range testCases {
3541 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3542 ctx := testApex(t, `
3543 apex_vndk {
3544 name: "com.android.vndk.current",
3545 key: "com.android.vndk.current.key",
3546 updatable: false,
3547 }
3548
3549 apex_key {
3550 name: "com.android.vndk.current.key",
3551 public_key: "testkey.avbpubkey",
3552 private_key: "testkey.pem",
3553 }
3554
3555 cc_library {
3556 name: "libvndk",
3557 srcs: ["mylib.cpp"],
3558 vendor_available: true,
3559 product_available: true,
3560 vndk: {
3561 enabled: true,
3562 },
3563 system_shared_libs: [],
3564 stl: "none",
3565 apex_available: [ "com.android.vndk.current" ],
3566 }
3567
3568 cc_library {
3569 name: "libvndksp",
3570 srcs: ["mylib.cpp"],
3571 vendor_available: true,
3572 product_available: true,
3573 vndk: {
3574 enabled: true,
3575 support_system_process: true,
3576 },
3577 system_shared_libs: [],
3578 stl: "none",
3579 apex_available: [ "com.android.vndk.current" ],
3580 }
3581
3582 // VNDK-Ext should not cause any problems
3583
3584 cc_library {
3585 name: "libvndk.ext",
3586 srcs: ["mylib2.cpp"],
3587 vendor: true,
3588 vndk: {
3589 enabled: true,
3590 extends: "libvndk",
3591 },
3592 system_shared_libs: [],
3593 stl: "none",
3594 }
3595
3596 cc_library {
3597 name: "libvndksp.ext",
3598 srcs: ["mylib2.cpp"],
3599 vendor: true,
3600 vndk: {
3601 enabled: true,
3602 support_system_process: true,
3603 extends: "libvndksp",
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
3607 }
3608 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3609 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3610 }))
3611 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3612 })
3613 }
Jooyung Han344d5432019-08-23 11:17:39 +09003614}
3615
3616func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003618 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003619 name: "com.android.vndk.current",
3620 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003621 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003622 }
3623
3624 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003625 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003626 public_key: "testkey.avbpubkey",
3627 private_key: "testkey.pem",
3628 }
3629
3630 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 name: "libvndk",
3632 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003633 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003634 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003635 vndk: {
3636 enabled: true,
3637 },
3638 system_shared_libs: [],
3639 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003640 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003641 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003642
3643 cc_prebuilt_library_shared {
3644 name: "libvndk.arm",
3645 srcs: ["libvndk.arm.so"],
3646 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003647 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 vndk: {
3649 enabled: true,
3650 },
3651 enabled: false,
3652 arch: {
3653 arm: {
3654 enabled: true,
3655 },
3656 },
3657 system_shared_libs: [],
3658 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003659 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003660 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 `+vndkLibrariesTxtFiles("current"),
3662 withFiles(map[string][]byte{
3663 "libvndk.so": nil,
3664 "libvndk.arm.so": nil,
3665 }))
Colin Cross2807f002021-03-02 10:15:29 -08003666 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 "lib/libvndk.so",
3668 "lib/libvndk.arm.so",
3669 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003670 "lib/libc++.so",
3671 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003673 })
Jooyung Han344d5432019-08-23 11:17:39 +09003674}
3675
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676func vndkLibrariesTxtFiles(vers ...string) (result string) {
3677 for _, v := range vers {
3678 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003679 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003681 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003682 name: "` + txt + `.libraries.txt",
3683 }
3684 `
3685 }
3686 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003687 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003688 result += `
3689 prebuilt_etc {
3690 name: "` + txt + `.libraries.` + v + `.txt",
3691 src: "dummy.txt",
3692 }
3693 `
3694 }
3695 }
3696 }
3697 return
3698}
3699
Jooyung Han344d5432019-08-23 11:17:39 +09003700func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003701 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003702 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003703 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003704 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003706 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003707 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 }
3709
3710 apex_key {
3711 name: "myapex.key",
3712 public_key: "testkey.avbpubkey",
3713 private_key: "testkey.pem",
3714 }
3715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 vndk_prebuilt_shared {
3717 name: "libvndk27",
3718 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003720 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003721 vndk: {
3722 enabled: true,
3723 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003724 target_arch: "arm64",
3725 arch: {
3726 arm: {
3727 srcs: ["libvndk27_arm.so"],
3728 },
3729 arm64: {
3730 srcs: ["libvndk27_arm64.so"],
3731 },
3732 },
Colin Cross2807f002021-03-02 10:15:29 -08003733 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003734 }
3735
3736 vndk_prebuilt_shared {
3737 name: "libvndk27",
3738 version: "27",
3739 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003740 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003741 vndk: {
3742 enabled: true,
3743 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 target_arch: "x86_64",
3745 arch: {
3746 x86: {
3747 srcs: ["libvndk27_x86.so"],
3748 },
3749 x86_64: {
3750 srcs: ["libvndk27_x86_64.so"],
3751 },
3752 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003753 }
3754 `+vndkLibrariesTxtFiles("27"),
3755 withFiles(map[string][]byte{
3756 "libvndk27_arm.so": nil,
3757 "libvndk27_arm64.so": nil,
3758 "libvndk27_x86.so": nil,
3759 "libvndk27_x86_64.so": nil,
3760 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003761
Colin Cross2807f002021-03-02 10:15:29 -08003762 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003763 "lib/libvndk27_arm.so",
3764 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003765 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 })
Jooyung Han344d5432019-08-23 11:17:39 +09003767}
3768
Jooyung Han90eee022019-10-01 20:02:42 +09003769func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003773 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003776 }
3777 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003779 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003780 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003781 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003789
3790 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003791 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003792 actual := proptools.String(bundle.properties.Apex_name)
3793 if !reflect.DeepEqual(actual, expected) {
3794 t.Errorf("Got '%v', expected '%v'", actual, expected)
3795 }
3796 }
3797
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003798 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003799 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003800}
3801
Jooyung Han344d5432019-08-23 11:17:39 +09003802func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003803 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003804 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003805 name: "com.android.vndk.current",
3806 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003808 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003809 }
3810
3811 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
3816
3817 cc_library {
3818 name: "libvndk",
3819 srcs: ["mylib.cpp"],
3820 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003821 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003822 native_bridge_supported: true,
3823 host_supported: true,
3824 vndk: {
3825 enabled: true,
3826 },
3827 system_shared_libs: [],
3828 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003829 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
Colin Cross2807f002021-03-02 10:15:29 -08003831 `+vndkLibrariesTxtFiles("current"),
3832 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003833
Colin Cross2807f002021-03-02 10:15:29 -08003834 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 "lib/libvndk.so",
3836 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003837 "lib/libc++.so",
3838 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003839 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 })
Jooyung Han344d5432019-08-23 11:17:39 +09003841}
3842
3843func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003844 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.current",
3847 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003849 native_bridge_supported: true,
3850 }
3851
3852 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003853 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 cc_library {
3859 name: "libvndk",
3860 srcs: ["mylib.cpp"],
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003863 native_bridge_supported: true,
3864 host_supported: true,
3865 vndk: {
3866 enabled: true,
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `)
3872}
3873
Jooyung Han31c470b2019-10-18 16:26:59 +09003874func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003877 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003879 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003881 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 }
3883
3884 apex_key {
3885 name: "myapex.key",
3886 public_key: "testkey.avbpubkey",
3887 private_key: "testkey.pem",
3888 }
3889
3890 vndk_prebuilt_shared {
3891 name: "libvndk27",
3892 version: "27",
3893 target_arch: "arm",
3894 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003895 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 vndk: {
3897 enabled: true,
3898 },
3899 arch: {
3900 arm: {
3901 srcs: ["libvndk27.so"],
3902 }
3903 },
3904 }
3905
3906 vndk_prebuilt_shared {
3907 name: "libvndk27",
3908 version: "27",
3909 target_arch: "arm",
3910 binder32bit: true,
3911 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003912 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 vndk: {
3914 enabled: true,
3915 },
3916 arch: {
3917 arm: {
3918 srcs: ["libvndk27binder32.so"],
3919 }
3920 },
Colin Cross2807f002021-03-02 10:15:29 -08003921 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003923 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 withFiles(map[string][]byte{
3925 "libvndk27.so": nil,
3926 "libvndk27binder32.so": nil,
3927 }),
3928 withBinder32bit,
3929 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003930 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003931 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3932 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 },
3934 }),
3935 )
3936
Colin Cross2807f002021-03-02 10:15:29 -08003937 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 })
3941}
3942
Jooyung Han45a96772020-06-15 14:59:42 +09003943func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003944 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003945 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003946 name: "com.android.vndk.current",
3947 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003950 }
3951
3952 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "libz",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003962 vndk: {
3963 enabled: true,
3964 },
3965 stubs: {
3966 symbol_file: "libz.map.txt",
3967 versions: ["30"],
3968 }
3969 }
3970 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3971 "libz.map.txt": nil,
3972 }))
3973
Colin Cross2807f002021-03-02 10:15:29 -08003974 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003975 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3976 ensureListEmpty(t, provideNativeLibs)
3977}
3978
Jooyung Hane1633032019-08-01 17:41:43 +09003979func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003980 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003981 apex {
3982 name: "myapex_nodep",
3983 key: "myapex.key",
3984 native_shared_libs: ["lib_nodep"],
3985 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003987 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003988 }
3989
3990 apex {
3991 name: "myapex_dep",
3992 key: "myapex.key",
3993 native_shared_libs: ["lib_dep"],
3994 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003995 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003996 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003997 }
3998
3999 apex {
4000 name: "myapex_provider",
4001 key: "myapex.key",
4002 native_shared_libs: ["libfoo"],
4003 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004006 }
4007
4008 apex {
4009 name: "myapex_selfcontained",
4010 key: "myapex.key",
4011 native_shared_libs: ["lib_dep", "libfoo"],
4012 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "lib_nodep",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004028 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 cc_library {
4032 name: "lib_dep",
4033 srcs: ["mylib.cpp"],
4034 shared_libs: ["libfoo"],
4035 system_shared_libs: [],
4036 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004037 apex_available: [
4038 "myapex_dep",
4039 "myapex_provider",
4040 "myapex_selfcontained",
4041 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004042 }
4043
4044 cc_library {
4045 name: "libfoo",
4046 srcs: ["mytest.cpp"],
4047 stubs: {
4048 versions: ["1"],
4049 },
4050 system_shared_libs: [],
4051 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004052 apex_available: [
4053 "myapex_provider",
4054 "myapex_selfcontained",
4055 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004056 }
4057 `)
4058
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004059 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004060 var provideNativeLibs, requireNativeLibs []string
4061
Sundong Ahnabb64432019-10-22 13:58:29 +09004062 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004063 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4064 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004065 ensureListEmpty(t, provideNativeLibs)
4066 ensureListEmpty(t, requireNativeLibs)
4067
Sundong Ahnabb64432019-10-22 13:58:29 +09004068 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004069 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4070 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004071 ensureListEmpty(t, provideNativeLibs)
4072 ensureListContains(t, requireNativeLibs, "libfoo.so")
4073
Sundong Ahnabb64432019-10-22 13:58:29 +09004074 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004075 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4076 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004077 ensureListContains(t, provideNativeLibs, "libfoo.so")
4078 ensureListEmpty(t, requireNativeLibs)
4079
Sundong Ahnabb64432019-10-22 13:58:29 +09004080 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004081 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4082 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004083 ensureListContains(t, provideNativeLibs, "libfoo.so")
4084 ensureListEmpty(t, requireNativeLibs)
4085}
4086
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004088 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004089 apex {
4090 name: "myapex",
4091 key: "myapex.key",
4092 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004094 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004102
4103 cc_library {
4104 name: "mylib",
4105 srcs: ["mylib.cpp"],
4106 system_shared_libs: [],
4107 stl: "none",
4108 apex_available: [
4109 "//apex_available:platform",
4110 "myapex",
4111 ],
4112 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004113 `)
4114
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004115 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004116 apexManifestRule := module.Rule("apexManifestRule")
4117 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4118 apexRule := module.Rule("apexRule")
4119 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004120
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004121 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004122 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004123 name := apexBundle.BaseModuleName()
4124 prefix := "TARGET_"
4125 var builder strings.Builder
4126 data.Custom(&builder, name, prefix, "", data)
4127 androidMk := builder.String()
Jiyong Parkdb334862020-02-05 17:19:28 +09004128 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004129}
4130
Vinh Tran8f5310f2022-10-07 18:16:47 -04004131func TestCompileMultilibProp(t *testing.T) {
4132 testCases := []struct {
4133 compileMultiLibProp string
4134 containedLibs []string
4135 notContainedLibs []string
4136 }{
4137 {
4138 containedLibs: []string{
4139 "image.apex/lib64/mylib.so",
4140 "image.apex/lib/mylib.so",
4141 },
4142 compileMultiLibProp: `compile_multilib: "both",`,
4143 },
4144 {
4145 containedLibs: []string{"image.apex/lib64/mylib.so"},
4146 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4147 compileMultiLibProp: `compile_multilib: "first",`,
4148 },
4149 {
4150 containedLibs: []string{"image.apex/lib64/mylib.so"},
4151 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4152 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4153 },
4154 {
4155 containedLibs: []string{"image.apex/lib64/mylib.so"},
4156 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4157 compileMultiLibProp: `compile_multilib: "64",`,
4158 },
4159 {
4160 containedLibs: []string{"image.apex/lib/mylib.so"},
4161 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4162 compileMultiLibProp: `compile_multilib: "32",`,
4163 },
4164 }
4165 for _, testCase := range testCases {
4166 ctx := testApex(t, fmt.Sprintf(`
4167 apex {
4168 name: "myapex",
4169 key: "myapex.key",
4170 %s
4171 native_shared_libs: ["mylib"],
4172 updatable: false,
4173 }
4174 apex_key {
4175 name: "myapex.key",
4176 public_key: "testkey.avbpubkey",
4177 private_key: "testkey.pem",
4178 }
4179 cc_library {
4180 name: "mylib",
4181 srcs: ["mylib.cpp"],
4182 apex_available: [
4183 "//apex_available:platform",
4184 "myapex",
4185 ],
4186 }
4187 `, testCase.compileMultiLibProp),
4188 )
4189 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4190 apexRule := module.Rule("apexRule")
4191 copyCmds := apexRule.Args["copy_commands"]
4192 for _, containedLib := range testCase.containedLibs {
4193 ensureContains(t, copyCmds, containedLib)
4194 }
4195 for _, notContainedLib := range testCase.notContainedLibs {
4196 ensureNotContains(t, copyCmds, notContainedLib)
4197 }
4198 }
4199}
4200
Alex Light0851b882019-02-07 13:20:53 -08004201func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004202 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
4206 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004207 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004208 }
4209
4210 apex_key {
4211 name: "myapex.key",
4212 public_key: "testkey.avbpubkey",
4213 private_key: "testkey.pem",
4214 }
4215
4216 cc_library {
4217 name: "mylib_common",
4218 srcs: ["mylib.cpp"],
4219 system_shared_libs: [],
4220 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004221 apex_available: [
4222 "//apex_available:platform",
4223 "myapex",
4224 ],
Alex Light0851b882019-02-07 13:20:53 -08004225 }
4226 `)
4227
Sundong Ahnabb64432019-10-22 13:58:29 +09004228 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004229 apexRule := module.Rule("apexRule")
4230 copyCmds := apexRule.Args["copy_commands"]
4231
4232 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4233 t.Log("Apex was a test apex!")
4234 t.Fail()
4235 }
4236 // Ensure that main rule creates an output
4237 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4238
4239 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004240 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004241
4242 // Ensure that both direct and indirect deps are copied into apex
4243 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4244
Colin Cross7113d202019-11-20 16:39:12 -08004245 // Ensure that the platform variant ends with _shared
4246 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004247
Colin Cross56a83212020-09-15 18:30:11 -07004248 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004249 t.Log("Found mylib_common not in any apex!")
4250 t.Fail()
4251 }
4252}
4253
4254func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004255 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004256 apex_test {
4257 name: "myapex",
4258 key: "myapex.key",
4259 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004260 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004261 }
4262
4263 apex_key {
4264 name: "myapex.key",
4265 public_key: "testkey.avbpubkey",
4266 private_key: "testkey.pem",
4267 }
4268
4269 cc_library {
4270 name: "mylib_common_test",
4271 srcs: ["mylib.cpp"],
4272 system_shared_libs: [],
4273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004274 // TODO: remove //apex_available:platform
4275 apex_available: [
4276 "//apex_available:platform",
4277 "myapex",
4278 ],
Alex Light0851b882019-02-07 13:20:53 -08004279 }
4280 `)
4281
Sundong Ahnabb64432019-10-22 13:58:29 +09004282 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004283 apexRule := module.Rule("apexRule")
4284 copyCmds := apexRule.Args["copy_commands"]
4285
4286 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4287 t.Log("Apex was not a test apex!")
4288 t.Fail()
4289 }
4290 // Ensure that main rule creates an output
4291 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4292
4293 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004294 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004295
4296 // Ensure that both direct and indirect deps are copied into apex
4297 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4298
Colin Cross7113d202019-11-20 16:39:12 -08004299 // Ensure that the platform variant ends with _shared
4300 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004301}
4302
Alex Light9670d332019-01-29 18:07:33 -08004303func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004304 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004308 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004309 multilib: {
4310 first: {
4311 native_shared_libs: ["mylib_common"],
4312 }
4313 },
4314 target: {
4315 android: {
4316 multilib: {
4317 first: {
4318 native_shared_libs: ["mylib"],
4319 }
4320 }
4321 },
4322 host: {
4323 multilib: {
4324 first: {
4325 native_shared_libs: ["mylib2"],
4326 }
4327 }
4328 }
4329 }
4330 }
4331
4332 apex_key {
4333 name: "myapex.key",
4334 public_key: "testkey.avbpubkey",
4335 private_key: "testkey.pem",
4336 }
4337
4338 cc_library {
4339 name: "mylib",
4340 srcs: ["mylib.cpp"],
4341 system_shared_libs: [],
4342 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004343 // TODO: remove //apex_available:platform
4344 apex_available: [
4345 "//apex_available:platform",
4346 "myapex",
4347 ],
Alex Light9670d332019-01-29 18:07:33 -08004348 }
4349
4350 cc_library {
4351 name: "mylib_common",
4352 srcs: ["mylib.cpp"],
4353 system_shared_libs: [],
4354 stl: "none",
4355 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004356 // TODO: remove //apex_available:platform
4357 apex_available: [
4358 "//apex_available:platform",
4359 "myapex",
4360 ],
Alex Light9670d332019-01-29 18:07:33 -08004361 }
4362
4363 cc_library {
4364 name: "mylib2",
4365 srcs: ["mylib.cpp"],
4366 system_shared_libs: [],
4367 stl: "none",
4368 compile_multilib: "first",
4369 }
4370 `)
4371
Sundong Ahnabb64432019-10-22 13:58:29 +09004372 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004373 copyCmds := apexRule.Args["copy_commands"]
4374
4375 // Ensure that main rule creates an output
4376 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4377
4378 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004379 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4380 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4381 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004382
4383 // Ensure that both direct and indirect deps are copied into apex
4384 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4385 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4386 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4387
Colin Cross7113d202019-11-20 16:39:12 -08004388 // Ensure that the platform variant ends with _shared
4389 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4390 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004392}
Jiyong Park04480cf2019-02-06 00:16:29 +09004393
Jiyong Park59140302020-12-14 18:44:04 +09004394func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004399 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004400 arch: {
4401 arm64: {
4402 native_shared_libs: ["mylib.arm64"],
4403 },
4404 x86_64: {
4405 native_shared_libs: ["mylib.x64"],
4406 },
4407 }
4408 }
4409
4410 apex_key {
4411 name: "myapex.key",
4412 public_key: "testkey.avbpubkey",
4413 private_key: "testkey.pem",
4414 }
4415
4416 cc_library {
4417 name: "mylib.arm64",
4418 srcs: ["mylib.cpp"],
4419 system_shared_libs: [],
4420 stl: "none",
4421 // TODO: remove //apex_available:platform
4422 apex_available: [
4423 "//apex_available:platform",
4424 "myapex",
4425 ],
4426 }
4427
4428 cc_library {
4429 name: "mylib.x64",
4430 srcs: ["mylib.cpp"],
4431 system_shared_libs: [],
4432 stl: "none",
4433 // TODO: remove //apex_available:platform
4434 apex_available: [
4435 "//apex_available:platform",
4436 "myapex",
4437 ],
4438 }
4439 `)
4440
4441 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4442 copyCmds := apexRule.Args["copy_commands"]
4443
4444 // Ensure that apex variant is created for the direct dep
4445 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4446 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4447
4448 // Ensure that both direct and indirect deps are copied into apex
4449 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4450 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4451}
4452
Jiyong Park04480cf2019-02-06 00:16:29 +09004453func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004454 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004455 apex {
4456 name: "myapex",
4457 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004458 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004459 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004460 }
4461
4462 apex_key {
4463 name: "myapex.key",
4464 public_key: "testkey.avbpubkey",
4465 private_key: "testkey.pem",
4466 }
4467
4468 sh_binary {
4469 name: "myscript",
4470 src: "mylib.cpp",
4471 filename: "myscript.sh",
4472 sub_dir: "script",
4473 }
4474 `)
4475
Sundong Ahnabb64432019-10-22 13:58:29 +09004476 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004477 copyCmds := apexRule.Args["copy_commands"]
4478
4479 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4480}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004481
Jooyung Han91df2082019-11-20 01:49:42 +09004482func TestApexInVariousPartition(t *testing.T) {
4483 testcases := []struct {
4484 propName, parition, flattenedPartition string
4485 }{
4486 {"", "system", "system_ext"},
4487 {"product_specific: true", "product", "product"},
4488 {"soc_specific: true", "vendor", "vendor"},
4489 {"proprietary: true", "vendor", "vendor"},
4490 {"vendor: true", "vendor", "vendor"},
4491 {"system_ext_specific: true", "system_ext", "system_ext"},
4492 }
4493 for _, tc := range testcases {
4494 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004495 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004499 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004500 `+tc.propName+`
4501 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004502
Jooyung Han91df2082019-11-20 01:49:42 +09004503 apex_key {
4504 name: "myapex.key",
4505 public_key: "testkey.avbpubkey",
4506 private_key: "testkey.pem",
4507 }
4508 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004509
Jooyung Han91df2082019-11-20 01:49:42 +09004510 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004511 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4512 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004513 if actual != expected {
4514 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4515 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004516
Jooyung Han91df2082019-11-20 01:49:42 +09004517 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004518 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4519 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004520 if actual != expected {
4521 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4522 }
4523 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004524 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004525}
Jiyong Park67882562019-03-21 01:11:21 +09004526
Jooyung Han580eb4f2020-06-24 19:33:06 +09004527func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004528 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004529 apex {
4530 name: "myapex",
4531 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004532 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004533 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004534
Jooyung Han580eb4f2020-06-24 19:33:06 +09004535 apex_key {
4536 name: "myapex.key",
4537 public_key: "testkey.avbpubkey",
4538 private_key: "testkey.pem",
4539 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004540 `)
4541 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004542 rule := module.Output("file_contexts")
4543 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4544}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004545
Jooyung Han580eb4f2020-06-24 19:33:06 +09004546func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004547 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004548 apex {
4549 name: "myapex",
4550 key: "myapex.key",
4551 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004552 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004554
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555 apex_key {
4556 name: "myapex.key",
4557 public_key: "testkey.avbpubkey",
4558 private_key: "testkey.pem",
4559 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004560 `, withFiles(map[string][]byte{
4561 "my_own_file_contexts": nil,
4562 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004563}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004564
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004566 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
4570 product_specific: true,
4571 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004572 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004574
Jooyung Han580eb4f2020-06-24 19:33:06 +09004575 apex_key {
4576 name: "myapex.key",
4577 public_key: "testkey.avbpubkey",
4578 private_key: "testkey.pem",
4579 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580 `)
4581
Colin Cross1c460562021-02-16 17:55:47 -08004582 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 product_specific: true,
4587 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004588 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004589 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004590
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591 apex_key {
4592 name: "myapex.key",
4593 public_key: "testkey.avbpubkey",
4594 private_key: "testkey.pem",
4595 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004596 `, withFiles(map[string][]byte{
4597 "product_specific_file_contexts": nil,
4598 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4600 rule := module.Output("file_contexts")
4601 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4602}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004603
Jooyung Han580eb4f2020-06-24 19:33:06 +09004604func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004605 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
4609 product_specific: true,
4610 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004611 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004612 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004613
Jooyung Han580eb4f2020-06-24 19:33:06 +09004614 apex_key {
4615 name: "myapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004619
Jooyung Han580eb4f2020-06-24 19:33:06 +09004620 filegroup {
4621 name: "my-file-contexts",
4622 srcs: ["product_specific_file_contexts"],
4623 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004624 `, withFiles(map[string][]byte{
4625 "product_specific_file_contexts": nil,
4626 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004627 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4628 rule := module.Output("file_contexts")
4629 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004630}
4631
Jiyong Park67882562019-03-21 01:11:21 +09004632func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004633 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004634 apex_key {
4635 name: "myapex.key",
4636 public_key: ":my.avbpubkey",
4637 private_key: ":my.pem",
4638 product_specific: true,
4639 }
4640
4641 filegroup {
4642 name: "my.avbpubkey",
4643 srcs: ["testkey2.avbpubkey"],
4644 }
4645
4646 filegroup {
4647 name: "my.pem",
4648 srcs: ["testkey2.pem"],
4649 }
4650 `)
4651
4652 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4653 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004654 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004655 if actual_pubkey != expected_pubkey {
4656 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4657 }
4658 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004659 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004660 if actual_privkey != expected_privkey {
4661 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4662 }
4663}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004664
4665func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004666 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004667 prebuilt_apex {
4668 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004669 arch: {
4670 arm64: {
4671 src: "myapex-arm64.apex",
4672 },
4673 arm: {
4674 src: "myapex-arm.apex",
4675 },
4676 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004677 }
4678 `)
4679
Wei Li340ee8e2022-03-18 17:33:24 -07004680 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4681 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004682
Jiyong Parkc95714e2019-03-29 14:23:10 +09004683 expectedInput := "myapex-arm64.apex"
4684 if prebuilt.inputApex.String() != expectedInput {
4685 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4686 }
Wei Li340ee8e2022-03-18 17:33:24 -07004687 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4688 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4689 rule := testingModule.Rule("genProvenanceMetaData")
4690 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4691 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4692 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4693 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004694}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004695
Paul Duffinc0609c62021-03-01 17:27:16 +00004696func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004697 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004698 prebuilt_apex {
4699 name: "myapex",
4700 }
4701 `)
4702}
4703
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004704func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004705 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004706 prebuilt_apex {
4707 name: "myapex",
4708 src: "myapex-arm.apex",
4709 filename: "notmyapex.apex",
4710 }
4711 `)
4712
Wei Li340ee8e2022-03-18 17:33:24 -07004713 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4714 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004715
4716 expected := "notmyapex.apex"
4717 if p.installFilename != expected {
4718 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4719 }
Wei Li340ee8e2022-03-18 17:33:24 -07004720 rule := testingModule.Rule("genProvenanceMetaData")
4721 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4722 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4723 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4724 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004725}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004726
Samiul Islam7c02e262021-09-08 17:48:28 +01004727func TestApexSetFilenameOverride(t *testing.T) {
4728 testApex(t, `
4729 apex_set {
4730 name: "com.company.android.myapex",
4731 apex_name: "com.android.myapex",
4732 set: "company-myapex.apks",
4733 filename: "com.company.android.myapex.apex"
4734 }
4735 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4736
4737 testApex(t, `
4738 apex_set {
4739 name: "com.company.android.myapex",
4740 apex_name: "com.android.myapex",
4741 set: "company-myapex.apks",
4742 filename: "com.company.android.myapex.capex"
4743 }
4744 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4745
4746 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4747 apex_set {
4748 name: "com.company.android.myapex",
4749 apex_name: "com.android.myapex",
4750 set: "company-myapex.apks",
4751 filename: "some-random-suffix"
4752 }
4753 `)
4754}
4755
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004756func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004757 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004758 prebuilt_apex {
4759 name: "myapex.prebuilt",
4760 src: "myapex-arm.apex",
4761 overrides: [
4762 "myapex",
4763 ],
4764 }
4765 `)
4766
Wei Li340ee8e2022-03-18 17:33:24 -07004767 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4768 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004769
4770 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004771 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004772 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004773 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004774 }
Wei Li340ee8e2022-03-18 17:33:24 -07004775 rule := testingModule.Rule("genProvenanceMetaData")
4776 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4777 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4778 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4779 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004780}
4781
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004782func TestPrebuiltApexName(t *testing.T) {
4783 testApex(t, `
4784 prebuilt_apex {
4785 name: "com.company.android.myapex",
4786 apex_name: "com.android.myapex",
4787 src: "company-myapex-arm.apex",
4788 }
4789 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4790
4791 testApex(t, `
4792 apex_set {
4793 name: "com.company.android.myapex",
4794 apex_name: "com.android.myapex",
4795 set: "company-myapex.apks",
4796 }
4797 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4798}
4799
4800func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4801 _ = android.GroupFixturePreparers(
4802 java.PrepareForTestWithJavaDefaultModules,
4803 PrepareForTestWithApexBuildComponents,
4804 android.FixtureWithRootAndroidBp(`
4805 platform_bootclasspath {
4806 name: "platform-bootclasspath",
4807 fragments: [
4808 {
4809 apex: "com.android.art",
4810 module: "art-bootclasspath-fragment",
4811 },
4812 ],
4813 }
4814
4815 prebuilt_apex {
4816 name: "com.company.android.art",
4817 apex_name: "com.android.art",
4818 src: "com.company.android.art-arm.apex",
4819 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4820 }
4821
4822 prebuilt_bootclasspath_fragment {
4823 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004824 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004825 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004826 hidden_api: {
4827 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4828 metadata: "my-bootclasspath-fragment/metadata.csv",
4829 index: "my-bootclasspath-fragment/index.csv",
4830 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4831 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4832 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004833 }
4834
4835 java_import {
4836 name: "core-oj",
4837 jars: ["prebuilt.jar"],
4838 }
4839 `),
4840 ).RunTest(t)
4841}
4842
Paul Duffin092153d2021-01-26 11:42:39 +00004843// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4844// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004845func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004846 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004847
Paul Duffin89886cb2021-02-05 16:44:03 +00004848 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004849 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004850 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004851 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004852 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004853 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004854 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4855 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4856 android.NormalizePathForTesting(dexJarBuildPath))
4857 }
4858
4859 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004860 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004861 // Make sure the import has been given the correct path to the dex jar.
4862 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4863 dexJarBuildPath := p.DexJarInstallPath()
4864 stem := android.RemoveOptionalPrebuiltPrefix(name)
4865 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4866 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4867 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 }
4869
Paul Duffin39853512021-02-26 11:09:39 +00004870 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004871 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004872 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004873 android.AssertArrayString(t, "Check if there is no source variant",
4874 []string{"android_common"},
4875 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004876 }
4877
4878 t.Run("prebuilt only", func(t *testing.T) {
4879 bp := `
4880 prebuilt_apex {
4881 name: "myapex",
4882 arch: {
4883 arm64: {
4884 src: "myapex-arm64.apex",
4885 },
4886 arm: {
4887 src: "myapex-arm.apex",
4888 },
4889 },
Paul Duffin39853512021-02-26 11:09:39 +00004890 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004891 }
4892
4893 java_import {
4894 name: "libfoo",
4895 jars: ["libfoo.jar"],
4896 }
Paul Duffin39853512021-02-26 11:09:39 +00004897
4898 java_sdk_library_import {
4899 name: "libbar",
4900 public: {
4901 jars: ["libbar.jar"],
4902 },
4903 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004904 `
4905
4906 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4907 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4908
Martin Stjernholm44825602021-09-17 01:44:12 +01004909 deapexerName := deapexerModuleName("myapex")
4910 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4911
Paul Duffinf6932af2021-02-26 18:21:56 +00004912 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004913 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004914 rule := deapexer.Rule("deapexer")
4915 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4916 t.Errorf("expected: %q, found: %q", expected, actual)
4917 }
4918
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004919 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004920 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004921 rule = prebuiltApex.Rule("android/soong/android.Cp")
4922 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4923 t.Errorf("expected: %q, found: %q", expected, actual)
4924 }
4925
Paul Duffin89886cb2021-02-05 16:44:03 +00004926 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004927 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004928
4929 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004930 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004931 })
4932
4933 t.Run("prebuilt with source preferred", func(t *testing.T) {
4934
4935 bp := `
4936 prebuilt_apex {
4937 name: "myapex",
4938 arch: {
4939 arm64: {
4940 src: "myapex-arm64.apex",
4941 },
4942 arm: {
4943 src: "myapex-arm.apex",
4944 },
4945 },
Paul Duffin39853512021-02-26 11:09:39 +00004946 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004947 }
4948
4949 java_import {
4950 name: "libfoo",
4951 jars: ["libfoo.jar"],
4952 }
4953
4954 java_library {
4955 name: "libfoo",
4956 }
Paul Duffin39853512021-02-26 11:09:39 +00004957
4958 java_sdk_library_import {
4959 name: "libbar",
4960 public: {
4961 jars: ["libbar.jar"],
4962 },
4963 }
4964
4965 java_sdk_library {
4966 name: "libbar",
4967 srcs: ["foo/bar/MyClass.java"],
4968 unsafe_ignore_missing_latest_api: true,
4969 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004970 `
4971
4972 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4973 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4974
Paul Duffin89886cb2021-02-05 16:44:03 +00004975 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004976 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004977 ensureNoSourceVariant(t, ctx, "libfoo")
4978
4979 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004980 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004981 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004982 })
4983
4984 t.Run("prebuilt preferred with source", func(t *testing.T) {
4985 bp := `
4986 prebuilt_apex {
4987 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004988 arch: {
4989 arm64: {
4990 src: "myapex-arm64.apex",
4991 },
4992 arm: {
4993 src: "myapex-arm.apex",
4994 },
4995 },
Paul Duffin39853512021-02-26 11:09:39 +00004996 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004997 }
4998
4999 java_import {
5000 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005001 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005002 jars: ["libfoo.jar"],
5003 }
5004
5005 java_library {
5006 name: "libfoo",
5007 }
Paul Duffin39853512021-02-26 11:09:39 +00005008
5009 java_sdk_library_import {
5010 name: "libbar",
5011 prefer: true,
5012 public: {
5013 jars: ["libbar.jar"],
5014 },
5015 }
5016
5017 java_sdk_library {
5018 name: "libbar",
5019 srcs: ["foo/bar/MyClass.java"],
5020 unsafe_ignore_missing_latest_api: true,
5021 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005022 `
5023
5024 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5025 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5026
Paul Duffin89886cb2021-02-05 16:44:03 +00005027 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005028 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005029 ensureNoSourceVariant(t, ctx, "libfoo")
5030
5031 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005032 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005033 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005034 })
5035}
5036
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005037func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005038 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005039 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005040 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5041 // is disabled.
5042 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5043 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005044
Paul Duffin37856732021-02-26 14:24:15 +00005045 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5046 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005047 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005048 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005049 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005050 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005051 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005052 foundLibfooJar = true
5053 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005054 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005055 }
5056 }
5057 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005058 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 +00005059 }
5060 }
5061
Paul Duffin40a3f652021-07-19 13:11:24 +01005062 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005063 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005064 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005065 var rule android.TestingBuildParams
5066
5067 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5068 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005069 }
5070
Paul Duffin40a3f652021-07-19 13:11:24 +01005071 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5072 t.Helper()
5073 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5074 var rule android.TestingBuildParams
5075
5076 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5077 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5078 }
5079
Paul Duffin89f570a2021-06-16 01:42:33 +01005080 fragment := java.ApexVariantReference{
5081 Apex: proptools.StringPtr("myapex"),
5082 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5083 }
5084
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005085 t.Run("prebuilt only", func(t *testing.T) {
5086 bp := `
5087 prebuilt_apex {
5088 name: "myapex",
5089 arch: {
5090 arm64: {
5091 src: "myapex-arm64.apex",
5092 },
5093 arm: {
5094 src: "myapex-arm.apex",
5095 },
5096 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005097 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5098 }
5099
5100 prebuilt_bootclasspath_fragment {
5101 name: "my-bootclasspath-fragment",
5102 contents: ["libfoo", "libbar"],
5103 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005104 hidden_api: {
5105 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5106 metadata: "my-bootclasspath-fragment/metadata.csv",
5107 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005108 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5109 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5110 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005111 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005112 }
5113
5114 java_import {
5115 name: "libfoo",
5116 jars: ["libfoo.jar"],
5117 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005118 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005119 }
Paul Duffin37856732021-02-26 14:24:15 +00005120
5121 java_sdk_library_import {
5122 name: "libbar",
5123 public: {
5124 jars: ["libbar.jar"],
5125 },
5126 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005127 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005128 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005129 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130 `
5131
Paul Duffin89f570a2021-06-16 01:42:33 +01005132 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005133 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5134 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005135
Paul Duffin537ea3d2021-05-14 10:38:00 +01005136 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005137 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005138 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005139 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005140 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5141 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005142 })
5143
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005144 t.Run("apex_set only", func(t *testing.T) {
5145 bp := `
5146 apex_set {
5147 name: "myapex",
5148 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005149 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5150 }
5151
5152 prebuilt_bootclasspath_fragment {
5153 name: "my-bootclasspath-fragment",
5154 contents: ["libfoo", "libbar"],
5155 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005156 hidden_api: {
5157 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5158 metadata: "my-bootclasspath-fragment/metadata.csv",
5159 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005160 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5161 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5162 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005163 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005164 }
5165
5166 java_import {
5167 name: "libfoo",
5168 jars: ["libfoo.jar"],
5169 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005170 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005171 }
5172
5173 java_sdk_library_import {
5174 name: "libbar",
5175 public: {
5176 jars: ["libbar.jar"],
5177 },
5178 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005179 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005180 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005181 }
5182 `
5183
Paul Duffin89f570a2021-06-16 01:42:33 +01005184 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005185 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5186 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5187
Paul Duffin537ea3d2021-05-14 10:38:00 +01005188 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005189 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005190 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005191 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005192 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5193 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005194 })
5195
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005196 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5197 bp := `
5198 prebuilt_apex {
5199 name: "myapex",
5200 arch: {
5201 arm64: {
5202 src: "myapex-arm64.apex",
5203 },
5204 arm: {
5205 src: "myapex-arm.apex",
5206 },
5207 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005208 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5209 }
5210
5211 prebuilt_bootclasspath_fragment {
5212 name: "my-bootclasspath-fragment",
5213 contents: ["libfoo", "libbar"],
5214 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005215 hidden_api: {
5216 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5217 metadata: "my-bootclasspath-fragment/metadata.csv",
5218 index: "my-bootclasspath-fragment/index.csv",
5219 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5220 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5221 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 }
5223
5224 java_import {
5225 name: "libfoo",
5226 jars: ["libfoo.jar"],
5227 apex_available: ["myapex"],
5228 }
5229
5230 java_library {
5231 name: "libfoo",
5232 srcs: ["foo/bar/MyClass.java"],
5233 apex_available: ["myapex"],
5234 }
Paul Duffin37856732021-02-26 14:24:15 +00005235
5236 java_sdk_library_import {
5237 name: "libbar",
5238 public: {
5239 jars: ["libbar.jar"],
5240 },
5241 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005242 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005243 }
5244
5245 java_sdk_library {
5246 name: "libbar",
5247 srcs: ["foo/bar/MyClass.java"],
5248 unsafe_ignore_missing_latest_api: true,
5249 apex_available: ["myapex"],
5250 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005251 `
5252
5253 // In this test the source (java_library) libfoo is active since the
5254 // prebuilt (java_import) defaults to prefer:false. However the
5255 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5256 // find the dex boot jar in it. We either need to disable the source libfoo
5257 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005258 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005259 // dexbootjar check is skipped if AllowMissingDependencies is true
5260 preparerAllowMissingDeps := android.GroupFixturePreparers(
5261 preparer,
5262 android.PrepareForTestWithAllowMissingDependencies,
5263 )
5264 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005265 })
5266
5267 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5268 bp := `
5269 prebuilt_apex {
5270 name: "myapex",
5271 arch: {
5272 arm64: {
5273 src: "myapex-arm64.apex",
5274 },
5275 arm: {
5276 src: "myapex-arm.apex",
5277 },
5278 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005279 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5280 }
5281
5282 prebuilt_bootclasspath_fragment {
5283 name: "my-bootclasspath-fragment",
5284 contents: ["libfoo", "libbar"],
5285 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005286 hidden_api: {
5287 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5288 metadata: "my-bootclasspath-fragment/metadata.csv",
5289 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005290 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5291 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5292 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005293 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005294 }
5295
5296 java_import {
5297 name: "libfoo",
5298 prefer: true,
5299 jars: ["libfoo.jar"],
5300 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005301 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005302 }
5303
5304 java_library {
5305 name: "libfoo",
5306 srcs: ["foo/bar/MyClass.java"],
5307 apex_available: ["myapex"],
5308 }
Paul Duffin37856732021-02-26 14:24:15 +00005309
5310 java_sdk_library_import {
5311 name: "libbar",
5312 prefer: true,
5313 public: {
5314 jars: ["libbar.jar"],
5315 },
5316 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005317 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005318 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005319 }
5320
5321 java_sdk_library {
5322 name: "libbar",
5323 srcs: ["foo/bar/MyClass.java"],
5324 unsafe_ignore_missing_latest_api: true,
5325 apex_available: ["myapex"],
5326 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005327 `
5328
Paul Duffin89f570a2021-06-16 01:42:33 +01005329 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005330 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5331 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005332
Paul Duffin537ea3d2021-05-14 10:38:00 +01005333 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005334 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005335 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005336 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005337 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5338 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005339 })
5340
5341 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5342 bp := `
5343 apex {
5344 name: "myapex",
5345 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005346 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005347 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005348 }
5349
5350 apex_key {
5351 name: "myapex.key",
5352 public_key: "testkey.avbpubkey",
5353 private_key: "testkey.pem",
5354 }
5355
5356 prebuilt_apex {
5357 name: "myapex",
5358 arch: {
5359 arm64: {
5360 src: "myapex-arm64.apex",
5361 },
5362 arm: {
5363 src: "myapex-arm.apex",
5364 },
5365 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005366 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5367 }
5368
5369 prebuilt_bootclasspath_fragment {
5370 name: "my-bootclasspath-fragment",
5371 contents: ["libfoo", "libbar"],
5372 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005373 hidden_api: {
5374 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5375 metadata: "my-bootclasspath-fragment/metadata.csv",
5376 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005377 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5378 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5379 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005380 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005381 }
5382
5383 java_import {
5384 name: "libfoo",
5385 jars: ["libfoo.jar"],
5386 apex_available: ["myapex"],
5387 }
5388
5389 java_library {
5390 name: "libfoo",
5391 srcs: ["foo/bar/MyClass.java"],
5392 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005393 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005394 }
Paul Duffin37856732021-02-26 14:24:15 +00005395
5396 java_sdk_library_import {
5397 name: "libbar",
5398 public: {
5399 jars: ["libbar.jar"],
5400 },
5401 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005403 }
5404
5405 java_sdk_library {
5406 name: "libbar",
5407 srcs: ["foo/bar/MyClass.java"],
5408 unsafe_ignore_missing_latest_api: true,
5409 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005410 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005411 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 `
5413
Paul Duffin89f570a2021-06-16 01:42:33 +01005414 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005415 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5416 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005417
Paul Duffin537ea3d2021-05-14 10:38:00 +01005418 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005419 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005420 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005421 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005422 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5423 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005424 })
5425
5426 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5427 bp := `
5428 apex {
5429 name: "myapex",
5430 enabled: false,
5431 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005432 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
5441 prebuilt_apex {
5442 name: "myapex",
5443 arch: {
5444 arm64: {
5445 src: "myapex-arm64.apex",
5446 },
5447 arm: {
5448 src: "myapex-arm.apex",
5449 },
5450 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005451 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5452 }
5453
5454 prebuilt_bootclasspath_fragment {
5455 name: "my-bootclasspath-fragment",
5456 contents: ["libfoo", "libbar"],
5457 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005458 hidden_api: {
5459 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5460 metadata: "my-bootclasspath-fragment/metadata.csv",
5461 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005462 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5463 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5464 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005465 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466 }
5467
5468 java_import {
5469 name: "libfoo",
5470 prefer: true,
5471 jars: ["libfoo.jar"],
5472 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005473 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005474 }
5475
5476 java_library {
5477 name: "libfoo",
5478 srcs: ["foo/bar/MyClass.java"],
5479 apex_available: ["myapex"],
5480 }
Paul Duffin37856732021-02-26 14:24:15 +00005481
5482 java_sdk_library_import {
5483 name: "libbar",
5484 prefer: true,
5485 public: {
5486 jars: ["libbar.jar"],
5487 },
5488 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005489 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005490 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005491 }
5492
5493 java_sdk_library {
5494 name: "libbar",
5495 srcs: ["foo/bar/MyClass.java"],
5496 unsafe_ignore_missing_latest_api: true,
5497 apex_available: ["myapex"],
5498 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 `
5500
Paul Duffin89f570a2021-06-16 01:42:33 +01005501 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005502 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5503 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005504
Paul Duffin537ea3d2021-05-14 10:38:00 +01005505 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005506 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005507 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005508 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005509 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5510 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 })
5512}
5513
Roland Levillain630846d2019-06-26 12:48:34 +01005514func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005515 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005516 apex_test {
5517 name: "myapex",
5518 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005519 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005520 tests: [
5521 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005522 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005523 ],
5524 }
5525
5526 apex_key {
5527 name: "myapex.key",
5528 public_key: "testkey.avbpubkey",
5529 private_key: "testkey.pem",
5530 }
5531
Liz Kammer1c14a212020-05-12 15:26:55 -07005532 filegroup {
5533 name: "fg",
5534 srcs: [
5535 "baz",
5536 "bar/baz"
5537 ],
5538 }
5539
Roland Levillain630846d2019-06-26 12:48:34 +01005540 cc_test {
5541 name: "mytest",
5542 gtest: false,
5543 srcs: ["mytest.cpp"],
5544 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005545 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005546 system_shared_libs: [],
5547 static_executable: true,
5548 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005549 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005550 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005551
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005552 cc_library {
5553 name: "mylib",
5554 srcs: ["mylib.cpp"],
5555 system_shared_libs: [],
5556 stl: "none",
5557 }
5558
Liz Kammer5bd365f2020-05-27 15:15:11 -07005559 filegroup {
5560 name: "fg2",
5561 srcs: [
5562 "testdata/baz"
5563 ],
5564 }
5565
Roland Levillain9b5fde92019-06-28 15:41:19 +01005566 cc_test {
5567 name: "mytests",
5568 gtest: false,
5569 srcs: [
5570 "mytest1.cpp",
5571 "mytest2.cpp",
5572 "mytest3.cpp",
5573 ],
5574 test_per_src: true,
5575 relative_install_path: "test",
5576 system_shared_libs: [],
5577 static_executable: true,
5578 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005579 data: [
5580 ":fg",
5581 ":fg2",
5582 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005583 }
Roland Levillain630846d2019-06-26 12:48:34 +01005584 `)
5585
Sundong Ahnabb64432019-10-22 13:58:29 +09005586 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005587 copyCmds := apexRule.Args["copy_commands"]
5588
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005589 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005590 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005591 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005592
Liz Kammer1c14a212020-05-12 15:26:55 -07005593 //Ensure that test data are copied into apex.
5594 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5595 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5596
Roland Levillain9b5fde92019-06-28 15:41:19 +01005597 // Ensure that test deps built with `test_per_src` are copied into apex.
5598 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5599 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5600 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005601
5602 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005603 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005604 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005605 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005606 prefix := "TARGET_"
5607 var builder strings.Builder
5608 data.Custom(&builder, name, prefix, "", data)
5609 androidMk := builder.String()
Roland Levillainf89cd092019-07-29 16:22:59 +01005610 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005611
5612 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005613 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005614 data.Custom(&builder, name, prefix, "", data)
5615 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005616 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5617 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005618}
5619
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005620func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005621 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005622 apex {
5623 name: "myapex",
5624 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005625 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005626 }
5627 apex_key {
5628 name: "myapex.key",
5629 public_key: "testkey.avbpubkey",
5630 private_key: "testkey.pem",
5631 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005632 `,
5633 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5634 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5635 }),
5636 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005637 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005638 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005639 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005640 var builder strings.Builder
5641 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5642 androidMk := builder.String()
5643 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5644}
5645
Jooyung Hand48f3c32019-08-23 11:18:57 +09005646func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5647 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5648 apex {
5649 name: "myapex",
5650 key: "myapex.key",
5651 native_shared_libs: ["libfoo"],
5652 }
5653
5654 apex_key {
5655 name: "myapex.key",
5656 public_key: "testkey.avbpubkey",
5657 private_key: "testkey.pem",
5658 }
5659
5660 cc_library {
5661 name: "libfoo",
5662 stl: "none",
5663 system_shared_libs: [],
5664 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005665 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005666 }
5667 `)
5668 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5669 apex {
5670 name: "myapex",
5671 key: "myapex.key",
5672 java_libs: ["myjar"],
5673 }
5674
5675 apex_key {
5676 name: "myapex.key",
5677 public_key: "testkey.avbpubkey",
5678 private_key: "testkey.pem",
5679 }
5680
5681 java_library {
5682 name: "myjar",
5683 srcs: ["foo/bar/MyClass.java"],
5684 sdk_version: "none",
5685 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005686 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005687 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005688 }
5689 `)
5690}
5691
Bill Peckhama41a6962021-01-11 10:58:54 -08005692func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005693 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005694 apex {
5695 name: "myapex",
5696 key: "myapex.key",
5697 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005698 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005699 }
5700
5701 apex_key {
5702 name: "myapex.key",
5703 public_key: "testkey.avbpubkey",
5704 private_key: "testkey.pem",
5705 }
5706
5707 java_import {
5708 name: "myjavaimport",
5709 apex_available: ["myapex"],
5710 jars: ["my.jar"],
5711 compile_dex: true,
5712 }
5713 `)
5714
5715 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5716 apexRule := module.Rule("apexRule")
5717 copyCmds := apexRule.Args["copy_commands"]
5718 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5719}
5720
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005721func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005722 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005723 apex {
5724 name: "myapex",
5725 key: "myapex.key",
5726 apps: [
5727 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005728 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005729 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005730 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005731 }
5732
5733 apex_key {
5734 name: "myapex.key",
5735 public_key: "testkey.avbpubkey",
5736 private_key: "testkey.pem",
5737 }
5738
5739 android_app {
5740 name: "AppFoo",
5741 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005742 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005743 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005744 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005746 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005747 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005748
5749 android_app {
5750 name: "AppFooPriv",
5751 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005752 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005753 system_modules: "none",
5754 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005755 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005756 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005757 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005758
5759 cc_library_shared {
5760 name: "libjni",
5761 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005762 shared_libs: ["libfoo"],
5763 stl: "none",
5764 system_shared_libs: [],
5765 apex_available: [ "myapex" ],
5766 sdk_version: "current",
5767 }
5768
5769 cc_library_shared {
5770 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005771 stl: "none",
5772 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005773 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005774 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005775 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005776 `)
5777
Sundong Ahnabb64432019-10-22 13:58:29 +09005778 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005779 apexRule := module.Rule("apexRule")
5780 copyCmds := apexRule.Args["copy_commands"]
5781
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005782 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5783 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005784
Colin Crossaede88c2020-08-11 12:17:01 -07005785 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005786 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005787 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005788 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005789 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005790 // JNI libraries including transitive deps are
5791 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005792 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005793 // ... embedded inside APK (jnilibs.zip)
5794 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5795 // ... and not directly inside the APEX
5796 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5797 }
Dario Frenicde2a032019-10-27 00:29:22 +01005798}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005799
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005800func TestApexWithAppImportBuildId(t *testing.T) {
5801 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5802 for _, id := range invalidBuildIds {
5803 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5804 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5805 variables.BuildId = proptools.StringPtr(id)
5806 })
5807 testApexError(t, message, `apex {
5808 name: "myapex",
5809 key: "myapex.key",
5810 apps: ["AppFooPrebuilt"],
5811 updatable: false,
5812 }
5813
5814 apex_key {
5815 name: "myapex.key",
5816 public_key: "testkey.avbpubkey",
5817 private_key: "testkey.pem",
5818 }
5819
5820 android_app_import {
5821 name: "AppFooPrebuilt",
5822 apk: "PrebuiltAppFoo.apk",
5823 presigned: true,
5824 apex_available: ["myapex"],
5825 }
5826 `, fixture)
5827 }
5828}
5829
Dario Frenicde2a032019-10-27 00:29:22 +01005830func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005831 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005832 apex {
5833 name: "myapex",
5834 key: "myapex.key",
5835 apps: [
5836 "AppFooPrebuilt",
5837 "AppFooPrivPrebuilt",
5838 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005839 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005840 }
5841
5842 apex_key {
5843 name: "myapex.key",
5844 public_key: "testkey.avbpubkey",
5845 private_key: "testkey.pem",
5846 }
5847
5848 android_app_import {
5849 name: "AppFooPrebuilt",
5850 apk: "PrebuiltAppFoo.apk",
5851 presigned: true,
5852 dex_preopt: {
5853 enabled: false,
5854 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005855 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005856 }
5857
5858 android_app_import {
5859 name: "AppFooPrivPrebuilt",
5860 apk: "PrebuiltAppFooPriv.apk",
5861 privileged: true,
5862 presigned: true,
5863 dex_preopt: {
5864 enabled: false,
5865 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005866 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005867 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005868 }
5869 `)
5870
Sundong Ahnabb64432019-10-22 13:58:29 +09005871 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005872 apexRule := module.Rule("apexRule")
5873 copyCmds := apexRule.Args["copy_commands"]
5874
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005875 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5876 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005877}
5878
5879func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005880 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005881 apex {
5882 name: "myapex",
5883 key: "myapex.key",
5884 apps: [
5885 "AppFoo",
5886 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005887 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005888 }
5889
5890 apex_key {
5891 name: "myapex.key",
5892 public_key: "testkey.avbpubkey",
5893 private_key: "testkey.pem",
5894 }
5895
5896 android_app {
5897 name: "AppFoo",
5898 srcs: ["foo/bar/MyClass.java"],
5899 sdk_version: "none",
5900 system_modules: "none",
5901 apex_available: [ "myapex" ],
5902 }
5903
5904 android_app_import {
5905 name: "AppFoo",
5906 apk: "AppFooPrebuilt.apk",
5907 filename: "AppFooPrebuilt.apk",
5908 presigned: true,
5909 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005910 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005911 }
5912 `, withFiles(map[string][]byte{
5913 "AppFooPrebuilt.apk": nil,
5914 }))
5915
5916 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005917 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005918 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005919}
5920
Dario Freni6f3937c2019-12-20 22:58:03 +00005921func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005922 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005923 apex {
5924 name: "myapex",
5925 key: "myapex.key",
5926 apps: [
5927 "TesterHelpAppFoo",
5928 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005929 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005930 }
5931
5932 apex_key {
5933 name: "myapex.key",
5934 public_key: "testkey.avbpubkey",
5935 private_key: "testkey.pem",
5936 }
5937
5938 android_test_helper_app {
5939 name: "TesterHelpAppFoo",
5940 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005941 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005942 }
5943
5944 `)
5945
5946 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5947 apexRule := module.Rule("apexRule")
5948 copyCmds := apexRule.Args["copy_commands"]
5949
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005950 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005951}
5952
Jooyung Han18020ea2019-11-13 10:50:48 +09005953func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5954 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005955 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005956 apex {
5957 name: "myapex",
5958 key: "myapex.key",
5959 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005960 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005961 }
5962
5963 apex_key {
5964 name: "myapex.key",
5965 public_key: "testkey.avbpubkey",
5966 private_key: "testkey.pem",
5967 }
5968
5969 apex {
5970 name: "otherapex",
5971 key: "myapex.key",
5972 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005973 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005974 }
5975
5976 cc_defaults {
5977 name: "libfoo-defaults",
5978 apex_available: ["otherapex"],
5979 }
5980
5981 cc_library {
5982 name: "libfoo",
5983 defaults: ["libfoo-defaults"],
5984 stl: "none",
5985 system_shared_libs: [],
5986 }`)
5987}
5988
Paul Duffine52e66f2020-03-30 17:54:29 +01005989func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005990 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005991 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005992 apex {
5993 name: "myapex",
5994 key: "myapex.key",
5995 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005996 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005997 }
5998
5999 apex_key {
6000 name: "myapex.key",
6001 public_key: "testkey.avbpubkey",
6002 private_key: "testkey.pem",
6003 }
6004
6005 apex {
6006 name: "otherapex",
6007 key: "otherapex.key",
6008 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006009 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006010 }
6011
6012 apex_key {
6013 name: "otherapex.key",
6014 public_key: "testkey.avbpubkey",
6015 private_key: "testkey.pem",
6016 }
6017
6018 cc_library {
6019 name: "libfoo",
6020 stl: "none",
6021 system_shared_libs: [],
6022 apex_available: ["otherapex"],
6023 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006024}
Jiyong Park127b40b2019-09-30 16:04:35 +09006025
Paul Duffine52e66f2020-03-30 17:54:29 +01006026func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006027 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006028 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006029.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006030.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006031.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006032.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006033.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006034.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006035 apex {
6036 name: "myapex",
6037 key: "myapex.key",
6038 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006039 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006040 }
6041
6042 apex_key {
6043 name: "myapex.key",
6044 public_key: "testkey.avbpubkey",
6045 private_key: "testkey.pem",
6046 }
6047
Jiyong Park127b40b2019-09-30 16:04:35 +09006048 cc_library {
6049 name: "libfoo",
6050 stl: "none",
6051 shared_libs: ["libbar"],
6052 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006053 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006054 }
6055
6056 cc_library {
6057 name: "libbar",
6058 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006059 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006060 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006061 apex_available: ["myapex"],
6062 }
6063
6064 cc_library {
6065 name: "libbaz",
6066 stl: "none",
6067 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006068 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006069}
Jiyong Park127b40b2019-09-30 16:04:35 +09006070
Paul Duffine52e66f2020-03-30 17:54:29 +01006071func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006072 testApexError(t, "\"otherapex\" is not a valid module name", `
6073 apex {
6074 name: "myapex",
6075 key: "myapex.key",
6076 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006077 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006078 }
6079
6080 apex_key {
6081 name: "myapex.key",
6082 public_key: "testkey.avbpubkey",
6083 private_key: "testkey.pem",
6084 }
6085
6086 cc_library {
6087 name: "libfoo",
6088 stl: "none",
6089 system_shared_libs: [],
6090 apex_available: ["otherapex"],
6091 }`)
6092
Paul Duffine52e66f2020-03-30 17:54:29 +01006093 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006094 apex {
6095 name: "myapex",
6096 key: "myapex.key",
6097 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006098 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006099 }
6100
6101 apex_key {
6102 name: "myapex.key",
6103 public_key: "testkey.avbpubkey",
6104 private_key: "testkey.pem",
6105 }
6106
6107 cc_library {
6108 name: "libfoo",
6109 stl: "none",
6110 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006111 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006112 apex_available: ["myapex"],
6113 }
6114
6115 cc_library {
6116 name: "libbar",
6117 stl: "none",
6118 system_shared_libs: [],
6119 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006120 }
6121
6122 cc_library {
6123 name: "libbaz",
6124 stl: "none",
6125 system_shared_libs: [],
6126 stubs: {
6127 versions: ["10", "20", "30"],
6128 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006129 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006130}
Jiyong Park127b40b2019-09-30 16:04:35 +09006131
Jiyong Park89e850a2020-04-07 16:37:39 +09006132func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006133 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006134 apex {
6135 name: "myapex",
6136 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006137 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006138 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006139 }
6140
6141 apex_key {
6142 name: "myapex.key",
6143 public_key: "testkey.avbpubkey",
6144 private_key: "testkey.pem",
6145 }
6146
6147 cc_library {
6148 name: "libfoo",
6149 stl: "none",
6150 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006151 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006152 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006153 }
6154
6155 cc_library {
6156 name: "libfoo2",
6157 stl: "none",
6158 system_shared_libs: [],
6159 shared_libs: ["libbaz"],
6160 apex_available: ["//apex_available:platform"],
6161 }
6162
6163 cc_library {
6164 name: "libbar",
6165 stl: "none",
6166 system_shared_libs: [],
6167 apex_available: ["myapex"],
6168 }
6169
6170 cc_library {
6171 name: "libbaz",
6172 stl: "none",
6173 system_shared_libs: [],
6174 apex_available: ["myapex"],
6175 stubs: {
6176 versions: ["1"],
6177 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006178 }`)
6179
Jiyong Park89e850a2020-04-07 16:37:39 +09006180 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6181 // because it depends on libbar which isn't available to platform
6182 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6183 if libfoo.NotAvailableForPlatform() != true {
6184 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6185 }
6186
6187 // libfoo2 however can be available to platform because it depends on libbaz which provides
6188 // stubs
6189 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6190 if libfoo2.NotAvailableForPlatform() == true {
6191 t.Errorf("%q should be available to platform", libfoo2.String())
6192 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006193}
Jiyong Parka90ca002019-10-07 15:47:24 +09006194
Paul Duffine52e66f2020-03-30 17:54:29 +01006195func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006196 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 cc_library {
6211 name: "libfoo",
6212 stl: "none",
6213 system_shared_libs: [],
6214 apex_available: ["myapex"],
6215 static: {
6216 apex_available: ["//apex_available:platform"],
6217 },
6218 }`)
6219
Jiyong Park89e850a2020-04-07 16:37:39 +09006220 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6221 if libfooShared.NotAvailableForPlatform() != true {
6222 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6223 }
6224 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6225 if libfooStatic.NotAvailableForPlatform() != false {
6226 t.Errorf("%q should be available to platform", libfooStatic.String())
6227 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006228}
6229
Jiyong Park5d790c32019-11-15 18:40:32 +09006230func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006231 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006232 apex {
6233 name: "myapex",
6234 key: "myapex.key",
6235 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006236 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006237 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006238 bootclasspath_fragments: ["mybootclasspath_fragment"],
6239 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6240 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006241 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006242 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006243 }
6244
6245 override_apex {
6246 name: "override_myapex",
6247 base: "myapex",
6248 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006249 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006250 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006251 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6252 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6253 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006254 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006255 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006256 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006257 key: "mynewapex.key",
6258 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006259 }
6260
6261 apex_key {
6262 name: "myapex.key",
6263 public_key: "testkey.avbpubkey",
6264 private_key: "testkey.pem",
6265 }
6266
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006267 apex_key {
6268 name: "mynewapex.key",
6269 public_key: "testkey2.avbpubkey",
6270 private_key: "testkey2.pem",
6271 }
6272
6273 android_app_certificate {
6274 name: "myapex.certificate",
6275 certificate: "testkey",
6276 }
6277
Jiyong Park5d790c32019-11-15 18:40:32 +09006278 android_app {
6279 name: "app",
6280 srcs: ["foo/bar/MyClass.java"],
6281 package_name: "foo",
6282 sdk_version: "none",
6283 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006284 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006285 }
6286
6287 override_android_app {
6288 name: "override_app",
6289 base: "app",
6290 package_name: "bar",
6291 }
markchien7c803b82021-08-26 22:10:06 +08006292
6293 bpf {
6294 name: "bpf",
6295 srcs: ["bpf.c"],
6296 }
6297
6298 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006299 name: "overrideBpf",
6300 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006301 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006302
6303 prebuilt_etc {
6304 name: "myetc",
6305 src: "myprebuilt",
6306 }
6307
6308 prebuilt_etc {
6309 name: "override_myetc",
6310 src: "override_myprebuilt",
6311 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006312
6313 java_library {
6314 name: "bcplib",
6315 srcs: ["a.java"],
6316 compile_dex: true,
6317 apex_available: ["myapex"],
6318 permitted_packages: ["bcp.lib"],
6319 }
6320
6321 bootclasspath_fragment {
6322 name: "mybootclasspath_fragment",
6323 contents: ["bcplib"],
6324 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006325 hidden_api: {
6326 split_packages: ["*"],
6327 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006328 }
6329
6330 java_library {
6331 name: "override_bcplib",
6332 srcs: ["a.java"],
6333 compile_dex: true,
6334 apex_available: ["myapex"],
6335 permitted_packages: ["override.bcp.lib"],
6336 }
6337
6338 bootclasspath_fragment {
6339 name: "override_bootclasspath_fragment",
6340 contents: ["override_bcplib"],
6341 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006342 hidden_api: {
6343 split_packages: ["*"],
6344 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006345 }
6346
6347 java_library {
6348 name: "systemserverlib",
6349 srcs: ["a.java"],
6350 apex_available: ["myapex"],
6351 }
6352
6353 systemserverclasspath_fragment {
6354 name: "mysystemserverclasspath_fragment",
6355 standalone_contents: ["systemserverlib"],
6356 apex_available: ["myapex"],
6357 }
6358
6359 java_library {
6360 name: "override_systemserverlib",
6361 srcs: ["a.java"],
6362 apex_available: ["myapex"],
6363 }
6364
6365 systemserverclasspath_fragment {
6366 name: "override_systemserverclasspath_fragment",
6367 standalone_contents: ["override_systemserverlib"],
6368 apex_available: ["myapex"],
6369 }
6370
6371 java_library {
6372 name: "myjava_library",
6373 srcs: ["a.java"],
6374 compile_dex: true,
6375 apex_available: ["myapex"],
6376 }
6377
6378 java_library {
6379 name: "override_java_library",
6380 srcs: ["a.java"],
6381 compile_dex: true,
6382 apex_available: ["myapex"],
6383 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006384 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006385
Jiyong Park317645e2019-12-05 13:20:58 +09006386 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6387 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6388 if originalVariant.GetOverriddenBy() != "" {
6389 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6390 }
6391 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6392 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6393 }
6394
Jiyong Park5d790c32019-11-15 18:40:32 +09006395 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6396 apexRule := module.Rule("apexRule")
6397 copyCmds := apexRule.Args["copy_commands"]
6398
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006399 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6400 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006401
markchien7c803b82021-08-26 22:10:06 +08006402 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006403 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006404
Daniel Norman5a3ce132021-08-26 15:44:43 -07006405 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6406 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6407
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006408 apexBundle := module.Module().(*apexBundle)
6409 name := apexBundle.Name()
6410 if name != "override_myapex" {
6411 t.Errorf("name should be \"override_myapex\", but was %q", name)
6412 }
6413
Baligh Uddin004d7172020-02-19 21:29:28 -08006414 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6415 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6416 }
6417
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006418 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6419 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6420 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6421 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6422 android.AssertArrayString(t, "Java_libs does not match",
6423 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6424
Jiyong Park20bacab2020-03-03 11:45:41 +09006425 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006426 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006427 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6428
6429 signApkRule := module.Rule("signapk")
6430 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006431
Colin Crossaa255532020-07-03 13:18:24 -07006432 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006433 var builder strings.Builder
6434 data.Custom(&builder, name, "TARGET_", "", data)
6435 androidMk := builder.String()
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006436 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006437 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006438 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006439 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006440 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006441 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006442 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6443 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6444 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006445 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006446}
6447
Albert Martineefabcf2022-03-21 20:11:16 +00006448func TestMinSdkVersionOverride(t *testing.T) {
6449 // Override from 29 to 31
6450 minSdkOverride31 := "31"
6451 ctx := testApex(t, `
6452 apex {
6453 name: "myapex",
6454 key: "myapex.key",
6455 native_shared_libs: ["mylib"],
6456 updatable: true,
6457 min_sdk_version: "29"
6458 }
6459
6460 override_apex {
6461 name: "override_myapex",
6462 base: "myapex",
6463 logging_parent: "com.foo.bar",
6464 package_name: "test.overridden.package"
6465 }
6466
6467 apex_key {
6468 name: "myapex.key",
6469 public_key: "testkey.avbpubkey",
6470 private_key: "testkey.pem",
6471 }
6472
6473 cc_library {
6474 name: "mylib",
6475 srcs: ["mylib.cpp"],
6476 runtime_libs: ["libbar"],
6477 system_shared_libs: [],
6478 stl: "none",
6479 apex_available: [ "myapex" ],
6480 min_sdk_version: "apex_inherit"
6481 }
6482
6483 cc_library {
6484 name: "libbar",
6485 srcs: ["mylib.cpp"],
6486 system_shared_libs: [],
6487 stl: "none",
6488 apex_available: [ "myapex" ],
6489 min_sdk_version: "apex_inherit"
6490 }
6491
6492 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6493
6494 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6495 copyCmds := apexRule.Args["copy_commands"]
6496
6497 // Ensure that direct non-stubs dep is always included
6498 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6499
6500 // Ensure that runtime_libs dep in included
6501 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6502
6503 // Ensure libraries target overridden min_sdk_version value
6504 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6505}
6506
6507func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6508 // Attempt to override from 31 to 29, should be a NOOP
6509 minSdkOverride29 := "29"
6510 ctx := testApex(t, `
6511 apex {
6512 name: "myapex",
6513 key: "myapex.key",
6514 native_shared_libs: ["mylib"],
6515 updatable: true,
6516 min_sdk_version: "31"
6517 }
6518
6519 override_apex {
6520 name: "override_myapex",
6521 base: "myapex",
6522 logging_parent: "com.foo.bar",
6523 package_name: "test.overridden.package"
6524 }
6525
6526 apex_key {
6527 name: "myapex.key",
6528 public_key: "testkey.avbpubkey",
6529 private_key: "testkey.pem",
6530 }
6531
6532 cc_library {
6533 name: "mylib",
6534 srcs: ["mylib.cpp"],
6535 runtime_libs: ["libbar"],
6536 system_shared_libs: [],
6537 stl: "none",
6538 apex_available: [ "myapex" ],
6539 min_sdk_version: "apex_inherit"
6540 }
6541
6542 cc_library {
6543 name: "libbar",
6544 srcs: ["mylib.cpp"],
6545 system_shared_libs: [],
6546 stl: "none",
6547 apex_available: [ "myapex" ],
6548 min_sdk_version: "apex_inherit"
6549 }
6550
6551 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6552
6553 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6554 copyCmds := apexRule.Args["copy_commands"]
6555
6556 // Ensure that direct non-stubs dep is always included
6557 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6558
6559 // Ensure that runtime_libs dep in included
6560 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6561
6562 // Ensure libraries target the original min_sdk_version value rather than the overridden
6563 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6564}
6565
Jooyung Han214bf372019-11-12 13:03:50 +09006566func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006567 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006568 apex {
6569 name: "myapex",
6570 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006571 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006572 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006573 }
6574
6575 apex_key {
6576 name: "myapex.key",
6577 public_key: "testkey.avbpubkey",
6578 private_key: "testkey.pem",
6579 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006580
6581 cc_library {
6582 name: "mylib",
6583 srcs: ["mylib.cpp"],
6584 stl: "libc++",
6585 system_shared_libs: [],
6586 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006587 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006588 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006589 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006590
6591 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6592 args := module.Rule("apexRule").Args
6593 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006594 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006595
6596 // The copies of the libraries in the apex should have one more dependency than
6597 // the ones outside the apex, namely the unwinder. Ideally we should check
6598 // the dependency names directly here but for some reason the names are blank in
6599 // this test.
6600 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006601 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006602 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6603 if len(apexImplicits) != len(nonApexImplicits)+1 {
6604 t.Errorf("%q missing unwinder dep", lib)
6605 }
6606 }
Jooyung Han214bf372019-11-12 13:03:50 +09006607}
6608
Paul Duffine05480a2021-03-08 15:07:14 +00006609var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006610 "api/current.txt": nil,
6611 "api/removed.txt": nil,
6612 "api/system-current.txt": nil,
6613 "api/system-removed.txt": nil,
6614 "api/test-current.txt": nil,
6615 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006616
Anton Hanssondff2c782020-12-21 17:10:01 +00006617 "100/public/api/foo.txt": nil,
6618 "100/public/api/foo-removed.txt": nil,
6619 "100/system/api/foo.txt": nil,
6620 "100/system/api/foo-removed.txt": nil,
6621
Paul Duffineedc5d52020-06-12 17:46:39 +01006622 // For java_sdk_library_import
6623 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006624}
6625
Jooyung Han58f26ab2019-12-18 15:34:32 +09006626func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006627 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006628 apex {
6629 name: "myapex",
6630 key: "myapex.key",
6631 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006632 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006633 }
6634
6635 apex_key {
6636 name: "myapex.key",
6637 public_key: "testkey.avbpubkey",
6638 private_key: "testkey.pem",
6639 }
6640
6641 java_sdk_library {
6642 name: "foo",
6643 srcs: ["a.java"],
6644 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006645 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006646 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006647
6648 prebuilt_apis {
6649 name: "sdk",
6650 api_dirs: ["100"],
6651 }
Paul Duffin9b879592020-05-26 13:21:35 +01006652 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006653
6654 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006655 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006656 "javalib/foo.jar",
6657 "etc/permissions/foo.xml",
6658 })
6659 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006660 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006661 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 +09006662}
6663
Paul Duffin9b879592020-05-26 13:21:35 +01006664func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006665 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006666 apex {
6667 name: "myapex",
6668 key: "myapex.key",
6669 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006670 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006671 }
6672
6673 apex_key {
6674 name: "myapex.key",
6675 public_key: "testkey.avbpubkey",
6676 private_key: "testkey.pem",
6677 }
6678
6679 java_sdk_library {
6680 name: "foo",
6681 srcs: ["a.java"],
6682 api_packages: ["foo"],
6683 apex_available: ["myapex"],
6684 sdk_version: "none",
6685 system_modules: "none",
6686 }
6687
6688 java_library {
6689 name: "bar",
6690 srcs: ["a.java"],
6691 libs: ["foo"],
6692 apex_available: ["myapex"],
6693 sdk_version: "none",
6694 system_modules: "none",
6695 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006696
6697 prebuilt_apis {
6698 name: "sdk",
6699 api_dirs: ["100"],
6700 }
Paul Duffin9b879592020-05-26 13:21:35 +01006701 `, withFiles(filesForSdkLibrary))
6702
6703 // java_sdk_library installs both impl jar and permission XML
6704 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6705 "javalib/bar.jar",
6706 "javalib/foo.jar",
6707 "etc/permissions/foo.xml",
6708 })
6709
6710 // The bar library should depend on the implementation jar.
6711 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006712 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006713 t.Errorf("expected %q, found %#q", expected, actual)
6714 }
6715}
6716
6717func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006718 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006719 apex {
6720 name: "myapex",
6721 key: "myapex.key",
6722 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006723 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006724 }
6725
6726 apex_key {
6727 name: "myapex.key",
6728 public_key: "testkey.avbpubkey",
6729 private_key: "testkey.pem",
6730 }
6731
6732 java_sdk_library {
6733 name: "foo",
6734 srcs: ["a.java"],
6735 api_packages: ["foo"],
6736 apex_available: ["myapex"],
6737 sdk_version: "none",
6738 system_modules: "none",
6739 }
6740
6741 java_library {
6742 name: "bar",
6743 srcs: ["a.java"],
6744 libs: ["foo"],
6745 sdk_version: "none",
6746 system_modules: "none",
6747 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006748
6749 prebuilt_apis {
6750 name: "sdk",
6751 api_dirs: ["100"],
6752 }
Paul Duffin9b879592020-05-26 13:21:35 +01006753 `, withFiles(filesForSdkLibrary))
6754
6755 // java_sdk_library installs both impl jar and permission XML
6756 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6757 "javalib/foo.jar",
6758 "etc/permissions/foo.xml",
6759 })
6760
6761 // The bar library should depend on the stubs jar.
6762 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006763 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006764 t.Errorf("expected %q, found %#q", expected, actual)
6765 }
6766}
6767
Paul Duffineedc5d52020-06-12 17:46:39 +01006768func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006769 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006770 prebuilt_apis {
6771 name: "sdk",
6772 api_dirs: ["100"],
6773 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006774 withFiles(map[string][]byte{
6775 "apex/a.java": nil,
6776 "apex/apex_manifest.json": nil,
6777 "apex/Android.bp": []byte(`
6778 package {
6779 default_visibility: ["//visibility:private"],
6780 }
6781
6782 apex {
6783 name: "myapex",
6784 key: "myapex.key",
6785 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006786 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006787 }
6788
6789 apex_key {
6790 name: "myapex.key",
6791 public_key: "testkey.avbpubkey",
6792 private_key: "testkey.pem",
6793 }
6794
6795 java_library {
6796 name: "bar",
6797 srcs: ["a.java"],
6798 libs: ["foo"],
6799 apex_available: ["myapex"],
6800 sdk_version: "none",
6801 system_modules: "none",
6802 }
6803`),
6804 "source/a.java": nil,
6805 "source/api/current.txt": nil,
6806 "source/api/removed.txt": nil,
6807 "source/Android.bp": []byte(`
6808 package {
6809 default_visibility: ["//visibility:private"],
6810 }
6811
6812 java_sdk_library {
6813 name: "foo",
6814 visibility: ["//apex"],
6815 srcs: ["a.java"],
6816 api_packages: ["foo"],
6817 apex_available: ["myapex"],
6818 sdk_version: "none",
6819 system_modules: "none",
6820 public: {
6821 enabled: true,
6822 },
6823 }
6824`),
6825 "prebuilt/a.jar": nil,
6826 "prebuilt/Android.bp": []byte(`
6827 package {
6828 default_visibility: ["//visibility:private"],
6829 }
6830
6831 java_sdk_library_import {
6832 name: "foo",
6833 visibility: ["//apex", "//source"],
6834 apex_available: ["myapex"],
6835 prefer: true,
6836 public: {
6837 jars: ["a.jar"],
6838 },
6839 }
6840`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006841 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006842 )
6843
6844 // java_sdk_library installs both impl jar and permission XML
6845 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6846 "javalib/bar.jar",
6847 "javalib/foo.jar",
6848 "etc/permissions/foo.xml",
6849 })
6850
6851 // The bar library should depend on the implementation jar.
6852 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006853 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006854 t.Errorf("expected %q, found %#q", expected, actual)
6855 }
6856}
6857
6858func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6859 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6860 apex {
6861 name: "myapex",
6862 key: "myapex.key",
6863 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006864 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006865 }
6866
6867 apex_key {
6868 name: "myapex.key",
6869 public_key: "testkey.avbpubkey",
6870 private_key: "testkey.pem",
6871 }
6872
6873 java_sdk_library_import {
6874 name: "foo",
6875 apex_available: ["myapex"],
6876 prefer: true,
6877 public: {
6878 jars: ["a.jar"],
6879 },
6880 }
6881
6882 `, withFiles(filesForSdkLibrary))
6883}
6884
atrost6e126252020-01-27 17:01:16 +00006885func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006886 result := android.GroupFixturePreparers(
6887 prepareForApexTest,
6888 java.PrepareForTestWithPlatformCompatConfig,
6889 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006893 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006894 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006895 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006896 }
6897
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903
6904 platform_compat_config {
6905 name: "myjar-platform-compat-config",
6906 src: ":myjar",
6907 }
6908
6909 java_library {
6910 name: "myjar",
6911 srcs: ["foo/bar/MyClass.java"],
6912 sdk_version: "none",
6913 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006914 apex_available: [ "myapex" ],
6915 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006916
6917 // Make sure that a preferred prebuilt does not affect the apex contents.
6918 prebuilt_platform_compat_config {
6919 name: "myjar-platform-compat-config",
6920 metadata: "compat-config/metadata.xml",
6921 prefer: true,
6922 }
atrost6e126252020-01-27 17:01:16 +00006923 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006924 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006925 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6926 "etc/compatconfig/myjar-platform-compat-config.xml",
6927 "javalib/myjar.jar",
6928 })
6929}
6930
Jiyong Park479321d2019-12-16 11:47:12 +09006931func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6932 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6933 apex {
6934 name: "myapex",
6935 key: "myapex.key",
6936 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006937 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006938 }
6939
6940 apex_key {
6941 name: "myapex.key",
6942 public_key: "testkey.avbpubkey",
6943 private_key: "testkey.pem",
6944 }
6945
6946 java_library {
6947 name: "myjar",
6948 srcs: ["foo/bar/MyClass.java"],
6949 sdk_version: "none",
6950 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006951 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006952 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006953 }
6954 `)
6955}
6956
Jiyong Park7afd1072019-12-30 16:56:33 +09006957func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006958 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006959 apex {
6960 name: "myapex",
6961 key: "myapex.key",
6962 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006963 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006964 }
6965
6966 apex_key {
6967 name: "myapex.key",
6968 public_key: "testkey.avbpubkey",
6969 private_key: "testkey.pem",
6970 }
6971
6972 cc_library {
6973 name: "mylib",
6974 srcs: ["mylib.cpp"],
6975 system_shared_libs: [],
6976 stl: "none",
6977 required: ["a", "b"],
6978 host_required: ["c", "d"],
6979 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006980 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006981 }
6982 `)
6983
6984 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006985 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006986 name := apexBundle.BaseModuleName()
6987 prefix := "TARGET_"
6988 var builder strings.Builder
6989 data.Custom(&builder, name, prefix, "", data)
6990 androidMk := builder.String()
6991 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6992 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6993 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6994}
6995
Jiyong Park7cd10e32020-01-14 09:22:18 +09006996func TestSymlinksFromApexToSystem(t *testing.T) {
6997 bp := `
6998 apex {
6999 name: "myapex",
7000 key: "myapex.key",
7001 native_shared_libs: ["mylib"],
7002 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007003 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007004 }
7005
Jiyong Park9d677202020-02-19 16:29:35 +09007006 apex {
7007 name: "myapex.updatable",
7008 key: "myapex.key",
7009 native_shared_libs: ["mylib"],
7010 java_libs: ["myjar"],
7011 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007012 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007013 }
7014
Jiyong Park7cd10e32020-01-14 09:22:18 +09007015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020
7021 cc_library {
7022 name: "mylib",
7023 srcs: ["mylib.cpp"],
7024 shared_libs: ["myotherlib"],
7025 system_shared_libs: [],
7026 stl: "none",
7027 apex_available: [
7028 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007029 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007030 "//apex_available:platform",
7031 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007032 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007033 }
7034
7035 cc_library {
7036 name: "myotherlib",
7037 srcs: ["mylib.cpp"],
7038 system_shared_libs: [],
7039 stl: "none",
7040 apex_available: [
7041 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007042 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007043 "//apex_available:platform",
7044 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007045 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007046 }
7047
7048 java_library {
7049 name: "myjar",
7050 srcs: ["foo/bar/MyClass.java"],
7051 sdk_version: "none",
7052 system_modules: "none",
7053 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007054 apex_available: [
7055 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007056 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007057 "//apex_available:platform",
7058 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007059 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007060 }
7061
7062 java_library {
7063 name: "myotherjar",
7064 srcs: ["foo/bar/MyClass.java"],
7065 sdk_version: "none",
7066 system_modules: "none",
7067 apex_available: [
7068 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007069 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007070 "//apex_available:platform",
7071 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007072 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007073 }
7074 `
7075
7076 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7077 for _, f := range files {
7078 if f.path == file {
7079 if f.isLink {
7080 t.Errorf("%q is not a real file", file)
7081 }
7082 return
7083 }
7084 }
7085 t.Errorf("%q is not found", file)
7086 }
7087
7088 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7089 for _, f := range files {
7090 if f.path == file {
7091 if !f.isLink {
7092 t.Errorf("%q is not a symlink", file)
7093 }
7094 return
7095 }
7096 }
7097 t.Errorf("%q is not found", file)
7098 }
7099
Jiyong Park9d677202020-02-19 16:29:35 +09007100 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7101 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007102 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007103 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007104 ensureRealfileExists(t, files, "javalib/myjar.jar")
7105 ensureRealfileExists(t, files, "lib64/mylib.so")
7106 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7107
Jiyong Park9d677202020-02-19 16:29:35 +09007108 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7109 ensureRealfileExists(t, files, "javalib/myjar.jar")
7110 ensureRealfileExists(t, files, "lib64/mylib.so")
7111 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7112
7113 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007114 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007115 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007116 ensureRealfileExists(t, files, "javalib/myjar.jar")
7117 ensureRealfileExists(t, files, "lib64/mylib.so")
7118 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007119
7120 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7121 ensureRealfileExists(t, files, "javalib/myjar.jar")
7122 ensureRealfileExists(t, files, "lib64/mylib.so")
7123 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007124}
7125
Yo Chiange8128052020-07-23 20:09:18 +08007126func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007127 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007128 apex {
7129 name: "myapex",
7130 key: "myapex.key",
7131 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007132 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007133 }
7134
7135 apex_key {
7136 name: "myapex.key",
7137 public_key: "testkey.avbpubkey",
7138 private_key: "testkey.pem",
7139 }
7140
7141 cc_library_shared {
7142 name: "mylib",
7143 srcs: ["mylib.cpp"],
7144 shared_libs: ["myotherlib"],
7145 system_shared_libs: [],
7146 stl: "none",
7147 apex_available: [
7148 "myapex",
7149 "//apex_available:platform",
7150 ],
7151 }
7152
7153 cc_prebuilt_library_shared {
7154 name: "myotherlib",
7155 srcs: ["prebuilt.so"],
7156 system_shared_libs: [],
7157 stl: "none",
7158 apex_available: [
7159 "myapex",
7160 "//apex_available:platform",
7161 ],
7162 }
7163 `)
7164
Cole Faustb81814a2022-11-03 16:39:21 -07007165 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007166 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007167 var builder strings.Builder
7168 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7169 androidMk := builder.String()
7170 // `myotherlib` is added to `myapex` as symlink
Cole Faustb81814a2022-11-03 16:39:21 -07007171 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex.flattened\n")
Yo Chiange8128052020-07-23 20:09:18 +08007172 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7173 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7174 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Cole Faustb81814a2022-11-03 16:39:21 -07007175 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex.flattened:64 myotherlib:64 apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened\n")
Yo Chiange8128052020-07-23 20:09:18 +08007176}
7177
Jooyung Han643adc42020-02-27 13:50:06 +09007178func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007179 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007180 apex {
7181 name: "myapex",
7182 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007183 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007184 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007185 }
7186
7187 apex_key {
7188 name: "myapex.key",
7189 public_key: "testkey.avbpubkey",
7190 private_key: "testkey.pem",
7191 }
7192
7193 cc_library {
7194 name: "mylib",
7195 srcs: ["mylib.cpp"],
7196 shared_libs: ["mylib2"],
7197 system_shared_libs: [],
7198 stl: "none",
7199 apex_available: [ "myapex" ],
7200 }
7201
7202 cc_library {
7203 name: "mylib2",
7204 srcs: ["mylib.cpp"],
7205 system_shared_libs: [],
7206 stl: "none",
7207 apex_available: [ "myapex" ],
7208 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007209
7210 rust_ffi_shared {
7211 name: "libfoo.rust",
7212 crate_name: "foo",
7213 srcs: ["foo.rs"],
7214 shared_libs: ["libfoo.shared_from_rust"],
7215 prefer_rlib: true,
7216 apex_available: ["myapex"],
7217 }
7218
7219 cc_library_shared {
7220 name: "libfoo.shared_from_rust",
7221 srcs: ["mylib.cpp"],
7222 system_shared_libs: [],
7223 stl: "none",
7224 stubs: {
7225 versions: ["10", "11", "12"],
7226 },
7227 }
7228
Jooyung Han643adc42020-02-27 13:50:06 +09007229 `)
7230
7231 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7232 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007233 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007234 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7235 "lib64/mylib.so",
7236 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007237 "lib64/libfoo.rust.so",
7238 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7239 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007240 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007241
7242 // b/220397949
7243 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007244}
7245
Jooyung Han49f67012020-04-17 13:43:10 +09007246func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007247 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007248 apex {
7249 name: "myapex",
7250 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007251 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007252 }
7253 apex_key {
7254 name: "myapex.key",
7255 public_key: "testkey.avbpubkey",
7256 private_key: "testkey.pem",
7257 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007258 `,
7259 android.FixtureModifyConfig(func(config android.Config) {
7260 delete(config.Targets, android.Android)
7261 config.AndroidCommonTarget = android.Target{}
7262 }),
7263 )
Jooyung Han49f67012020-04-17 13:43:10 +09007264
7265 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7266 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7267 }
7268}
7269
Jiyong Parkbd159612020-02-28 15:22:21 +09007270func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007271 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007272 apex {
7273 name: "myapex",
7274 key: "myapex.key",
7275 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007276 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007277 }
7278
7279 apex_key {
7280 name: "myapex.key",
7281 public_key: "testkey.avbpubkey",
7282 private_key: "testkey.pem",
7283 }
7284
7285 android_app {
7286 name: "AppFoo",
7287 srcs: ["foo/bar/MyClass.java"],
7288 sdk_version: "none",
7289 system_modules: "none",
7290 apex_available: [ "myapex" ],
7291 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007292 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007293
Colin Crosscf371cc2020-11-13 11:48:42 -08007294 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007295 content := bundleConfigRule.Args["content"]
7296
7297 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007298 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 +09007299}
7300
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007301func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007302 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007303 apex {
7304 name: "myapex",
7305 key: "myapex.key",
7306 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007307 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007308 }
7309
7310 apex_key {
7311 name: "myapex.key",
7312 public_key: "testkey.avbpubkey",
7313 private_key: "testkey.pem",
7314 }
7315
7316 android_app_set {
7317 name: "AppSet",
7318 set: "AppSet.apks",
7319 }`)
7320 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007321 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007322 content := bundleConfigRule.Args["content"]
7323 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7324 s := mod.Rule("apexRule").Args["copy_commands"]
7325 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007326 if len(copyCmds) != 4 {
7327 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007328 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007329 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7330 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007331 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7332 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007333
7334 // Ensure that canned_fs_config has an entry for the app set zip file
7335 generateFsRule := mod.Rule("generateFsConfig")
7336 cmd := generateFsRule.RuleParams.Command
7337 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007338}
7339
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007340func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007341 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007342 apex_set {
7343 name: "myapex",
7344 filename: "foo_v2.apex",
7345 sanitized: {
7346 none: { set: "myapex.apks", },
7347 hwaddress: { set: "myapex.hwasan.apks", },
7348 },
Paul Duffin24704672021-04-06 16:09:30 +01007349 }
7350 `
7351 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007352
Paul Duffin24704672021-04-06 16:09:30 +01007353 // Check that the extractor produces the correct output file from the correct input file.
7354 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007355
Paul Duffin24704672021-04-06 16:09:30 +01007356 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7357 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007358
Paul Duffin24704672021-04-06 16:09:30 +01007359 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7360
7361 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007362 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7363 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007364
7365 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007366}
7367
Pranav Guptaeba03b02022-09-27 00:27:08 +00007368func TestApexSetApksModuleAssignment(t *testing.T) {
7369 ctx := testApex(t, `
7370 apex_set {
7371 name: "myapex",
7372 set: ":myapex_apks_file",
7373 }
7374
7375 filegroup {
7376 name: "myapex_apks_file",
7377 srcs: ["myapex.apks"],
7378 }
7379 `)
7380
7381 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7382
7383 // Check that the extractor produces the correct apks file from the input module
7384 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7385 extractedApex := m.Output(extractorOutput)
7386
7387 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7388}
7389
Paul Duffin89f570a2021-06-16 01:42:33 +01007390func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007391 t.Helper()
7392
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007393 bp := `
7394 java_library {
7395 name: "some-updatable-apex-lib",
7396 srcs: ["a.java"],
7397 sdk_version: "current",
7398 apex_available: [
7399 "some-updatable-apex",
7400 ],
satayevabcd5972021-08-06 17:49:46 +01007401 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007402 }
7403
7404 java_library {
7405 name: "some-non-updatable-apex-lib",
7406 srcs: ["a.java"],
7407 apex_available: [
7408 "some-non-updatable-apex",
7409 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007410 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007411 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007412 }
7413
7414 bootclasspath_fragment {
7415 name: "some-non-updatable-fragment",
7416 contents: ["some-non-updatable-apex-lib"],
7417 apex_available: [
7418 "some-non-updatable-apex",
7419 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007420 hidden_api: {
7421 split_packages: ["*"],
7422 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007423 }
7424
7425 java_library {
7426 name: "some-platform-lib",
7427 srcs: ["a.java"],
7428 sdk_version: "current",
7429 installable: true,
7430 }
7431
7432 java_library {
7433 name: "some-art-lib",
7434 srcs: ["a.java"],
7435 sdk_version: "current",
7436 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007437 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007438 ],
7439 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007440 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007441 }
7442
7443 apex {
7444 name: "some-updatable-apex",
7445 key: "some-updatable-apex.key",
7446 java_libs: ["some-updatable-apex-lib"],
7447 updatable: true,
7448 min_sdk_version: "current",
7449 }
7450
7451 apex {
7452 name: "some-non-updatable-apex",
7453 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007454 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007455 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007456 }
7457
7458 apex_key {
7459 name: "some-updatable-apex.key",
7460 }
7461
7462 apex_key {
7463 name: "some-non-updatable-apex.key",
7464 }
7465
7466 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007467 name: "com.android.art.debug",
7468 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007469 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007470 updatable: true,
7471 min_sdk_version: "current",
7472 }
7473
Paul Duffinf23bc472021-04-27 12:42:20 +01007474 bootclasspath_fragment {
7475 name: "art-bootclasspath-fragment",
7476 image_name: "art",
7477 contents: ["some-art-lib"],
7478 apex_available: [
7479 "com.android.art.debug",
7480 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007481 hidden_api: {
7482 split_packages: ["*"],
7483 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007484 }
7485
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007486 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007487 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007488 }
7489
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007490 filegroup {
7491 name: "some-updatable-apex-file_contexts",
7492 srcs: [
7493 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7494 ],
7495 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007496
7497 filegroup {
7498 name: "some-non-updatable-apex-file_contexts",
7499 srcs: [
7500 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7501 ],
7502 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007503 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007504
Paul Duffin89f570a2021-06-16 01:42:33 +01007505 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007506}
7507
Paul Duffin89f570a2021-06-16 01:42:33 +01007508func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007509 t.Helper()
7510
Paul Duffin55607122021-03-30 23:32:51 +01007511 fs := android.MockFS{
7512 "a.java": nil,
7513 "a.jar": nil,
7514 "apex_manifest.json": nil,
7515 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007516 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007517 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7518 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7519 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007520 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007521 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007522
Paul Duffin55607122021-03-30 23:32:51 +01007523 errorHandler := android.FixtureExpectsNoErrors
7524 if errmsg != "" {
7525 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007526 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007527
Paul Duffin55607122021-03-30 23:32:51 +01007528 result := android.GroupFixturePreparers(
7529 cc.PrepareForTestWithCcDefaultModules,
7530 java.PrepareForTestWithHiddenApiBuildComponents,
7531 java.PrepareForTestWithJavaDefaultModules,
7532 java.PrepareForTestWithJavaSdkLibraryFiles,
7533 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007534 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007535 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007536 android.FixtureModifyMockFS(func(fs android.MockFS) {
7537 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7538 insert := ""
7539 for _, fragment := range fragments {
7540 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7541 }
7542 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7543 platform_bootclasspath {
7544 name: "platform-bootclasspath",
7545 fragments: [
7546 %s
7547 ],
7548 }
7549 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007550 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007551 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007552 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007553 ).
7554 ExtendWithErrorHandler(errorHandler).
7555 RunTestWithBp(t, bp)
7556
7557 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007558}
7559
Paul Duffin5556c5f2022-06-09 17:32:21 +00007560func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007561 preparers := android.GroupFixturePreparers(
7562 java.PrepareForTestWithJavaDefaultModules,
7563 PrepareForTestWithApexBuildComponents,
7564 ).
7565 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7566 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7567
7568 bpBase := `
7569 apex_set {
7570 name: "com.android.myapex",
7571 installable: true,
7572 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7573 set: "myapex.apks",
7574 }
7575
7576 apex_set {
7577 name: "com.mycompany.android.myapex",
7578 apex_name: "com.android.myapex",
7579 installable: true,
7580 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7581 set: "company-myapex.apks",
7582 }
7583
7584 prebuilt_bootclasspath_fragment {
7585 name: "my-bootclasspath-fragment",
7586 apex_available: ["com.android.myapex"],
7587 %s
7588 }
7589 `
7590
7591 t.Run("java_import", func(t *testing.T) {
7592 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7593 java_import {
7594 name: "libfoo",
7595 jars: ["libfoo.jar"],
7596 apex_available: ["com.android.myapex"],
7597 }
7598 `)
7599 })
7600
7601 t.Run("java_sdk_library_import", func(t *testing.T) {
7602 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7603 java_sdk_library_import {
7604 name: "libfoo",
7605 public: {
7606 jars: ["libbar.jar"],
7607 },
7608 apex_available: ["com.android.myapex"],
7609 }
7610 `)
7611 })
7612
7613 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7614 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7615 image_name: "art",
7616 contents: ["libfoo"],
7617 `)+`
7618 java_sdk_library_import {
7619 name: "libfoo",
7620 public: {
7621 jars: ["libbar.jar"],
7622 },
7623 apex_available: ["com.android.myapex"],
7624 }
7625 `)
7626 })
7627}
7628
Paul Duffin5556c5f2022-06-09 17:32:21 +00007629func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7630 preparers := android.GroupFixturePreparers(
7631 java.PrepareForTestWithJavaDefaultModules,
7632 PrepareForTestWithApexBuildComponents,
7633 )
7634
7635 bpBase := `
7636 apex_set {
7637 name: "com.android.myapex",
7638 installable: true,
7639 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7640 set: "myapex.apks",
7641 }
7642
7643 apex_set {
7644 name: "com.android.myapex_compressed",
7645 apex_name: "com.android.myapex",
7646 installable: true,
7647 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7648 set: "myapex_compressed.apks",
7649 }
7650
7651 prebuilt_bootclasspath_fragment {
7652 name: "my-bootclasspath-fragment",
7653 apex_available: [
7654 "com.android.myapex",
7655 "com.android.myapex_compressed",
7656 ],
7657 hidden_api: {
7658 annotation_flags: "annotation-flags.csv",
7659 metadata: "metadata.csv",
7660 index: "index.csv",
7661 signature_patterns: "signature_patterns.csv",
7662 },
7663 %s
7664 }
7665 `
7666
7667 t.Run("java_import", func(t *testing.T) {
7668 result := preparers.RunTestWithBp(t,
7669 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7670 java_import {
7671 name: "libfoo",
7672 jars: ["libfoo.jar"],
7673 apex_available: [
7674 "com.android.myapex",
7675 "com.android.myapex_compressed",
7676 ],
7677 }
7678 `)
7679
7680 module := result.Module("libfoo", "android_common_com.android.myapex")
7681 usesLibraryDep := module.(java.UsesLibraryDependency)
7682 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7683 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7684 usesLibraryDep.DexJarBuildPath().Path())
7685 })
7686
7687 t.Run("java_sdk_library_import", func(t *testing.T) {
7688 result := preparers.RunTestWithBp(t,
7689 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7690 java_sdk_library_import {
7691 name: "libfoo",
7692 public: {
7693 jars: ["libbar.jar"],
7694 },
7695 apex_available: [
7696 "com.android.myapex",
7697 "com.android.myapex_compressed",
7698 ],
7699 compile_dex: true,
7700 }
7701 `)
7702
7703 module := result.Module("libfoo", "android_common_com.android.myapex")
7704 usesLibraryDep := module.(java.UsesLibraryDependency)
7705 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7706 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7707 usesLibraryDep.DexJarBuildPath().Path())
7708 })
7709
7710 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7711 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7712 image_name: "art",
7713 contents: ["libfoo"],
7714 `)+`
7715 java_sdk_library_import {
7716 name: "libfoo",
7717 public: {
7718 jars: ["libbar.jar"],
7719 },
7720 apex_available: [
7721 "com.android.myapex",
7722 "com.android.myapex_compressed",
7723 ],
7724 compile_dex: true,
7725 }
7726 `)
7727 })
7728}
7729
Jooyung Han548640b2020-04-27 12:10:30 +09007730func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7731 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 updatable: true,
7736 }
7737
7738 apex_key {
7739 name: "myapex.key",
7740 public_key: "testkey.avbpubkey",
7741 private_key: "testkey.pem",
7742 }
7743 `)
7744}
7745
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007746func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7747 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7748 apex {
7749 name: "myapex",
7750 key: "myapex.key",
7751 }
7752
7753 apex_key {
7754 name: "myapex.key",
7755 public_key: "testkey.avbpubkey",
7756 private_key: "testkey.pem",
7757 }
7758 `)
7759}
7760
Daniel Norman69109112021-12-02 12:52:42 -08007761func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7762 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7763 apex {
7764 name: "myapex",
7765 key: "myapex.key",
7766 updatable: true,
7767 soc_specific: true,
7768 }
7769
7770 apex_key {
7771 name: "myapex.key",
7772 public_key: "testkey.avbpubkey",
7773 private_key: "testkey.pem",
7774 }
7775 `)
7776}
7777
satayevb98371c2021-06-15 16:49:50 +01007778func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7779 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7780 apex {
7781 name: "myapex",
7782 key: "myapex.key",
7783 systemserverclasspath_fragments: [
7784 "mysystemserverclasspathfragment",
7785 ],
7786 min_sdk_version: "29",
7787 updatable: true,
7788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 java_library {
7797 name: "foo",
7798 srcs: ["b.java"],
7799 min_sdk_version: "29",
7800 installable: true,
7801 apex_available: [
7802 "myapex",
7803 ],
7804 }
7805
7806 systemserverclasspath_fragment {
7807 name: "mysystemserverclasspathfragment",
7808 generate_classpaths_proto: false,
7809 contents: [
7810 "foo",
7811 ],
7812 apex_available: [
7813 "myapex",
7814 ],
7815 }
satayevabcd5972021-08-06 17:49:46 +01007816 `,
7817 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7818 )
satayevb98371c2021-06-15 16:49:50 +01007819}
7820
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007821func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007822 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7823 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7824 // modules to be included in the BootJars.
7825 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7826 return android.GroupFixturePreparers(
7827 dexpreopt.FixtureSetBootJars(bootJars...),
7828 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7829 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7830 }),
7831 )
7832 }
7833
7834 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7835 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7836 // specified in the ArtApexJars configuration.
7837 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7838 return android.GroupFixturePreparers(
7839 dexpreopt.FixtureSetArtBootJars(bootJars...),
7840 dexpreopt.FixtureSetBootJars(bootJars...),
7841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7842 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7843 }),
7844 )
7845 }
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 ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007848 preparer := android.GroupFixturePreparers(
7849 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7850 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7851 )
7852 fragments := []java.ApexVariantReference{
7853 {
7854 Apex: proptools.StringPtr("com.android.art.debug"),
7855 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7856 },
7857 {
7858 Apex: proptools.StringPtr("some-non-updatable-apex"),
7859 Module: proptools.StringPtr("some-non-updatable-fragment"),
7860 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007861 }
satayevabcd5972021-08-06 17:49:46 +01007862 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007863 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007864
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007865 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007866 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7867 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007868 preparer := android.GroupFixturePreparers(
7869 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7870 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7871 )
Paul Duffin60264a02021-04-12 20:02:36 +01007872 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007873 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007874
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007875 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 +01007876 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 +01007877 // Update the dexpreopt ArtApexJars directly.
7878 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7879 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007880 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007881
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007882 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 +01007883 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 +01007884 // Update the dexpreopt ArtApexJars directly.
7885 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7886 testNoUpdatableJarsInBootImage(t, err, preparer)
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("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007890 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 +01007891 preparer := android.GroupFixturePreparers(
7892 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7893 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7894 )
Paul Duffin60264a02021-04-12 20:02:36 +01007895 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007896 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007897
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007898 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 +01007899 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007900 fragment := java.ApexVariantReference{
7901 Apex: proptools.StringPtr("some-non-updatable-apex"),
7902 Module: proptools.StringPtr("some-non-updatable-fragment"),
7903 }
7904 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007905 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007906
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007907 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007908 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007909 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7910 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007911 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007912
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007913 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007914 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007915 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7916 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007917 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007918
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007919 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007920 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007921 // Update the dexpreopt ArtApexJars directly.
7922 preparer := prepareSetArtJars("platform:some-platform-lib")
7923 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007924 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007925
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007926 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007927 preparer := android.GroupFixturePreparers(
7928 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7929 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7930 )
7931 fragments := []java.ApexVariantReference{
7932 {
7933 Apex: proptools.StringPtr("some-non-updatable-apex"),
7934 Module: proptools.StringPtr("some-non-updatable-fragment"),
7935 },
7936 }
7937 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007938 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007939}
7940
7941func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007942 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007943 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007944 fragment := java.ApexVariantReference{
7945 Apex: proptools.StringPtr("myapex"),
7946 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7947 }
7948
Paul Duffin064b70c2020-11-02 17:32:38 +00007949 testDexpreoptWithApexes(t, `
7950 prebuilt_apex {
7951 name: "myapex" ,
7952 arch: {
7953 arm64: {
7954 src: "myapex-arm64.apex",
7955 },
7956 arm: {
7957 src: "myapex-arm.apex",
7958 },
7959 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007960 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7961 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007962
Paul Duffin89f570a2021-06-16 01:42:33 +01007963 prebuilt_bootclasspath_fragment {
7964 name: "my-bootclasspath-fragment",
7965 contents: ["libfoo"],
7966 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007967 hidden_api: {
7968 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7969 metadata: "my-bootclasspath-fragment/metadata.csv",
7970 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007971 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7972 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7973 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007974 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007975 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007976
Paul Duffin89f570a2021-06-16 01:42:33 +01007977 java_import {
7978 name: "libfoo",
7979 jars: ["libfoo.jar"],
7980 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007981 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007982 }
7983 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007984 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007985}
7986
Spandan Dasf14e2542021-11-12 00:01:37 +00007987func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007988 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007989 bp += `
7990 apex_key {
7991 name: "myapex.key",
7992 public_key: "testkey.avbpubkey",
7993 private_key: "testkey.pem",
7994 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007995 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007996 "lib1/src/A.java": nil,
7997 "lib2/src/B.java": nil,
7998 "system/sepolicy/apex/myapex-file_contexts": nil,
7999 }
8000
Paul Duffin45338f02021-03-30 23:07:52 +01008001 errorHandler := android.FixtureExpectsNoErrors
8002 if errmsg != "" {
8003 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008004 }
Colin Crossae8600b2020-10-29 17:09:13 -07008005
Paul Duffin45338f02021-03-30 23:07:52 +01008006 android.GroupFixturePreparers(
8007 android.PrepareForTestWithAndroidBuildComponents,
8008 java.PrepareForTestWithJavaBuildComponents,
8009 PrepareForTestWithApexBuildComponents,
8010 android.PrepareForTestWithNeverallowRules(rules),
8011 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008012 apexBootJars := make([]string, 0, len(bootJars))
8013 for _, apexBootJar := range bootJars {
8014 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008015 }
satayevd604b212021-07-21 14:23:52 +01008016 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008017 }),
8018 fs.AddToFixture(),
8019 ).
8020 ExtendWithErrorHandler(errorHandler).
8021 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008022}
8023
8024func TestApexPermittedPackagesRules(t *testing.T) {
8025 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008026 name string
8027 expectedError string
8028 bp string
8029 bootJars []string
8030 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008031 }{
8032
8033 {
8034 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8035 expectedError: "",
8036 bp: `
8037 java_library {
8038 name: "bcp_lib1",
8039 srcs: ["lib1/src/*.java"],
8040 permitted_packages: ["foo.bar"],
8041 apex_available: ["myapex"],
8042 sdk_version: "none",
8043 system_modules: "none",
8044 }
8045 java_library {
8046 name: "nonbcp_lib2",
8047 srcs: ["lib2/src/*.java"],
8048 apex_available: ["myapex"],
8049 permitted_packages: ["a.b"],
8050 sdk_version: "none",
8051 system_modules: "none",
8052 }
8053 apex {
8054 name: "myapex",
8055 key: "myapex.key",
8056 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008057 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008058 }`,
8059 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008060 bcpPermittedPackages: map[string][]string{
8061 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008062 "foo.bar",
8063 },
8064 },
8065 },
8066 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008067 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008068 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 +01008069 bp: `
8070 java_library {
8071 name: "bcp_lib1",
8072 srcs: ["lib1/src/*.java"],
8073 apex_available: ["myapex"],
8074 permitted_packages: ["foo.bar"],
8075 sdk_version: "none",
8076 system_modules: "none",
8077 }
8078 java_library {
8079 name: "bcp_lib2",
8080 srcs: ["lib2/src/*.java"],
8081 apex_available: ["myapex"],
8082 permitted_packages: ["foo.bar", "bar.baz"],
8083 sdk_version: "none",
8084 system_modules: "none",
8085 }
8086 apex {
8087 name: "myapex",
8088 key: "myapex.key",
8089 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008090 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008091 }
8092 `,
8093 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008094 bcpPermittedPackages: map[string][]string{
8095 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008096 "foo.bar",
8097 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008098 "bcp_lib2": []string{
8099 "foo.bar",
8100 },
8101 },
8102 },
8103 {
8104 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8105 expectedError: "",
8106 bp: `
8107 java_library {
8108 name: "bcp_lib_restricted",
8109 srcs: ["lib1/src/*.java"],
8110 apex_available: ["myapex"],
8111 permitted_packages: ["foo.bar"],
8112 sdk_version: "none",
8113 min_sdk_version: "29",
8114 system_modules: "none",
8115 }
8116 java_library {
8117 name: "bcp_lib_unrestricted",
8118 srcs: ["lib2/src/*.java"],
8119 apex_available: ["myapex"],
8120 permitted_packages: ["foo.bar", "bar.baz"],
8121 sdk_version: "none",
8122 min_sdk_version: "29",
8123 system_modules: "none",
8124 }
8125 apex {
8126 name: "myapex",
8127 key: "myapex.key",
8128 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8129 updatable: true,
8130 min_sdk_version: "29",
8131 }
8132 `,
8133 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8134 bcpPermittedPackages: map[string][]string{
8135 "bcp_lib1_non_updateable": []string{
8136 "foo.bar",
8137 },
8138 // 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 +01008139 },
8140 },
8141 }
8142 for _, tc := range testcases {
8143 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008144 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8145 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008146 })
8147 }
8148}
8149
Jiyong Park62304bb2020-04-13 16:19:48 +09008150func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008151 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008152 apex {
8153 name: "myapex",
8154 key: "myapex.key",
8155 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008156 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008157 }
8158
8159 apex_key {
8160 name: "myapex.key",
8161 public_key: "testkey.avbpubkey",
8162 private_key: "testkey.pem",
8163 }
8164
8165 cc_library {
8166 name: "mylib",
8167 srcs: ["mylib.cpp"],
8168 system_shared_libs: [],
8169 stl: "none",
8170 stubs: {
8171 versions: ["1"],
8172 },
8173 apex_available: ["myapex"],
8174 }
8175
8176 cc_library {
8177 name: "myprivlib",
8178 srcs: ["mylib.cpp"],
8179 system_shared_libs: [],
8180 stl: "none",
8181 apex_available: ["myapex"],
8182 }
8183
8184
8185 cc_test {
8186 name: "mytest",
8187 gtest: false,
8188 srcs: ["mylib.cpp"],
8189 system_shared_libs: [],
8190 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008191 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008192 test_for: ["myapex"]
8193 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008194
8195 cc_library {
8196 name: "mytestlib",
8197 srcs: ["mylib.cpp"],
8198 system_shared_libs: [],
8199 shared_libs: ["mylib", "myprivlib"],
8200 stl: "none",
8201 test_for: ["myapex"],
8202 }
8203
8204 cc_benchmark {
8205 name: "mybench",
8206 srcs: ["mylib.cpp"],
8207 system_shared_libs: [],
8208 shared_libs: ["mylib", "myprivlib"],
8209 stl: "none",
8210 test_for: ["myapex"],
8211 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008212 `)
8213
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008214 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008215 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008216 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8217 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8218 }
8219
8220 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008221 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008222 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8223 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8224 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8225}
Jiyong Park46a512f2020-12-04 18:02:13 +09008226
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008227func TestIndirectTestFor(t *testing.T) {
8228 ctx := testApex(t, `
8229 apex {
8230 name: "myapex",
8231 key: "myapex.key",
8232 native_shared_libs: ["mylib", "myprivlib"],
8233 updatable: false,
8234 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008235
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008236 apex_key {
8237 name: "myapex.key",
8238 public_key: "testkey.avbpubkey",
8239 private_key: "testkey.pem",
8240 }
8241
8242 cc_library {
8243 name: "mylib",
8244 srcs: ["mylib.cpp"],
8245 system_shared_libs: [],
8246 stl: "none",
8247 stubs: {
8248 versions: ["1"],
8249 },
8250 apex_available: ["myapex"],
8251 }
8252
8253 cc_library {
8254 name: "myprivlib",
8255 srcs: ["mylib.cpp"],
8256 system_shared_libs: [],
8257 stl: "none",
8258 shared_libs: ["mylib"],
8259 apex_available: ["myapex"],
8260 }
8261
8262 cc_library {
8263 name: "mytestlib",
8264 srcs: ["mylib.cpp"],
8265 system_shared_libs: [],
8266 shared_libs: ["myprivlib"],
8267 stl: "none",
8268 test_for: ["myapex"],
8269 }
8270 `)
8271
8272 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008273 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008274 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8275 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8276 }
8277
8278 // The platform variant of mytestlib links to the platform variant of the
8279 // internal myprivlib.
8280 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8281
8282 // The platform variant of myprivlib links to the platform variant of mylib
8283 // and bypasses its stubs.
8284 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 +09008285}
8286
Martin Stjernholmec009002021-03-27 15:18:31 +00008287func TestTestForForLibInOtherApex(t *testing.T) {
8288 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8289 _ = testApex(t, `
8290 apex {
8291 name: "com.android.art",
8292 key: "myapex.key",
8293 native_shared_libs: ["mylib"],
8294 updatable: false,
8295 }
8296
8297 apex {
8298 name: "com.android.art.debug",
8299 key: "myapex.key",
8300 native_shared_libs: ["mylib", "mytestlib"],
8301 updatable: false,
8302 }
8303
8304 apex_key {
8305 name: "myapex.key",
8306 public_key: "testkey.avbpubkey",
8307 private_key: "testkey.pem",
8308 }
8309
8310 cc_library {
8311 name: "mylib",
8312 srcs: ["mylib.cpp"],
8313 system_shared_libs: [],
8314 stl: "none",
8315 stubs: {
8316 versions: ["1"],
8317 },
8318 apex_available: ["com.android.art", "com.android.art.debug"],
8319 }
8320
8321 cc_library {
8322 name: "mytestlib",
8323 srcs: ["mylib.cpp"],
8324 system_shared_libs: [],
8325 shared_libs: ["mylib"],
8326 stl: "none",
8327 apex_available: ["com.android.art.debug"],
8328 test_for: ["com.android.art"],
8329 }
8330 `,
8331 android.MockFS{
8332 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8333 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8334 }.AddToFixture())
8335}
8336
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008337// TODO(jungjw): Move this to proptools
8338func intPtr(i int) *int {
8339 return &i
8340}
8341
8342func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008343 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008344 apex_set {
8345 name: "myapex",
8346 set: "myapex.apks",
8347 filename: "foo_v2.apex",
8348 overrides: ["foo"],
8349 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008350 `,
8351 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8352 variables.Platform_sdk_version = intPtr(30)
8353 }),
8354 android.FixtureModifyConfig(func(config android.Config) {
8355 config.Targets[android.Android] = []android.Target{
8356 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8357 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8358 }
8359 }),
8360 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008361
Paul Duffin24704672021-04-06 16:09:30 +01008362 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008363
8364 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008365 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008366 actual := extractedApex.Args["abis"]
8367 expected := "ARMEABI_V7A,ARM64_V8A"
8368 if actual != expected {
8369 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8370 }
8371 actual = extractedApex.Args["sdk-version"]
8372 expected = "30"
8373 if actual != expected {
8374 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8375 }
8376
Paul Duffin6717d882021-06-15 19:09:41 +01008377 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008378 a := m.Module().(*ApexSet)
8379 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008380 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008381 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8382 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8383 }
8384}
8385
Jiyong Park7d95a512020-05-10 15:16:24 +09008386func TestNoStaticLinkingToStubsLib(t *testing.T) {
8387 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8388 apex {
8389 name: "myapex",
8390 key: "myapex.key",
8391 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008392 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008393 }
8394
8395 apex_key {
8396 name: "myapex.key",
8397 public_key: "testkey.avbpubkey",
8398 private_key: "testkey.pem",
8399 }
8400
8401 cc_library {
8402 name: "mylib",
8403 srcs: ["mylib.cpp"],
8404 static_libs: ["otherlib"],
8405 system_shared_libs: [],
8406 stl: "none",
8407 apex_available: [ "myapex" ],
8408 }
8409
8410 cc_library {
8411 name: "otherlib",
8412 srcs: ["mylib.cpp"],
8413 system_shared_libs: [],
8414 stl: "none",
8415 stubs: {
8416 versions: ["1", "2", "3"],
8417 },
8418 apex_available: [ "myapex" ],
8419 }
8420 `)
8421}
8422
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008423func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008424 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008425 apex {
8426 name: "myapex",
8427 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008428 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008429 custom_sign_tool: "sign_myapex",
8430 }
8431
8432 apex_key {
8433 name: "myapex.key",
8434 public_key: "testkey.avbpubkey",
8435 private_key: "testkey.pem",
8436 }
8437 `)
8438
8439 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8440 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8441 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"`)
8442}
8443
8444func TestApexKeysTxtOverrides(t *testing.T) {
8445 ctx := testApex(t, `
8446 apex {
8447 name: "myapex",
8448 key: "myapex.key",
8449 updatable: false,
8450 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008451 }
8452
8453 apex_key {
8454 name: "myapex.key",
8455 public_key: "testkey.avbpubkey",
8456 private_key: "testkey.pem",
8457 }
8458
8459 prebuilt_apex {
8460 name: "myapex",
8461 prefer: true,
8462 arch: {
8463 arm64: {
8464 src: "myapex-arm64.apex",
8465 },
8466 arm: {
8467 src: "myapex-arm.apex",
8468 },
8469 },
8470 }
8471
8472 apex_set {
8473 name: "myapex_set",
8474 set: "myapex.apks",
8475 filename: "myapex_set.apex",
8476 overrides: ["myapex"],
8477 }
8478 `)
8479
8480 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8481 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8482 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 +09008483 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 +09008484}
8485
Jooyung Han938b5932020-06-20 12:47:47 +09008486func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008487 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008488 apex {
8489 name: "myapex",
8490 key: "myapex.key",
8491 apps: ["app"],
8492 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008493 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008494 }
8495
8496 apex_key {
8497 name: "myapex.key",
8498 public_key: "testkey.avbpubkey",
8499 private_key: "testkey.pem",
8500 }
8501
8502 android_app {
8503 name: "app",
8504 srcs: ["foo/bar/MyClass.java"],
8505 package_name: "foo",
8506 sdk_version: "none",
8507 system_modules: "none",
8508 apex_available: [ "myapex" ],
8509 }
8510 `, withFiles(map[string][]byte{
8511 "sub/Android.bp": []byte(`
8512 override_apex {
8513 name: "override_myapex",
8514 base: "myapex",
8515 apps: ["override_app"],
8516 allowed_files: ":allowed",
8517 }
8518 // Overridable "path" property should be referenced indirectly
8519 filegroup {
8520 name: "allowed",
8521 srcs: ["allowed.txt"],
8522 }
8523 override_android_app {
8524 name: "override_app",
8525 base: "app",
8526 package_name: "bar",
8527 }
8528 `),
8529 }))
8530
8531 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8532 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8533 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8534 }
8535
8536 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8537 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8538 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8539 }
8540}
8541
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008542func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008543 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008544 apex {
8545 name: "myapex",
8546 key: "myapex.key",
8547 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008548 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008549 }
8550
8551 apex_key {
8552 name: "myapex.key",
8553 public_key: "testkey.avbpubkey",
8554 private_key: "testkey.pem",
8555 }
8556
8557 cc_library {
8558 name: "mylib",
8559 srcs: ["mylib.cpp"],
8560 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008561 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008562 },
8563 apex_available: ["myapex"],
8564 }
8565
8566 cc_prebuilt_library_shared {
8567 name: "mylib",
8568 prefer: false,
8569 srcs: ["prebuilt.so"],
8570 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008571 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008572 },
8573 apex_available: ["myapex"],
8574 }
8575 `)
8576}
8577
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008578func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008579 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008580 apex {
8581 name: "myapex",
8582 key: "myapex.key",
8583 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008584 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008585 }
8586 apex_key {
8587 name: "myapex.key",
8588 public_key: "testkey.avbpubkey",
8589 private_key: "testkey.pem",
8590 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008591 `,
8592 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8593 variables.CompressedApex = proptools.BoolPtr(true)
8594 }),
8595 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008596
8597 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8598 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8599
8600 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8601 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8602
8603 // Make sure output of bundle is .capex
8604 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8605 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8606
8607 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008608 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008609 var builder strings.Builder
8610 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8611 androidMk := builder.String()
8612 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8613}
8614
Martin Stjernholm2856c662020-12-02 15:03:42 +00008615func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008616 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008617 apex {
8618 name: "myapex",
8619 key: "myapex.key",
8620 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008621 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008622 }
8623
8624 apex_key {
8625 name: "myapex.key",
8626 public_key: "testkey.avbpubkey",
8627 private_key: "testkey.pem",
8628 }
8629
8630 cc_library {
8631 name: "mylib",
8632 srcs: ["mylib.cpp"],
8633 apex_available: ["myapex"],
8634 shared_libs: ["otherlib"],
8635 system_shared_libs: [],
8636 }
8637
8638 cc_library {
8639 name: "otherlib",
8640 srcs: ["mylib.cpp"],
8641 stubs: {
8642 versions: ["current"],
8643 },
8644 }
8645
8646 cc_prebuilt_library_shared {
8647 name: "otherlib",
8648 prefer: true,
8649 srcs: ["prebuilt.so"],
8650 stubs: {
8651 versions: ["current"],
8652 },
8653 }
8654 `)
8655
8656 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008657 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008658 var builder strings.Builder
8659 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8660 androidMk := builder.String()
8661
8662 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8663 // a thing there.
8664 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8665}
8666
Jiyong Parke3867542020-12-03 17:28:25 +09008667func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008668 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008669 apex {
8670 name: "myapex",
8671 key: "myapex.key",
8672 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008673 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008674 }
8675
8676 apex_key {
8677 name: "myapex.key",
8678 public_key: "testkey.avbpubkey",
8679 private_key: "testkey.pem",
8680 }
8681
8682 cc_library {
8683 name: "mylib",
8684 srcs: ["mylib.cpp"],
8685 system_shared_libs: [],
8686 stl: "none",
8687 apex_available: ["myapex"],
8688 shared_libs: ["mylib2"],
8689 target: {
8690 apex: {
8691 exclude_shared_libs: ["mylib2"],
8692 },
8693 },
8694 }
8695
8696 cc_library {
8697 name: "mylib2",
8698 srcs: ["mylib.cpp"],
8699 system_shared_libs: [],
8700 stl: "none",
8701 }
8702 `)
8703
8704 // Check if mylib is linked to mylib2 for the non-apex target
8705 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8706 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8707
8708 // Make sure that the link doesn't occur for the apex target
8709 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8710 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8711
8712 // It shouldn't appear in the copy cmd as well.
8713 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8714 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8715}
8716
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008717func TestPrebuiltStubLibDep(t *testing.T) {
8718 bpBase := `
8719 apex {
8720 name: "myapex",
8721 key: "myapex.key",
8722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008723 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008724 }
8725 apex_key {
8726 name: "myapex.key",
8727 public_key: "testkey.avbpubkey",
8728 private_key: "testkey.pem",
8729 }
8730 cc_library {
8731 name: "mylib",
8732 srcs: ["mylib.cpp"],
8733 apex_available: ["myapex"],
8734 shared_libs: ["stublib"],
8735 system_shared_libs: [],
8736 }
8737 apex {
8738 name: "otherapex",
8739 enabled: %s,
8740 key: "myapex.key",
8741 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008742 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008743 }
8744 `
8745
8746 stublibSourceBp := `
8747 cc_library {
8748 name: "stublib",
8749 srcs: ["mylib.cpp"],
8750 apex_available: ["otherapex"],
8751 system_shared_libs: [],
8752 stl: "none",
8753 stubs: {
8754 versions: ["1"],
8755 },
8756 }
8757 `
8758
8759 stublibPrebuiltBp := `
8760 cc_prebuilt_library_shared {
8761 name: "stublib",
8762 srcs: ["prebuilt.so"],
8763 apex_available: ["otherapex"],
8764 stubs: {
8765 versions: ["1"],
8766 },
8767 %s
8768 }
8769 `
8770
8771 tests := []struct {
8772 name string
8773 stublibBp string
8774 usePrebuilt bool
8775 modNames []string // Modules to collect AndroidMkEntries for
8776 otherApexEnabled []string
8777 }{
8778 {
8779 name: "only_source",
8780 stublibBp: stublibSourceBp,
8781 usePrebuilt: false,
8782 modNames: []string{"stublib"},
8783 otherApexEnabled: []string{"true", "false"},
8784 },
8785 {
8786 name: "source_preferred",
8787 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8788 usePrebuilt: false,
8789 modNames: []string{"stublib", "prebuilt_stublib"},
8790 otherApexEnabled: []string{"true", "false"},
8791 },
8792 {
8793 name: "prebuilt_preferred",
8794 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8795 usePrebuilt: true,
8796 modNames: []string{"stublib", "prebuilt_stublib"},
8797 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8798 },
8799 {
8800 name: "only_prebuilt",
8801 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8802 usePrebuilt: true,
8803 modNames: []string{"stublib"},
8804 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8805 },
8806 }
8807
8808 for _, test := range tests {
8809 t.Run(test.name, func(t *testing.T) {
8810 for _, otherApexEnabled := range test.otherApexEnabled {
8811 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008812 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008813
8814 type modAndMkEntries struct {
8815 mod *cc.Module
8816 mkEntries android.AndroidMkEntries
8817 }
8818 entries := []*modAndMkEntries{}
8819
8820 // Gather shared lib modules that are installable
8821 for _, modName := range test.modNames {
8822 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8823 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8824 continue
8825 }
8826 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008827 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008828 continue
8829 }
Colin Crossaa255532020-07-03 13:18:24 -07008830 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008831 if ent.Disabled {
8832 continue
8833 }
8834 entries = append(entries, &modAndMkEntries{
8835 mod: mod,
8836 mkEntries: ent,
8837 })
8838 }
8839 }
8840 }
8841
8842 var entry *modAndMkEntries = nil
8843 for _, ent := range entries {
8844 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8845 if entry != nil {
8846 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8847 } else {
8848 entry = ent
8849 }
8850 }
8851 }
8852
8853 if entry == nil {
8854 t.Errorf("AndroidMk entry for \"stublib\" missing")
8855 } else {
8856 isPrebuilt := entry.mod.Prebuilt() != nil
8857 if isPrebuilt != test.usePrebuilt {
8858 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8859 }
8860 if !entry.mod.IsStubs() {
8861 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8862 }
8863 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8864 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8865 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008866 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008867 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008868 if !android.InList(expected, cflags) {
8869 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8870 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008871 }
8872 })
8873 }
8874 })
8875 }
8876}
8877
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008878func TestHostApexInHostOnlyBuild(t *testing.T) {
8879 testApex(t, `
8880 apex {
8881 name: "myapex",
8882 host_supported: true,
8883 key: "myapex.key",
8884 updatable: false,
8885 payload_type: "zip",
8886 }
8887 apex_key {
8888 name: "myapex.key",
8889 public_key: "testkey.avbpubkey",
8890 private_key: "testkey.pem",
8891 }
8892 `,
8893 android.FixtureModifyConfig(func(config android.Config) {
8894 // We may not have device targets in all builds, e.g. in
8895 // prebuilts/build-tools/build-prebuilts.sh
8896 config.Targets[android.Android] = []android.Target{}
8897 }))
8898}
8899
Colin Crossc33e5212021-05-25 18:16:02 -07008900func TestApexJavaCoverage(t *testing.T) {
8901 bp := `
8902 apex {
8903 name: "myapex",
8904 key: "myapex.key",
8905 java_libs: ["mylib"],
8906 bootclasspath_fragments: ["mybootclasspathfragment"],
8907 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8908 updatable: false,
8909 }
8910
8911 apex_key {
8912 name: "myapex.key",
8913 public_key: "testkey.avbpubkey",
8914 private_key: "testkey.pem",
8915 }
8916
8917 java_library {
8918 name: "mylib",
8919 srcs: ["mylib.java"],
8920 apex_available: ["myapex"],
8921 compile_dex: true,
8922 }
8923
8924 bootclasspath_fragment {
8925 name: "mybootclasspathfragment",
8926 contents: ["mybootclasspathlib"],
8927 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008928 hidden_api: {
8929 split_packages: ["*"],
8930 },
Colin Crossc33e5212021-05-25 18:16:02 -07008931 }
8932
8933 java_library {
8934 name: "mybootclasspathlib",
8935 srcs: ["mybootclasspathlib.java"],
8936 apex_available: ["myapex"],
8937 compile_dex: true,
8938 }
8939
8940 systemserverclasspath_fragment {
8941 name: "mysystemserverclasspathfragment",
8942 contents: ["mysystemserverclasspathlib"],
8943 apex_available: ["myapex"],
8944 }
8945
8946 java_library {
8947 name: "mysystemserverclasspathlib",
8948 srcs: ["mysystemserverclasspathlib.java"],
8949 apex_available: ["myapex"],
8950 compile_dex: true,
8951 }
8952 `
8953
8954 result := android.GroupFixturePreparers(
8955 PrepareForTestWithApexBuildComponents,
8956 prepareForTestWithMyapex,
8957 java.PrepareForTestWithJavaDefaultModules,
8958 android.PrepareForTestWithAndroidBuildComponents,
8959 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008960 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8961 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008962 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008963 ).RunTest(t)
8964
8965 // Make sure jacoco ran on both mylib and mybootclasspathlib
8966 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8967 t.Errorf("Failed to find jacoco rule for mylib")
8968 }
8969 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8970 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8971 }
8972 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8973 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8974 }
8975}
8976
Jiyong Park192600a2021-08-03 07:52:17 +00008977func TestProhibitStaticExecutable(t *testing.T) {
8978 testApexError(t, `executable mybin is static`, `
8979 apex {
8980 name: "myapex",
8981 key: "myapex.key",
8982 binaries: ["mybin"],
8983 min_sdk_version: "29",
8984 }
8985
8986 apex_key {
8987 name: "myapex.key",
8988 public_key: "testkey.avbpubkey",
8989 private_key: "testkey.pem",
8990 }
8991
8992 cc_binary {
8993 name: "mybin",
8994 srcs: ["mylib.cpp"],
8995 relative_install_path: "foo/bar",
8996 static_executable: true,
8997 system_shared_libs: [],
8998 stl: "none",
8999 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009000 min_sdk_version: "29",
9001 }
9002 `)
9003
9004 testApexError(t, `executable mybin.rust is static`, `
9005 apex {
9006 name: "myapex",
9007 key: "myapex.key",
9008 binaries: ["mybin.rust"],
9009 min_sdk_version: "29",
9010 }
9011
9012 apex_key {
9013 name: "myapex.key",
9014 public_key: "testkey.avbpubkey",
9015 private_key: "testkey.pem",
9016 }
9017
9018 rust_binary {
9019 name: "mybin.rust",
9020 srcs: ["foo.rs"],
9021 static_executable: true,
9022 apex_available: ["myapex"],
9023 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009024 }
9025 `)
9026}
9027
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009028func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9029 ctx := testApex(t, `
9030 apex {
9031 name: "myapex",
9032 key: "myapex.key",
9033 updatable: false,
9034 java_libs: ["foo"],
9035 }
9036
9037 apex_key {
9038 name: "myapex.key",
9039 public_key: "testkey.avbpubkey",
9040 private_key: "testkey.pem",
9041 }
9042
9043 java_library {
9044 name: "foo",
9045 srcs: ["foo.java"],
9046 apex_available: ["myapex"],
9047 installable: true,
9048 }
9049 `,
9050 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9051 )
9052
9053 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9054 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9055 var builder strings.Builder
9056 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9057 androidMk := builder.String()
9058 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")
9059}
9060
9061func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9062 ctx := testApex(t, `
9063 prebuilt_apex {
9064 name: "myapex",
9065 arch: {
9066 arm64: {
9067 src: "myapex-arm64.apex",
9068 },
9069 arm: {
9070 src: "myapex-arm.apex",
9071 },
9072 },
9073 exported_java_libs: ["foo"],
9074 }
9075
9076 java_import {
9077 name: "foo",
9078 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009079 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009080 }
9081 `,
9082 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9083 )
9084
9085 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9086 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9087 mainModuleEntries := entriesList[0]
9088 android.AssertArrayString(t,
9089 "LOCAL_REQUIRED_MODULES",
9090 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9091 []string{
9092 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9093 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9094 })
9095}
9096
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009097func TestAndroidMk_RequiredModules(t *testing.T) {
9098 ctx := testApex(t, `
9099 apex {
9100 name: "myapex",
9101 key: "myapex.key",
9102 updatable: false,
9103 java_libs: ["foo"],
9104 required: ["otherapex"],
9105 }
9106
9107 apex {
9108 name: "otherapex",
9109 key: "myapex.key",
9110 updatable: false,
9111 java_libs: ["foo"],
9112 required: ["otherapex"],
9113 }
9114
9115 apex_key {
9116 name: "myapex.key",
9117 public_key: "testkey.avbpubkey",
9118 private_key: "testkey.pem",
9119 }
9120
9121 java_library {
9122 name: "foo",
9123 srcs: ["foo.java"],
9124 apex_available: ["myapex", "otherapex"],
9125 installable: true,
9126 }
9127 `)
9128
9129 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9130 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9131 var builder strings.Builder
9132 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9133 androidMk := builder.String()
9134 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9135}
9136
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009137func TestAndroidMk_RequiredDeps(t *testing.T) {
9138 ctx := testApex(t, `
9139 apex {
9140 name: "myapex",
9141 key: "myapex.key",
9142 updatable: false,
9143 }
9144
9145 apex_key {
9146 name: "myapex.key",
9147 public_key: "testkey.avbpubkey",
9148 private_key: "testkey.pem",
9149 }
9150 `)
9151
9152 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9153 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9154 data := android.AndroidMkDataForTest(t, ctx, bundle)
9155 var builder strings.Builder
9156 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9157 androidMk := builder.String()
9158 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9159
9160 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9161 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9162 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9163 var flattenedBuilder strings.Builder
9164 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9165 flattenedAndroidMk := flattenedBuilder.String()
9166 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9167}
9168
Jooyung Hana6d36672022-02-24 13:58:07 +09009169func TestApexOutputFileProducer(t *testing.T) {
9170 for _, tc := range []struct {
9171 name string
9172 ref string
9173 expected_data []string
9174 }{
9175 {
9176 name: "test_using_output",
9177 ref: ":myapex",
9178 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9179 },
9180 {
9181 name: "test_using_apex",
9182 ref: ":myapex{.apex}",
9183 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9184 },
9185 } {
9186 t.Run(tc.name, func(t *testing.T) {
9187 ctx := testApex(t, `
9188 apex {
9189 name: "myapex",
9190 key: "myapex.key",
9191 compressible: true,
9192 updatable: false,
9193 }
9194
9195 apex_key {
9196 name: "myapex.key",
9197 public_key: "testkey.avbpubkey",
9198 private_key: "testkey.pem",
9199 }
9200
9201 java_test {
9202 name: "`+tc.name+`",
9203 srcs: ["a.java"],
9204 data: ["`+tc.ref+`"],
9205 }
9206 `,
9207 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9208 variables.CompressedApex = proptools.BoolPtr(true)
9209 }))
9210 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9211 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9212 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9213 })
9214 }
9215}
9216
satayev758968a2021-12-06 11:42:40 +00009217func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9218 preparer := android.GroupFixturePreparers(
9219 PrepareForTestWithApexBuildComponents,
9220 prepareForTestWithMyapex,
9221 java.PrepareForTestWithJavaSdkLibraryFiles,
9222 java.PrepareForTestWithJavaDefaultModules,
9223 android.PrepareForTestWithAndroidBuildComponents,
9224 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9225 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9226 )
9227
9228 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9229 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9230 preparer.RunTestWithBp(t, `
9231 apex {
9232 name: "myapex",
9233 key: "myapex.key",
9234 bootclasspath_fragments: ["mybootclasspathfragment"],
9235 min_sdk_version: "30",
9236 updatable: false,
9237 }
9238
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
9244
9245 bootclasspath_fragment {
9246 name: "mybootclasspathfragment",
9247 contents: ["mybootclasspathlib"],
9248 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009249 hidden_api: {
9250 split_packages: ["*"],
9251 },
satayev758968a2021-12-06 11:42:40 +00009252 }
9253
9254 java_sdk_library {
9255 name: "mybootclasspathlib",
9256 srcs: ["mybootclasspathlib.java"],
9257 apex_available: ["myapex"],
9258 compile_dex: true,
9259 unsafe_ignore_missing_latest_api: true,
9260 min_sdk_version: "31",
9261 static_libs: ["util"],
9262 }
9263
9264 java_library {
9265 name: "util",
9266 srcs: ["a.java"],
9267 apex_available: ["myapex"],
9268 min_sdk_version: "31",
9269 static_libs: ["another_util"],
9270 }
9271
9272 java_library {
9273 name: "another_util",
9274 srcs: ["a.java"],
9275 min_sdk_version: "31",
9276 apex_available: ["myapex"],
9277 }
9278 `)
9279 })
9280
9281 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9282 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9283 preparer.RunTestWithBp(t, `
9284 apex {
9285 name: "myapex",
9286 key: "myapex.key",
9287 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9288 min_sdk_version: "30",
9289 updatable: false,
9290 }
9291
9292 apex_key {
9293 name: "myapex.key",
9294 public_key: "testkey.avbpubkey",
9295 private_key: "testkey.pem",
9296 }
9297
9298 systemserverclasspath_fragment {
9299 name: "mysystemserverclasspathfragment",
9300 contents: ["mysystemserverclasspathlib"],
9301 apex_available: ["myapex"],
9302 }
9303
9304 java_sdk_library {
9305 name: "mysystemserverclasspathlib",
9306 srcs: ["mysystemserverclasspathlib.java"],
9307 apex_available: ["myapex"],
9308 compile_dex: true,
9309 min_sdk_version: "32",
9310 unsafe_ignore_missing_latest_api: true,
9311 static_libs: ["util"],
9312 }
9313
9314 java_library {
9315 name: "util",
9316 srcs: ["a.java"],
9317 apex_available: ["myapex"],
9318 min_sdk_version: "31",
9319 static_libs: ["another_util"],
9320 }
9321
9322 java_library {
9323 name: "another_util",
9324 srcs: ["a.java"],
9325 min_sdk_version: "31",
9326 apex_available: ["myapex"],
9327 }
9328 `)
9329 })
9330
9331 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9332 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9333 RunTestWithBp(t, `
9334 apex {
9335 name: "myapex",
9336 key: "myapex.key",
9337 bootclasspath_fragments: ["mybootclasspathfragment"],
9338 min_sdk_version: "30",
9339 updatable: false,
9340 }
9341
9342 apex_key {
9343 name: "myapex.key",
9344 public_key: "testkey.avbpubkey",
9345 private_key: "testkey.pem",
9346 }
9347
9348 bootclasspath_fragment {
9349 name: "mybootclasspathfragment",
9350 contents: ["mybootclasspathlib"],
9351 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009352 hidden_api: {
9353 split_packages: ["*"],
9354 },
satayev758968a2021-12-06 11:42:40 +00009355 }
9356
9357 java_sdk_library {
9358 name: "mybootclasspathlib",
9359 srcs: ["mybootclasspathlib.java"],
9360 apex_available: ["myapex"],
9361 compile_dex: true,
9362 unsafe_ignore_missing_latest_api: true,
9363 }
9364 `)
9365 })
9366
9367 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9368 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9369 RunTestWithBp(t, `
9370 apex {
9371 name: "myapex",
9372 key: "myapex.key",
9373 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9374 min_sdk_version: "30",
9375 updatable: false,
9376 }
9377
9378 apex_key {
9379 name: "myapex.key",
9380 public_key: "testkey.avbpubkey",
9381 private_key: "testkey.pem",
9382 }
9383
9384 systemserverclasspath_fragment {
9385 name: "mysystemserverclasspathfragment",
9386 contents: ["mysystemserverclasspathlib"],
9387 apex_available: ["myapex"],
9388 }
9389
9390 java_sdk_library {
9391 name: "mysystemserverclasspathlib",
9392 srcs: ["mysystemserverclasspathlib.java"],
9393 apex_available: ["myapex"],
9394 compile_dex: true,
9395 unsafe_ignore_missing_latest_api: true,
9396 }
9397 `)
9398 })
9399}
9400
Jiakai Zhang6decef92022-01-12 17:56:19 +00009401// Verifies that the APEX depends on all the Make modules in the list.
9402func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9403 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9404 for _, dep := range deps {
9405 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9406 }
9407}
9408
9409// Verifies that the APEX does not depend on any of the Make modules in the list.
9410func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9411 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9412 for _, dep := range deps {
9413 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9414 }
9415}
9416
Spandan Das66773252022-01-15 00:23:18 +00009417func TestApexStrictUpdtabilityLint(t *testing.T) {
9418 bpTemplate := `
9419 apex {
9420 name: "myapex",
9421 key: "myapex.key",
9422 java_libs: ["myjavalib"],
9423 updatable: %v,
9424 min_sdk_version: "29",
9425 }
9426 apex_key {
9427 name: "myapex.key",
9428 }
9429 java_library {
9430 name: "myjavalib",
9431 srcs: ["MyClass.java"],
9432 apex_available: [ "myapex" ],
9433 lint: {
9434 strict_updatability_linting: %v,
9435 },
9436 sdk_version: "current",
9437 min_sdk_version: "29",
9438 }
9439 `
9440 fs := android.MockFS{
9441 "lint-baseline.xml": nil,
9442 }
9443
9444 testCases := []struct {
9445 testCaseName string
9446 apexUpdatable bool
9447 javaStrictUpdtabilityLint bool
9448 lintFileExists bool
9449 disallowedFlagExpected bool
9450 }{
9451 {
9452 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9453 apexUpdatable: true,
9454 javaStrictUpdtabilityLint: true,
9455 lintFileExists: false,
9456 disallowedFlagExpected: false,
9457 },
9458 {
9459 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9460 apexUpdatable: false,
9461 javaStrictUpdtabilityLint: false,
9462 lintFileExists: true,
9463 disallowedFlagExpected: false,
9464 },
9465 {
9466 testCaseName: "non-updatable apex respects strict updatability of javalib",
9467 apexUpdatable: false,
9468 javaStrictUpdtabilityLint: true,
9469 lintFileExists: true,
9470 disallowedFlagExpected: true,
9471 },
9472 {
9473 testCaseName: "updatable apex sets strict updatability of javalib to true",
9474 apexUpdatable: true,
9475 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9476 lintFileExists: true,
9477 disallowedFlagExpected: true,
9478 },
9479 }
9480
9481 for _, testCase := range testCases {
9482 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9483 fixtures := []android.FixturePreparer{}
9484 if testCase.lintFileExists {
9485 fixtures = append(fixtures, fs.AddToFixture())
9486 }
9487
9488 result := testApex(t, bp, fixtures...)
9489 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9490 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9491 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9492
9493 if disallowedFlagActual != testCase.disallowedFlagExpected {
9494 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9495 }
9496 }
9497}
9498
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009499func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9500 bp := `
9501 apex {
9502 name: "myapex",
9503 key: "myapex.key",
9504 java_libs: ["myjavalib"],
9505 updatable: true,
9506 min_sdk_version: "29",
9507 }
9508 apex_key {
9509 name: "myapex.key",
9510 }
9511 java_library {
9512 name: "myjavalib",
9513 srcs: ["MyClass.java"],
9514 apex_available: [ "myapex" ],
9515 sdk_version: "current",
9516 min_sdk_version: "29",
9517 }
9518 `
9519
9520 testCases := []struct {
9521 testCaseName string
9522 moduleDirectory string
9523 disallowedFlagExpected bool
9524 }{
9525 {
9526 testCaseName: "lintable module defined outside libcore",
9527 moduleDirectory: "",
9528 disallowedFlagExpected: true,
9529 },
9530 {
9531 testCaseName: "lintable module defined in libcore root directory",
9532 moduleDirectory: "libcore/",
9533 disallowedFlagExpected: false,
9534 },
9535 {
9536 testCaseName: "lintable module defined in libcore child directory",
9537 moduleDirectory: "libcore/childdir/",
9538 disallowedFlagExpected: true,
9539 },
9540 }
9541
9542 for _, testCase := range testCases {
9543 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9544 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9545 result := testApex(t, "", lintFileCreator, bpFileCreator)
9546 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9547 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9548 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9549 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9550
9551 if disallowedFlagActual != testCase.disallowedFlagExpected {
9552 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9553 }
9554 }
9555}
9556
Spandan Das66773252022-01-15 00:23:18 +00009557// checks transtive deps of an apex coming from bootclasspath_fragment
9558func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9559 bp := `
9560 apex {
9561 name: "myapex",
9562 key: "myapex.key",
9563 bootclasspath_fragments: ["mybootclasspathfragment"],
9564 updatable: true,
9565 min_sdk_version: "29",
9566 }
9567 apex_key {
9568 name: "myapex.key",
9569 }
9570 bootclasspath_fragment {
9571 name: "mybootclasspathfragment",
9572 contents: ["myjavalib"],
9573 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009574 hidden_api: {
9575 split_packages: ["*"],
9576 },
Spandan Das66773252022-01-15 00:23:18 +00009577 }
9578 java_library {
9579 name: "myjavalib",
9580 srcs: ["MyClass.java"],
9581 apex_available: [ "myapex" ],
9582 sdk_version: "current",
9583 min_sdk_version: "29",
9584 compile_dex: true,
9585 }
9586 `
9587 fs := android.MockFS{
9588 "lint-baseline.xml": nil,
9589 }
9590
9591 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9592 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9593 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9594 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9595 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9596 }
9597}
9598
Spandan Das42e89502022-05-06 22:12:55 +00009599// updatable apexes should propagate updatable=true to its apps
9600func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9601 bp := `
9602 apex {
9603 name: "myapex",
9604 key: "myapex.key",
9605 updatable: %v,
9606 apps: [
9607 "myapp",
9608 ],
9609 min_sdk_version: "30",
9610 }
9611 apex_key {
9612 name: "myapex.key",
9613 }
9614 android_app {
9615 name: "myapp",
9616 updatable: %v,
9617 apex_available: [
9618 "myapex",
9619 ],
9620 sdk_version: "current",
9621 min_sdk_version: "30",
9622 }
9623 `
9624 testCases := []struct {
9625 name string
9626 apex_is_updatable_bp bool
9627 app_is_updatable_bp bool
9628 app_is_updatable_expected bool
9629 }{
9630 {
9631 name: "Non-updatable apex respects updatable property of non-updatable app",
9632 apex_is_updatable_bp: false,
9633 app_is_updatable_bp: false,
9634 app_is_updatable_expected: false,
9635 },
9636 {
9637 name: "Non-updatable apex respects updatable property of updatable app",
9638 apex_is_updatable_bp: false,
9639 app_is_updatable_bp: true,
9640 app_is_updatable_expected: true,
9641 },
9642 {
9643 name: "Updatable apex respects updatable property of updatable app",
9644 apex_is_updatable_bp: true,
9645 app_is_updatable_bp: true,
9646 app_is_updatable_expected: true,
9647 },
9648 {
9649 name: "Updatable apex sets updatable=true on non-updatable app",
9650 apex_is_updatable_bp: true,
9651 app_is_updatable_bp: false,
9652 app_is_updatable_expected: true,
9653 },
9654 }
9655 for _, testCase := range testCases {
9656 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9657 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9658 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9659 }
9660}
9661
Kiyoung Kim487689e2022-07-26 09:48:22 +09009662func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9663 bp := `
9664 apex {
9665 name: "myapex",
9666 key: "myapex.key",
9667 native_shared_libs: ["libfoo"],
9668 min_sdk_version: "29",
9669 }
9670 apex_key {
9671 name: "myapex.key",
9672 }
9673 cc_library {
9674 name: "libfoo",
9675 shared_libs: ["libc"],
9676 apex_available: ["myapex"],
9677 min_sdk_version: "29",
9678 }
9679 cc_api_library {
9680 name: "libc",
9681 src: "libc.so",
9682 min_sdk_version: "29",
9683 recovery_available: true,
9684 }
9685 api_imports {
9686 name: "api_imports",
9687 shared_libs: [
9688 "libc",
9689 ],
9690 header_libs: [],
9691 }
9692 `
9693 result := testApex(t, bp)
9694
9695 hasDep := func(m android.Module, wantDep android.Module) bool {
9696 t.Helper()
9697 var found bool
9698 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9699 if dep == wantDep {
9700 found = true
9701 }
9702 })
9703 return found
9704 }
9705
9706 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9707 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9708
9709 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9710
9711 // libfoo core variant should be buildable in the same inner tree since
9712 // certain mcombo files might build system and apexes in the same inner tree
9713 // libfoo core variant should link against source libc
9714 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9715 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9716 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9717}
9718
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009719func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009720 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009721}