blob: 984ca41709fe7e2be7a26801bfd9aad685fcdd15 [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"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
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,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 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()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900789 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900790 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 if vendor {
792 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900799 `+prop+`
800 }
801
802 apex_key {
803 name: "myapex.key",
804 public_key: "testkey.avbpubkey",
805 private_key: "testkey.pem",
806 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900807 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900808
809 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900810 if vendor {
811 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
812 rule.RuleParams.Command,
813 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900814 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 android.AssertStringDoesContain(t, "should force-label as system_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 }
819 }
820}
821
Alex Light5098a612018-11-29 17:12:15 -0800822func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 payload_type: "zip",
828 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 cc_library {
839 name: "mylib",
840 srcs: ["mylib.cpp"],
841 shared_libs: ["mylib2"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
850 system_shared_libs: [],
851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000852 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800853 }
854 `)
855
Sundong Ahnabb64432019-10-22 13:58:29 +0900856 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800857 copyCmds := zipApexRule.Args["copy_commands"]
858
859 // Ensure that main rule creates an output
860 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
861
862 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800864
865 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that both direct and indirect deps are copied into apex
869 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
870 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871}
872
873func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800874 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875 apex {
876 name: "myapex",
877 key: "myapex.key",
878 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900879 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000880 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 }
882
883 apex_key {
884 name: "myapex.key",
885 public_key: "testkey.avbpubkey",
886 private_key: "testkey.pem",
887 }
888
889 cc_library {
890 name: "mylib",
891 srcs: ["mylib.cpp"],
892 shared_libs: ["mylib2", "mylib3"],
893 system_shared_libs: [],
894 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000895 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 }
897
898 cc_library {
899 name: "mylib2",
900 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900901 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902 system_shared_libs: [],
903 stl: "none",
904 stubs: {
905 versions: ["1", "2", "3"],
906 },
907 }
908
909 cc_library {
910 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900911 srcs: ["mylib.cpp"],
912 shared_libs: ["mylib4"],
913 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 stl: "none",
915 stubs: {
916 versions: ["10", "11", "12"],
917 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000918 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900920
921 cc_library {
922 name: "mylib4",
923 srcs: ["mylib.cpp"],
924 system_shared_libs: [],
925 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000926 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900927 }
Jiyong Park105dc322021-06-11 17:22:09 +0900928
929 rust_binary {
930 name: "foo.rust",
931 srcs: ["foo.rs"],
932 shared_libs: ["libfoo.shared_from_rust"],
933 prefer_rlib: true,
934 apex_available: ["myapex"],
935 }
936
937 cc_library_shared {
938 name: "libfoo.shared_from_rust",
939 srcs: ["mylib.cpp"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["10", "11", "12"],
944 },
945 }
946
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 `)
948
Sundong Ahnabb64432019-10-22 13:58:29 +0900949 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 copyCmds := apexRule.Args["copy_commands"]
951
952 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800953 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900954
955 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
Colin Crossaede88c2020-08-11 12:17:01 -0700961 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
963 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900964 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900966 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967
968 // 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 -0700969 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700971 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900972
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700973 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
974 // is replaced by sharing of "cFlags" in cc/builder.go.
975 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
976 // module variable representing "cflags". So it was not detected by ensureNotContains.
977 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
978 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
979 // including the original cflags's "-include mylib.h".
980 //
Jiyong Park64379952018-12-13 18:37:29 +0900981 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700982 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
983 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900984
Jiyong Park85cc35a2022-07-17 11:30:47 +0900985 // Ensure that genstub for platform-provided lib is invoked with --systemapi
986 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
987 // Ensure that genstub for apex-provided lib is invoked with --apex
988 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900989
Jooyung Hana57af4a2020-01-23 05:36:59 +0000990 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991 "lib64/mylib.so",
992 "lib64/mylib3.so",
993 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900994 "bin/foo.rust",
995 "lib64/libc++.so", // by the implicit dependency from foo.rust
996 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900997 })
Jiyong Park105dc322021-06-11 17:22:09 +0900998
999 // Ensure that stub dependency from a rust module is not included
1000 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1001 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001002 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001003 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1004 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001005
1006 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1007 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008}
1009
Jiyong Park1bc84122021-06-22 20:23:05 +09001010func TestApexCanUsePrivateApis(t *testing.T) {
1011 ctx := testApex(t, `
1012 apex {
1013 name: "myapex",
1014 key: "myapex.key",
1015 native_shared_libs: ["mylib"],
1016 binaries: ["foo.rust"],
1017 updatable: false,
1018 platform_apis: true,
1019 }
1020
1021 apex_key {
1022 name: "myapex.key",
1023 public_key: "testkey.avbpubkey",
1024 private_key: "testkey.pem",
1025 }
1026
1027 cc_library {
1028 name: "mylib",
1029 srcs: ["mylib.cpp"],
1030 shared_libs: ["mylib2"],
1031 system_shared_libs: [],
1032 stl: "none",
1033 apex_available: [ "myapex" ],
1034 }
1035
1036 cc_library {
1037 name: "mylib2",
1038 srcs: ["mylib.cpp"],
1039 cflags: ["-include mylib.h"],
1040 system_shared_libs: [],
1041 stl: "none",
1042 stubs: {
1043 versions: ["1", "2", "3"],
1044 },
1045 }
1046
1047 rust_binary {
1048 name: "foo.rust",
1049 srcs: ["foo.rs"],
1050 shared_libs: ["libfoo.shared_from_rust"],
1051 prefer_rlib: true,
1052 apex_available: ["myapex"],
1053 }
1054
1055 cc_library_shared {
1056 name: "libfoo.shared_from_rust",
1057 srcs: ["mylib.cpp"],
1058 system_shared_libs: [],
1059 stl: "none",
1060 stubs: {
1061 versions: ["10", "11", "12"],
1062 },
1063 }
1064 `)
1065
1066 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1067 copyCmds := apexRule.Args["copy_commands"]
1068
1069 // Ensure that indirect stubs dep is not included
1070 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1071 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1072
1073 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1074 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001075 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001076 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1077 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001078 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1080 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1081}
1082
Colin Cross7812fd32020-09-25 12:35:10 -07001083func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1084 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001085 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001086 apex {
1087 name: "myapex",
1088 key: "myapex.key",
1089 native_shared_libs: ["mylib", "mylib3"],
1090 min_sdk_version: "29",
1091 }
1092
1093 apex_key {
1094 name: "myapex.key",
1095 public_key: "testkey.avbpubkey",
1096 private_key: "testkey.pem",
1097 }
1098
1099 cc_library {
1100 name: "mylib",
1101 srcs: ["mylib.cpp"],
1102 shared_libs: ["mylib2", "mylib3"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108
1109 cc_library {
1110 name: "mylib2",
1111 srcs: ["mylib.cpp"],
1112 cflags: ["-include mylib.h"],
1113 system_shared_libs: [],
1114 stl: "none",
1115 stubs: {
1116 versions: ["28", "29", "30", "current"],
1117 },
1118 min_sdk_version: "28",
1119 }
1120
1121 cc_library {
1122 name: "mylib3",
1123 srcs: ["mylib.cpp"],
1124 shared_libs: ["mylib4"],
1125 system_shared_libs: [],
1126 stl: "none",
1127 stubs: {
1128 versions: ["28", "29", "30", "current"],
1129 },
1130 apex_available: [ "myapex" ],
1131 min_sdk_version: "28",
1132 }
1133
1134 cc_library {
1135 name: "mylib4",
1136 srcs: ["mylib.cpp"],
1137 system_shared_libs: [],
1138 stl: "none",
1139 apex_available: [ "myapex" ],
1140 min_sdk_version: "28",
1141 }
1142 `)
1143
1144 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1145 copyCmds := apexRule.Args["copy_commands"]
1146
1147 // Ensure that direct non-stubs dep is always included
1148 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1149
1150 // Ensure that indirect stubs dep is not included
1151 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1152
1153 // Ensure that direct stubs dep is included
1154 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1155
1156 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1157
Jiyong Park55549df2021-02-26 23:57:23 +09001158 // Ensure that mylib is linking with the latest version of stub for mylib2
1159 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001160 // ... and not linking to the non-stub (impl) variant of mylib2
1161 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1162
1163 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1164 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1165 // .. and not linking to the stubs variant of mylib3
1166 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1167
1168 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001169 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001170 ensureNotContains(t, mylib2Cflags, "-include ")
1171
Jiyong Park85cc35a2022-07-17 11:30:47 +09001172 // Ensure that genstub is invoked with --systemapi
1173 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001174
1175 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1176 "lib64/mylib.so",
1177 "lib64/mylib3.so",
1178 "lib64/mylib4.so",
1179 })
1180}
1181
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001182func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1183 t.Parallel()
1184 // myapex (Z)
1185 // mylib -----------------.
1186 // |
1187 // otherapex (29) |
1188 // libstub's versions: 29 Z current
1189 // |
1190 // <platform> |
1191 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001192 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193 apex {
1194 name: "myapex",
1195 key: "myapex.key",
1196 native_shared_libs: ["mylib"],
1197 min_sdk_version: "Z", // non-final
1198 }
1199
1200 cc_library {
1201 name: "mylib",
1202 srcs: ["mylib.cpp"],
1203 shared_libs: ["libstub"],
1204 apex_available: ["myapex"],
1205 min_sdk_version: "Z",
1206 }
1207
1208 apex_key {
1209 name: "myapex.key",
1210 public_key: "testkey.avbpubkey",
1211 private_key: "testkey.pem",
1212 }
1213
1214 apex {
1215 name: "otherapex",
1216 key: "myapex.key",
1217 native_shared_libs: ["libstub"],
1218 min_sdk_version: "29",
1219 }
1220
1221 cc_library {
1222 name: "libstub",
1223 srcs: ["mylib.cpp"],
1224 stubs: {
1225 versions: ["29", "Z", "current"],
1226 },
1227 apex_available: ["otherapex"],
1228 min_sdk_version: "29",
1229 }
1230
1231 // platform module depending on libstub from otherapex should use the latest stub("current")
1232 cc_library {
1233 name: "libplatform",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libstub"],
1236 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001237 `,
1238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1239 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1240 variables.Platform_sdk_final = proptools.BoolPtr(false)
1241 variables.Platform_version_active_codenames = []string{"Z"}
1242 }),
1243 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001244
Jiyong Park55549df2021-02-26 23:57:23 +09001245 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001247 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250
1251 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1252 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1253 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1254 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1255 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1256}
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001259 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001261 name: "myapex2",
1262 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001264 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 }
1266
1267 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001268 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001269 public_key: "testkey.avbpubkey",
1270 private_key: "testkey.pem",
1271 }
1272
1273 cc_library {
1274 name: "mylib",
1275 srcs: ["mylib.cpp"],
1276 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001277 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 system_shared_libs: [],
1279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001280 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 }
1282
1283 cc_library {
1284 name: "libfoo",
1285 srcs: ["mylib.cpp"],
1286 shared_libs: ["libbar"],
1287 system_shared_libs: [],
1288 stl: "none",
1289 stubs: {
1290 versions: ["10", "20", "30"],
1291 },
1292 }
1293
1294 cc_library {
1295 name: "libbar",
1296 srcs: ["mylib.cpp"],
1297 system_shared_libs: [],
1298 stl: "none",
1299 }
1300
Jiyong Park678c8812020-02-07 17:25:49 +09001301 cc_library_static {
1302 name: "libbaz",
1303 srcs: ["mylib.cpp"],
1304 system_shared_libs: [],
1305 stl: "none",
1306 apex_available: [ "myapex2" ],
1307 }
1308
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309 `)
1310
Jiyong Park83dc74b2020-01-14 18:38:44 +09001311 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 copyCmds := apexRule.Args["copy_commands"]
1313
1314 // Ensure that direct non-stubs dep is always included
1315 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1316
1317 // Ensure that indirect stubs dep is not included
1318 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1319
1320 // Ensure that dependency of stubs is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1322
Colin Crossaede88c2020-08-11 12:17:01 -07001323 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001324
1325 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001326 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
1332 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1333 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001334
Artur Satayeva8bd1132020-04-27 18:07:06 +01001335 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001336 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001340}
1341
Jooyung Hand3639552019-08-09 12:57:43 +09001342func TestApexWithRuntimeLibsDependency(t *testing.T) {
1343 /*
1344 myapex
1345 |
1346 v (runtime_libs)
1347 mylib ------+------> libfoo [provides stub]
1348 |
1349 `------> libbar
1350 */
Colin Cross1c460562021-02-16 17:55:47 -08001351 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001352 apex {
1353 name: "myapex",
1354 key: "myapex.key",
1355 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001356 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001357 }
1358
1359 apex_key {
1360 name: "myapex.key",
1361 public_key: "testkey.avbpubkey",
1362 private_key: "testkey.pem",
1363 }
1364
1365 cc_library {
1366 name: "mylib",
1367 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001368 static_libs: ["libstatic"],
1369 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
Liz Kammer5f108fa2023-05-11 14:33:17 -04001394 cc_library {
1395 name: "libstatic",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 runtime_libs: ["libstatic_to_runtime"],
1401 }
1402
1403 cc_library {
1404 name: "libshared",
1405 srcs: ["mylib.cpp"],
1406 system_shared_libs: [],
1407 stl: "none",
1408 apex_available: [ "myapex" ],
1409 runtime_libs: ["libshared_to_runtime"],
1410 }
1411
1412 cc_library {
1413 name: "libstatic_to_runtime",
1414 srcs: ["mylib.cpp"],
1415 system_shared_libs: [],
1416 stl: "none",
1417 apex_available: [ "myapex" ],
1418 }
1419
1420 cc_library {
1421 name: "libshared_to_runtime",
1422 srcs: ["mylib.cpp"],
1423 system_shared_libs: [],
1424 stl: "none",
1425 apex_available: [ "myapex" ],
1426 }
Jooyung Hand3639552019-08-09 12:57:43 +09001427 `)
1428
Sundong Ahnabb64432019-10-22 13:58:29 +09001429 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001430 copyCmds := apexRule.Args["copy_commands"]
1431
1432 // Ensure that direct non-stubs dep is always included
1433 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1434
1435 // Ensure that indirect stubs dep is not included
1436 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1437
1438 // Ensure that runtime_libs dep in included
1439 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001440 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1441 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1442
1443 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001444
Sundong Ahnabb64432019-10-22 13:58:29 +09001445 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001446 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1447 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001448}
1449
Paul Duffina02cae32021-03-09 01:44:06 +00001450var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1451 cc.PrepareForTestWithCcBuildComponents,
1452 PrepareForTestWithApexBuildComponents,
1453 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 apex {
1455 name: "com.android.runtime",
1456 key: "com.android.runtime.key",
1457 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001458 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459 }
1460
1461 apex_key {
1462 name: "com.android.runtime.key",
1463 public_key: "testkey.avbpubkey",
1464 private_key: "testkey.pem",
1465 }
Paul Duffina02cae32021-03-09 01:44:06 +00001466 `),
1467 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1468)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
Paul Duffina02cae32021-03-09 01:44:06 +00001470func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472 cc_library {
1473 name: "libc",
1474 no_libcrt: true,
1475 nocrt: true,
1476 stl: "none",
1477 system_shared_libs: [],
1478 stubs: { versions: ["1"] },
1479 apex_available: ["com.android.runtime"],
1480
1481 sanitize: {
1482 hwaddress: true,
1483 }
1484 }
1485
1486 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001487 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 no_libcrt: true,
1489 nocrt: true,
1490 stl: "none",
1491 system_shared_libs: [],
1492 srcs: [""],
1493 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001494 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495
1496 sanitize: {
1497 never: true,
1498 },
Spandan Das4de7b492023-05-05 21:13:01 +00001499 apex_available: [
1500 "//apex_available:anyapex",
1501 "//apex_available:platform",
1502 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001503 } `)
1504 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001505
1506 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1507 "lib64/bionic/libc.so",
1508 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1509 })
1510
Colin Cross4c4c1be2022-02-10 11:41:18 -08001511 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512
1513 installed := hwasan.Description("install libclang_rt.hwasan")
1514 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1515
1516 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1517 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1518 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1519}
1520
1521func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001522 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001523 prepareForTestOfRuntimeApexWithHwasan,
1524 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1525 variables.SanitizeDevice = []string{"hwaddress"}
1526 }),
1527 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001528 cc_library {
1529 name: "libc",
1530 no_libcrt: true,
1531 nocrt: true,
1532 stl: "none",
1533 system_shared_libs: [],
1534 stubs: { versions: ["1"] },
1535 apex_available: ["com.android.runtime"],
1536 }
1537
1538 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001539 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540 no_libcrt: true,
1541 nocrt: true,
1542 stl: "none",
1543 system_shared_libs: [],
1544 srcs: [""],
1545 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001546 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547
1548 sanitize: {
1549 never: true,
1550 },
Spandan Das4de7b492023-05-05 21:13:01 +00001551 apex_available: [
1552 "//apex_available:anyapex",
1553 "//apex_available:platform",
1554 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `)
1557 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558
1559 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1560 "lib64/bionic/libc.so",
1561 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1562 })
1563
Colin Cross4c4c1be2022-02-10 11:41:18 -08001564 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001565
1566 installed := hwasan.Description("install libclang_rt.hwasan")
1567 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1568
1569 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1570 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1571 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1572}
1573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1575 testcases := []struct {
1576 name string
1577 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001578 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 shouldLink string
1580 shouldNotLink []string
1581 }{
1582 {
Jiyong Park55549df2021-02-26 23:57:23 +09001583 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001584 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001585 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001586 shouldLink: "current",
1587 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 },
1589 {
Jiyong Park55549df2021-02-26 23:57:23 +09001590 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001591 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001592 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001593 shouldLink: "current",
1594 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 },
1596 }
1597 for _, tc := range testcases {
1598 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001599 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001604 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001605 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001607
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 apex_key {
1609 name: "myapex.key",
1610 public_key: "testkey.avbpubkey",
1611 private_key: "testkey.pem",
1612 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001613
Jooyung Han61b66e92020-03-21 14:21:46 +00001614 cc_library {
1615 name: "mylib",
1616 srcs: ["mylib.cpp"],
1617 vendor_available: true,
1618 shared_libs: ["libbar"],
1619 system_shared_libs: [],
1620 stl: "none",
1621 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001622 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001623 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001624
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 cc_library {
1626 name: "libbar",
1627 srcs: ["mylib.cpp"],
1628 system_shared_libs: [],
1629 stl: "none",
1630 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001631 llndk: {
1632 symbol_file: "libbar.map.txt",
1633 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001634 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001635 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001636 withUnbundledBuild,
1637 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001638
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 // Ensure that LLNDK dep is not included
1640 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1641 "lib64/mylib.so",
1642 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001643
Jooyung Han61b66e92020-03-21 14:21:46 +00001644 // Ensure that LLNDK dep is required
1645 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1646 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1647 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001648
Steven Moreland2c4000c2021-04-27 02:08:49 +00001649 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1650 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001651 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001653 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001654
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001656 ver := tc.shouldLink
1657 if tc.shouldLink == "current" {
1658 ver = strconv.Itoa(android.FutureApiLevelInt)
1659 }
1660 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001661 })
1662 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001663}
1664
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001666 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 apex {
1668 name: "myapex",
1669 key: "myapex.key",
1670 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001671 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 }
1673
1674 apex_key {
1675 name: "myapex.key",
1676 public_key: "testkey.avbpubkey",
1677 private_key: "testkey.pem",
1678 }
1679
1680 cc_library {
1681 name: "mylib",
1682 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001683 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684 shared_libs: ["libdl#27"],
1685 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001686 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 }
1688
1689 cc_library_shared {
1690 name: "mylib_shared",
1691 srcs: ["mylib.cpp"],
1692 shared_libs: ["libdl#27"],
1693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001694 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 }
1696
1697 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001698 name: "libBootstrap",
1699 srcs: ["mylib.cpp"],
1700 stl: "none",
1701 bootstrap: true,
1702 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001703 `)
1704
Sundong Ahnabb64432019-10-22 13:58:29 +09001705 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 copyCmds := apexRule.Args["copy_commands"]
1707
1708 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001709 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001710 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1711 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001712
1713 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001714 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
Colin Crossaede88c2020-08-11 12:17:01 -07001716 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1717 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1718 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001719
1720 // For dependency to libc
1721 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001722 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001724 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001725 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001726 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1727 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728
1729 // For dependency to libm
1730 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001731 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001732 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001733 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001734 // ... and is not compiling with the stub
1735 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1736 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1737
1738 // For dependency to libdl
1739 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001740 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001742 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1743 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001746 // ... Cflags from stub is correctly exported to mylib
1747 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1748 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001749
1750 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001751 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1752 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1753 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1754 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001755}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001756
Jooyung Han749dc692020-04-15 11:03:39 +09001757func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001758 // there are three links between liba --> libz.
1759 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001760 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001761 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001762 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001763 apex {
1764 name: "myapex",
1765 key: "myapex.key",
1766 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001767 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001768 }
1769
1770 apex {
1771 name: "otherapex",
1772 key: "myapex.key",
1773 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001774 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001775 }
1776
1777 apex_key {
1778 name: "myapex.key",
1779 public_key: "testkey.avbpubkey",
1780 private_key: "testkey.pem",
1781 }
1782
1783 cc_library {
1784 name: "libx",
1785 shared_libs: ["liba"],
1786 system_shared_libs: [],
1787 stl: "none",
1788 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001789 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001790 }
1791
1792 cc_library {
1793 name: "liby",
1794 shared_libs: ["liba"],
1795 system_shared_libs: [],
1796 stl: "none",
1797 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001798 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001799 }
1800
1801 cc_library {
1802 name: "liba",
1803 shared_libs: ["libz"],
1804 system_shared_libs: [],
1805 stl: "none",
1806 apex_available: [
1807 "//apex_available:anyapex",
1808 "//apex_available:platform",
1809 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001810 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001811 }
1812
1813 cc_library {
1814 name: "libz",
1815 system_shared_libs: [],
1816 stl: "none",
1817 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001818 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001819 },
1820 }
Jooyung Han749dc692020-04-15 11:03:39 +09001821 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001822
1823 expectLink := func(from, from_variant, to, to_variant string) {
1824 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1825 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1826 }
1827 expectNoLink := func(from, from_variant, to, to_variant string) {
1828 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1829 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1830 }
1831 // platform liba is linked to non-stub version
1832 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001833 // liba in myapex is linked to current
1834 expectLink("liba", "shared_apex29", "libz", "shared_current")
1835 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001836 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001837 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001838 // liba in otherapex is linked to current
1839 expectLink("liba", "shared_apex30", "libz", "shared_current")
1840 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001841 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1842 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001843}
1844
Jooyung Hanaed150d2020-04-02 01:41:41 +09001845func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
1851 min_sdk_version: "R",
1852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001866 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["29", "R"],
1875 },
1876 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001877 `,
1878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1879 variables.Platform_version_active_codenames = []string{"R"}
1880 }),
1881 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001882
1883 expectLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
1887 expectNoLink := func(from, from_variant, to, to_variant string) {
1888 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1889 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1890 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001891 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1892 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001893 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1894 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001895}
1896
Jooyung Han4c4da062021-06-23 10:23:16 +09001897func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1898 testApex(t, `
1899 apex {
1900 name: "myapex",
1901 key: "myapex.key",
1902 java_libs: ["libx"],
1903 min_sdk_version: "S",
1904 }
1905
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911
1912 java_library {
1913 name: "libx",
1914 srcs: ["a.java"],
1915 apex_available: [ "myapex" ],
1916 sdk_version: "current",
1917 min_sdk_version: "S", // should be okay
1918 }
1919 `,
1920 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1921 variables.Platform_version_active_codenames = []string{"S"}
1922 variables.Platform_sdk_codename = proptools.StringPtr("S")
1923 }),
1924 )
1925}
1926
Jooyung Han749dc692020-04-15 11:03:39 +09001927func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001928 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001929 apex {
1930 name: "myapex",
1931 key: "myapex.key",
1932 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001933 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "libx",
1944 shared_libs: ["libz"],
1945 system_shared_libs: [],
1946 stl: "none",
1947 apex_available: [ "myapex" ],
1948 }
1949
1950 cc_library {
1951 name: "libz",
1952 system_shared_libs: [],
1953 stl: "none",
1954 stubs: {
1955 versions: ["1", "2"],
1956 },
1957 }
1958 `)
1959
1960 expectLink := func(from, from_variant, to, to_variant string) {
1961 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1962 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1963 }
1964 expectNoLink := func(from, from_variant, to, to_variant string) {
1965 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1966 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1967 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001968 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001969 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001970 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001971 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001972}
1973
Jooyung Handfc864c2023-03-20 18:19:07 +09001974func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001975 ctx := testApex(t, `
1976 apex {
1977 name: "myapex",
1978 key: "myapex.key",
1979 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001980 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001981 vendor: true,
1982 min_sdk_version: "29",
1983 }
1984
1985 apex_key {
1986 name: "myapex.key",
1987 public_key: "testkey.avbpubkey",
1988 private_key: "testkey.pem",
1989 }
1990
1991 cc_library {
1992 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001993 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001994 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001995 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 shared_libs: ["libbar"],
1997 }
1998
1999 cc_library {
2000 name: "libbar",
2001 stubs: { versions: ["29", "30"] },
2002 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002003 }
2004 `)
2005
2006 vendorVariant := "android_vendor.29_arm64_armv8-a"
2007
Jooyung Handfc864c2023-03-20 18:19:07 +09002008 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2009
2010 // Ensure that mylib links with "current" LLNDK
2011 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2012 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2013
2014 // Ensure that mylib is targeting 29
2015 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2016 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2017
2018 // Ensure that the correct variant of crtbegin_so is used.
2019 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2020 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002021
2022 // Ensure that the crtbegin_so used by the APEX is targeting 29
2023 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2024 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2025}
2026
Jooyung Han4495f842023-04-25 16:39:59 +09002027func TestTrackAllowedDeps(t *testing.T) {
2028 ctx := testApex(t, `
2029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 updatable: true,
2033 native_shared_libs: [
2034 "mylib",
2035 "yourlib",
2036 ],
2037 min_sdk_version: "29",
2038 }
2039
2040 apex {
2041 name: "myapex2",
2042 key: "myapex.key",
2043 updatable: false,
2044 native_shared_libs: ["yourlib"],
2045 }
2046
2047 apex_key {
2048 name: "myapex.key",
2049 public_key: "testkey.avbpubkey",
2050 private_key: "testkey.pem",
2051 }
2052
2053 cc_library {
2054 name: "mylib",
2055 srcs: ["mylib.cpp"],
2056 shared_libs: ["libbar"],
2057 min_sdk_version: "29",
2058 apex_available: ["myapex"],
2059 }
2060
2061 cc_library {
2062 name: "libbar",
2063 stubs: { versions: ["29", "30"] },
2064 }
2065
2066 cc_library {
2067 name: "yourlib",
2068 srcs: ["mylib.cpp"],
2069 min_sdk_version: "29",
2070 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2071 }
2072 `, withFiles(android.MockFS{
2073 "packages/modules/common/build/allowed_deps.txt": nil,
2074 }))
2075
2076 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2077 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2078 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2079 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2080 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2081 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2082
2083 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2084 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2085 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2086 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2087 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2088 flatlist, "mylib:(minSdkVersion:29)")
2089 android.AssertStringListContains(t, "track platform-available lib",
2090 flatlist, "yourlib(minSdkVersion:29)")
2091}
2092
2093func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2094 ctx := testApex(t, `
2095 apex {
2096 name: "myapex",
2097 key: "myapex.key",
2098 updatable: true,
2099 min_sdk_version: "29",
2100 }
2101
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }
2107 `)
2108 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2109 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2110 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2111 }
2112}
2113
Jooyung Han03b51852020-02-26 22:45:42 +09002114func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002115 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002116 apex {
2117 name: "myapex",
2118 key: "myapex.key",
2119 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002120 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002121 }
2122
2123 apex_key {
2124 name: "myapex.key",
2125 public_key: "testkey.avbpubkey",
2126 private_key: "testkey.pem",
2127 }
2128
2129 cc_library {
2130 name: "libx",
2131 system_shared_libs: [],
2132 stl: "none",
2133 apex_available: [ "myapex" ],
2134 stubs: {
2135 versions: ["1", "2"],
2136 },
2137 }
2138
2139 cc_library {
2140 name: "libz",
2141 shared_libs: ["libx"],
2142 system_shared_libs: [],
2143 stl: "none",
2144 }
2145 `)
2146
2147 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002148 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002149 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2150 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2151 }
2152 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002153 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002154 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2155 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2156 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002157 expectLink("libz", "shared", "libx", "shared_current")
2158 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002159 expectNoLink("libz", "shared", "libz", "shared_1")
2160 expectNoLink("libz", "shared", "libz", "shared")
2161}
2162
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002163var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2164 func(variables android.FixtureProductVariables) {
2165 variables.SanitizeDevice = []string{"hwaddress"}
2166 },
2167)
2168
Jooyung Han75568392020-03-20 04:29:24 +09002169func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002170 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 native_shared_libs: ["libx"],
2175 min_sdk_version: "29",
2176 }
2177
2178 apex_key {
2179 name: "myapex.key",
2180 public_key: "testkey.avbpubkey",
2181 private_key: "testkey.pem",
2182 }
2183
2184 cc_library {
2185 name: "libx",
2186 shared_libs: ["libbar"],
2187 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002188 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002189 }
2190
2191 cc_library {
2192 name: "libbar",
2193 stubs: {
2194 versions: ["29", "30"],
2195 },
2196 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002197 `,
2198 prepareForTestWithSantitizeHwaddress,
2199 )
Jooyung Han03b51852020-02-26 22:45:42 +09002200 expectLink := func(from, from_variant, to, to_variant string) {
2201 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2202 libFlags := ld.Args["libFlags"]
2203 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2204 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002205 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002206}
2207
Jooyung Han75568392020-03-20 04:29:24 +09002208func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002209 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002210 apex {
2211 name: "myapex",
2212 key: "myapex.key",
2213 native_shared_libs: ["libx"],
2214 min_sdk_version: "29",
2215 }
2216
2217 apex_key {
2218 name: "myapex.key",
2219 public_key: "testkey.avbpubkey",
2220 private_key: "testkey.pem",
2221 }
2222
2223 cc_library {
2224 name: "libx",
2225 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002226 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002227 }
Jooyung Han75568392020-03-20 04:29:24 +09002228 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002229
2230 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002231 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002232 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002233 // note that platform variant is not.
2234 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236}
2237
Jooyung Han749dc692020-04-15 11:03:39 +09002238func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2239 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002243 native_shared_libs: ["mylib"],
2244 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
Jooyung Han749dc692020-04-15 11:03:39 +09002252
2253 cc_library {
2254 name: "mylib",
2255 srcs: ["mylib.cpp"],
2256 system_shared_libs: [],
2257 stl: "none",
2258 apex_available: [
2259 "myapex",
2260 ],
2261 min_sdk_version: "30",
2262 }
2263 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002264
2265 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["libfoo.ffi"],
2270 min_sdk_version: "29",
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 rust_ffi_shared {
2280 name: "libfoo.ffi",
2281 srcs: ["foo.rs"],
2282 crate_name: "foo",
2283 apex_available: [
2284 "myapex",
2285 ],
2286 min_sdk_version: "30",
2287 }
2288 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002289
2290 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 java_libs: ["libfoo"],
2295 min_sdk_version: "29",
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 java_import {
2305 name: "libfoo",
2306 jars: ["libfoo.jar"],
2307 apex_available: [
2308 "myapex",
2309 ],
2310 min_sdk_version: "30",
2311 }
2312 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002313
2314 // Skip check for modules compiling against core API surface
2315 testApex(t, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 java_libs: ["libfoo"],
2320 min_sdk_version: "29",
2321 }
2322
2323 apex_key {
2324 name: "myapex.key",
2325 public_key: "testkey.avbpubkey",
2326 private_key: "testkey.pem",
2327 }
2328
2329 java_library {
2330 name: "libfoo",
2331 srcs: ["Foo.java"],
2332 apex_available: [
2333 "myapex",
2334 ],
2335 // Compile against core API surface
2336 sdk_version: "core_current",
2337 min_sdk_version: "30",
2338 }
2339 `)
2340
Jooyung Han749dc692020-04-15 11:03:39 +09002341}
2342
2343func TestApexMinSdkVersion_Okay(t *testing.T) {
2344 testApex(t, `
2345 apex {
2346 name: "myapex",
2347 key: "myapex.key",
2348 native_shared_libs: ["libfoo"],
2349 java_libs: ["libbar"],
2350 min_sdk_version: "29",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "libfoo",
2361 srcs: ["mylib.cpp"],
2362 shared_libs: ["libfoo_dep"],
2363 apex_available: ["myapex"],
2364 min_sdk_version: "29",
2365 }
2366
2367 cc_library {
2368 name: "libfoo_dep",
2369 srcs: ["mylib.cpp"],
2370 apex_available: ["myapex"],
2371 min_sdk_version: "29",
2372 }
2373
2374 java_library {
2375 name: "libbar",
2376 sdk_version: "current",
2377 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002378 static_libs: [
2379 "libbar_dep",
2380 "libbar_import_dep",
2381 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002382 apex_available: ["myapex"],
2383 min_sdk_version: "29",
2384 }
2385
2386 java_library {
2387 name: "libbar_dep",
2388 sdk_version: "current",
2389 srcs: ["a.java"],
2390 apex_available: ["myapex"],
2391 min_sdk_version: "29",
2392 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002393
2394 java_import {
2395 name: "libbar_import_dep",
2396 jars: ["libbar.jar"],
2397 apex_available: ["myapex"],
2398 min_sdk_version: "29",
2399 }
Jooyung Han03b51852020-02-26 22:45:42 +09002400 `)
2401}
2402
Colin Cross8ca61c12022-10-06 21:00:14 -07002403func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2404 // Tests that an apex dependency with min_sdk_version higher than the
2405 // min_sdk_version of the apex is allowed as long as the dependency's
2406 // min_sdk_version is less than or equal to the api level that the
2407 // architecture was introduced in. In this case, arm64 didn't exist
2408 // until api level 21, so the arm64 code will never need to run on
2409 // an api level 20 device, even if other architectures of the apex
2410 // will.
2411 testApex(t, `
2412 apex {
2413 name: "myapex",
2414 key: "myapex.key",
2415 native_shared_libs: ["libfoo"],
2416 min_sdk_version: "20",
2417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
2425 cc_library {
2426 name: "libfoo",
2427 srcs: ["mylib.cpp"],
2428 apex_available: ["myapex"],
2429 min_sdk_version: "21",
2430 stl: "none",
2431 }
2432 `)
2433}
2434
Artur Satayev8cf899a2020-04-15 17:29:42 +01002435func TestJavaStableSdkVersion(t *testing.T) {
2436 testCases := []struct {
2437 name string
2438 expectedError string
2439 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002440 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }{
2442 {
2443 name: "Non-updatable apex with non-stable dep",
2444 bp: `
2445 apex {
2446 name: "myapex",
2447 java_libs: ["myjar"],
2448 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002449 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002450 }
2451 apex_key {
2452 name: "myapex.key",
2453 public_key: "testkey.avbpubkey",
2454 private_key: "testkey.pem",
2455 }
2456 java_library {
2457 name: "myjar",
2458 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002459 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002460 apex_available: ["myapex"],
2461 }
2462 `,
2463 },
2464 {
2465 name: "Updatable apex with stable dep",
2466 bp: `
2467 apex {
2468 name: "myapex",
2469 java_libs: ["myjar"],
2470 key: "myapex.key",
2471 updatable: true,
2472 min_sdk_version: "29",
2473 }
2474 apex_key {
2475 name: "myapex.key",
2476 public_key: "testkey.avbpubkey",
2477 private_key: "testkey.pem",
2478 }
2479 java_library {
2480 name: "myjar",
2481 srcs: ["foo/bar/MyClass.java"],
2482 sdk_version: "current",
2483 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002485 }
2486 `,
2487 },
2488 {
2489 name: "Updatable apex with non-stable dep",
2490 expectedError: "cannot depend on \"myjar\"",
2491 bp: `
2492 apex {
2493 name: "myapex",
2494 java_libs: ["myjar"],
2495 key: "myapex.key",
2496 updatable: true,
2497 }
2498 apex_key {
2499 name: "myapex.key",
2500 public_key: "testkey.avbpubkey",
2501 private_key: "testkey.pem",
2502 }
2503 java_library {
2504 name: "myjar",
2505 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002506 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002507 apex_available: ["myapex"],
2508 }
2509 `,
2510 },
2511 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002512 name: "Updatable apex with non-stable legacy core platform dep",
2513 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2514 bp: `
2515 apex {
2516 name: "myapex",
2517 java_libs: ["myjar-uses-legacy"],
2518 key: "myapex.key",
2519 updatable: true,
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 java_library {
2527 name: "myjar-uses-legacy",
2528 srcs: ["foo/bar/MyClass.java"],
2529 sdk_version: "core_platform",
2530 apex_available: ["myapex"],
2531 }
2532 `,
2533 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2534 },
2535 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002536 name: "Updatable apex with non-stable transitive dep",
2537 // This is not actually detecting that the transitive dependency is unstable, rather it is
2538 // detecting that the transitive dependency is building against a wider API surface than the
2539 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002540 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002541 bp: `
2542 apex {
2543 name: "myapex",
2544 java_libs: ["myjar"],
2545 key: "myapex.key",
2546 updatable: true,
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 java_library {
2554 name: "myjar",
2555 srcs: ["foo/bar/MyClass.java"],
2556 sdk_version: "current",
2557 apex_available: ["myapex"],
2558 static_libs: ["transitive-jar"],
2559 }
2560 java_library {
2561 name: "transitive-jar",
2562 srcs: ["foo/bar/MyClass.java"],
2563 sdk_version: "core_platform",
2564 apex_available: ["myapex"],
2565 }
2566 `,
2567 },
2568 }
2569
2570 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002571 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2572 continue
2573 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002574 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002575 errorHandler := android.FixtureExpectsNoErrors
2576 if test.expectedError != "" {
2577 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002578 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002579 android.GroupFixturePreparers(
2580 java.PrepareForTestWithJavaDefaultModules,
2581 PrepareForTestWithApexBuildComponents,
2582 prepareForTestWithMyapex,
2583 android.OptionalFixturePreparer(test.preparer),
2584 ).
2585 ExtendWithErrorHandler(errorHandler).
2586 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002587 })
2588 }
2589}
2590
Jooyung Han749dc692020-04-15 11:03:39 +09002591func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2592 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2593 apex {
2594 name: "myapex",
2595 key: "myapex.key",
2596 native_shared_libs: ["mylib"],
2597 min_sdk_version: "29",
2598 }
2599
2600 apex_key {
2601 name: "myapex.key",
2602 public_key: "testkey.avbpubkey",
2603 private_key: "testkey.pem",
2604 }
2605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 shared_libs: ["mylib2"],
2610 system_shared_libs: [],
2611 stl: "none",
2612 apex_available: [
2613 "myapex",
2614 ],
2615 min_sdk_version: "29",
2616 }
2617
2618 // indirect part of the apex
2619 cc_library {
2620 name: "mylib2",
2621 srcs: ["mylib.cpp"],
2622 system_shared_libs: [],
2623 stl: "none",
2624 apex_available: [
2625 "myapex",
2626 ],
2627 min_sdk_version: "30",
2628 }
2629 `)
2630}
2631
2632func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2633 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2634 apex {
2635 name: "myapex",
2636 key: "myapex.key",
2637 apps: ["AppFoo"],
2638 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002639 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002640 }
2641
2642 apex_key {
2643 name: "myapex.key",
2644 public_key: "testkey.avbpubkey",
2645 private_key: "testkey.pem",
2646 }
2647
2648 android_app {
2649 name: "AppFoo",
2650 srcs: ["foo/bar/MyClass.java"],
2651 sdk_version: "current",
2652 min_sdk_version: "29",
2653 system_modules: "none",
2654 stl: "none",
2655 static_libs: ["bar"],
2656 apex_available: [ "myapex" ],
2657 }
2658
2659 java_library {
2660 name: "bar",
2661 sdk_version: "current",
2662 srcs: ["a.java"],
2663 apex_available: [ "myapex" ],
2664 }
2665 `)
2666}
2667
2668func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002669 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002670 apex {
2671 name: "myapex",
2672 key: "myapex.key",
2673 native_shared_libs: ["mylib"],
2674 min_sdk_version: "29",
2675 }
2676
2677 apex_key {
2678 name: "myapex.key",
2679 public_key: "testkey.avbpubkey",
2680 private_key: "testkey.pem",
2681 }
2682
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002683 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002684 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2685 cc_library {
2686 name: "mylib",
2687 srcs: ["mylib.cpp"],
2688 shared_libs: ["mylib2"],
2689 system_shared_libs: [],
2690 stl: "none",
2691 apex_available: ["myapex", "otherapex"],
2692 min_sdk_version: "29",
2693 }
2694
2695 cc_library {
2696 name: "mylib2",
2697 srcs: ["mylib.cpp"],
2698 system_shared_libs: [],
2699 stl: "none",
2700 apex_available: ["otherapex"],
2701 stubs: { versions: ["29", "30"] },
2702 min_sdk_version: "30",
2703 }
2704
2705 apex {
2706 name: "otherapex",
2707 key: "myapex.key",
2708 native_shared_libs: ["mylib", "mylib2"],
2709 min_sdk_version: "30",
2710 }
2711 `)
2712 expectLink := func(from, from_variant, to, to_variant string) {
2713 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2714 libFlags := ld.Args["libFlags"]
2715 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2716 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002717 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002718 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002719}
2720
Jooyung Haned124c32021-01-26 11:43:46 +09002721func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002722 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2723 func(variables android.FixtureProductVariables) {
2724 variables.Platform_sdk_codename = proptools.StringPtr("S")
2725 variables.Platform_version_active_codenames = []string{"S"}
2726 },
2727 )
Jooyung Haned124c32021-01-26 11:43:46 +09002728 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 native_shared_libs: ["libfoo"],
2733 min_sdk_version: "S",
2734 }
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740 cc_library {
2741 name: "libfoo",
2742 shared_libs: ["libbar"],
2743 apex_available: ["myapex"],
2744 min_sdk_version: "29",
2745 }
2746 cc_library {
2747 name: "libbar",
2748 apex_available: ["myapex"],
2749 }
2750 `, withSAsActiveCodeNames)
2751}
2752
2753func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002754 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2755 variables.Platform_sdk_codename = proptools.StringPtr("S")
2756 variables.Platform_version_active_codenames = []string{"S", "T"}
2757 })
Colin Cross1c460562021-02-16 17:55:47 -08002758 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002759 apex {
2760 name: "myapex",
2761 key: "myapex.key",
2762 native_shared_libs: ["libfoo"],
2763 min_sdk_version: "S",
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 cc_library {
2771 name: "libfoo",
2772 shared_libs: ["libbar"],
2773 apex_available: ["myapex"],
2774 min_sdk_version: "S",
2775 }
2776 cc_library {
2777 name: "libbar",
2778 stubs: {
2779 symbol_file: "libbar.map.txt",
2780 versions: ["30", "S", "T"],
2781 },
2782 }
2783 `, withSAsActiveCodeNames)
2784
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002785 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002786 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2787 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002789}
2790
Jiyong Park7c2ee712018-12-07 00:42:25 +09002791func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002792 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793 apex {
2794 name: "myapex",
2795 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002796 native_shared_libs: ["mylib"],
2797 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002798 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002800 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 }
2802
2803 apex_key {
2804 name: "myapex.key",
2805 public_key: "testkey.avbpubkey",
2806 private_key: "testkey.pem",
2807 }
2808
2809 prebuilt_etc {
2810 name: "myetc",
2811 src: "myprebuilt",
2812 sub_dir: "foo/bar",
2813 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002814
2815 cc_library {
2816 name: "mylib",
2817 srcs: ["mylib.cpp"],
2818 relative_install_path: "foo/bar",
2819 system_shared_libs: [],
2820 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002821 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002822 }
2823
2824 cc_binary {
2825 name: "mybin",
2826 srcs: ["mylib.cpp"],
2827 relative_install_path: "foo/bar",
2828 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002829 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002830 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002831 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002832 `)
2833
Sundong Ahnabb64432019-10-22 13:58:29 +09002834 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002835 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002836
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002837 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002838 ensureContains(t, cmd, "/etc ")
2839 ensureContains(t, cmd, "/etc/foo ")
2840 ensureContains(t, cmd, "/etc/foo/bar ")
2841 ensureContains(t, cmd, "/lib64 ")
2842 ensureContains(t, cmd, "/lib64/foo ")
2843 ensureContains(t, cmd, "/lib64/foo/bar ")
2844 ensureContains(t, cmd, "/lib ")
2845 ensureContains(t, cmd, "/lib/foo ")
2846 ensureContains(t, cmd, "/lib/foo/bar ")
2847 ensureContains(t, cmd, "/bin ")
2848 ensureContains(t, cmd, "/bin/foo ")
2849 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002850}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002851
Jooyung Han35155c42020-02-06 17:33:20 +09002852func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002853 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002854 apex {
2855 name: "myapex",
2856 key: "myapex.key",
2857 multilib: {
2858 both: {
2859 native_shared_libs: ["mylib"],
2860 binaries: ["mybin"],
2861 },
2862 },
2863 compile_multilib: "both",
2864 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002865 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002866 }
2867
2868 apex_key {
2869 name: "myapex.key",
2870 public_key: "testkey.avbpubkey",
2871 private_key: "testkey.pem",
2872 }
2873
2874 cc_library {
2875 name: "mylib",
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
2878 stl: "none",
2879 apex_available: [ "myapex" ],
2880 native_bridge_supported: true,
2881 }
2882
2883 cc_binary {
2884 name: "mybin",
2885 relative_install_path: "foo/bar",
2886 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002887 stl: "none",
2888 apex_available: [ "myapex" ],
2889 native_bridge_supported: true,
2890 compile_multilib: "both", // default is "first" for binary
2891 multilib: {
2892 lib64: {
2893 suffix: "64",
2894 },
2895 },
2896 }
2897 `, withNativeBridgeEnabled)
2898 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2899 "bin/foo/bar/mybin",
2900 "bin/foo/bar/mybin64",
2901 "bin/arm/foo/bar/mybin",
2902 "bin/arm64/foo/bar/mybin64",
2903 "lib/foo/bar/mylib.so",
2904 "lib/arm/foo/bar/mylib.so",
2905 "lib64/foo/bar/mylib.so",
2906 "lib64/arm64/foo/bar/mylib.so",
2907 })
2908}
2909
Jooyung Han85d61762020-06-24 23:50:26 +09002910func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002911 result := android.GroupFixturePreparers(
2912 prepareForApexTest,
2913 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2914 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 binaries: ["mybin"],
2919 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002920 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002921 }
2922 apex_key {
2923 name: "myapex.key",
2924 public_key: "testkey.avbpubkey",
2925 private_key: "testkey.pem",
2926 }
2927 cc_binary {
2928 name: "mybin",
2929 vendor: true,
2930 shared_libs: ["libfoo"],
2931 }
2932 cc_library {
2933 name: "libfoo",
2934 proprietary: true,
2935 }
2936 `)
2937
Colin Crossc68db4b2021-11-11 18:59:15 -08002938 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002939 "bin/mybin",
2940 "lib64/libfoo.so",
2941 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2942 "lib64/libc++.so",
2943 })
2944
Colin Crossc68db4b2021-11-11 18:59:15 -08002945 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2946 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002947 name := apexBundle.BaseModuleName()
2948 prefix := "TARGET_"
2949 var builder strings.Builder
2950 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002951 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002952 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002953 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002954
Colin Crossc68db4b2021-11-11 18:59:15 -08002955 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002956 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2957 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002958}
2959
Jooyung Hanc5a96762022-02-04 11:54:50 +09002960func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2961 testApexError(t, `Trying to include a VNDK library`, `
2962 apex {
2963 name: "myapex",
2964 key: "myapex.key",
2965 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2966 vendor: true,
2967 use_vndk_as_stable: true,
2968 updatable: false,
2969 }
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }`)
2975}
2976
Jooyung Handf78e212020-07-22 15:54:47 +09002977func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002978 // myapex myapex2
2979 // | |
2980 // mybin ------. mybin2
2981 // \ \ / |
2982 // (stable) .---\--------` |
2983 // \ / \ |
2984 // \ / \ /
2985 // libvndk libvendor
2986 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002987 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002988 apex {
2989 name: "myapex",
2990 key: "myapex.key",
2991 binaries: ["mybin"],
2992 vendor: true,
2993 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002994 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002995 }
2996 apex_key {
2997 name: "myapex.key",
2998 public_key: "testkey.avbpubkey",
2999 private_key: "testkey.pem",
3000 }
3001 cc_binary {
3002 name: "mybin",
3003 vendor: true,
3004 shared_libs: ["libvndk", "libvendor"],
3005 }
3006 cc_library {
3007 name: "libvndk",
3008 vndk: {
3009 enabled: true,
3010 },
3011 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003012 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003013 }
3014 cc_library {
3015 name: "libvendor",
3016 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003017 stl: "none",
3018 }
3019 apex {
3020 name: "myapex2",
3021 key: "myapex.key",
3022 binaries: ["mybin2"],
3023 vendor: true,
3024 use_vndk_as_stable: false,
3025 updatable: false,
3026 }
3027 cc_binary {
3028 name: "mybin2",
3029 vendor: true,
3030 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003031 }
3032 `)
3033
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003034 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003035
Jooyung Han91f92032022-02-04 12:36:33 +09003036 for _, tc := range []struct {
3037 name string
3038 apexName string
3039 moduleName string
3040 moduleVariant string
3041 libs []string
3042 contents []string
3043 requireVndkNamespace bool
3044 }{
3045 {
3046 name: "use_vndk_as_stable",
3047 apexName: "myapex",
3048 moduleName: "mybin",
3049 moduleVariant: vendorVariant + "_apex10000",
3050 libs: []string{
3051 // should link with vendor variants of VNDK libs(libvndk/libc++)
3052 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3053 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3054 // unstable Vendor libs as APEX variant
3055 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3056 },
3057 contents: []string{
3058 "bin/mybin",
3059 "lib64/libvendor.so",
3060 // VNDK libs (libvndk/libc++) are not included
3061 },
3062 requireVndkNamespace: true,
3063 },
3064 {
3065 name: "!use_vndk_as_stable",
3066 apexName: "myapex2",
3067 moduleName: "mybin2",
3068 moduleVariant: vendorVariant + "_myapex2",
3069 libs: []string{
3070 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3071 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3072 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3073 // unstable vendor libs have "merged" APEX variants
3074 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3075 },
3076 contents: []string{
3077 "bin/mybin2",
3078 "lib64/libvendor.so",
3079 // VNDK libs are included as well
3080 "lib64/libvndk.so",
3081 "lib64/libc++.so",
3082 },
3083 requireVndkNamespace: false,
3084 },
3085 } {
3086 t.Run(tc.name, func(t *testing.T) {
3087 // Check linked libs
3088 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3089 libs := names(ldRule.Args["libFlags"])
3090 for _, lib := range tc.libs {
3091 ensureListContains(t, libs, lib)
3092 }
3093 // Check apex contents
3094 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003095
Jooyung Han91f92032022-02-04 12:36:33 +09003096 // Check "requireNativeLibs"
3097 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3098 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3099 if tc.requireVndkNamespace {
3100 ensureListContains(t, requireNativeLibs, ":vndk")
3101 } else {
3102 ensureListNotContains(t, requireNativeLibs, ":vndk")
3103 }
3104 })
3105 }
Jooyung Handf78e212020-07-22 15:54:47 +09003106}
3107
Justin Yun13decfb2021-03-08 19:25:55 +09003108func TestProductVariant(t *testing.T) {
3109 ctx := testApex(t, `
3110 apex {
3111 name: "myapex",
3112 key: "myapex.key",
3113 updatable: false,
3114 product_specific: true,
3115 binaries: ["foo"],
3116 }
3117
3118 apex_key {
3119 name: "myapex.key",
3120 public_key: "testkey.avbpubkey",
3121 private_key: "testkey.pem",
3122 }
3123
3124 cc_binary {
3125 name: "foo",
3126 product_available: true,
3127 apex_available: ["myapex"],
3128 srcs: ["foo.cpp"],
3129 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003130 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3131 variables.ProductVndkVersion = proptools.StringPtr("current")
3132 }),
3133 )
Justin Yun13decfb2021-03-08 19:25:55 +09003134
3135 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003136 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003137 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3138 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3139 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3140 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3141}
3142
Jooyung Han8e5685d2020-09-21 11:02:57 +09003143func TestApex_withPrebuiltFirmware(t *testing.T) {
3144 testCases := []struct {
3145 name string
3146 additionalProp string
3147 }{
3148 {"system apex with prebuilt_firmware", ""},
3149 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3150 }
3151 for _, tc := range testCases {
3152 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003153 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003154 apex {
3155 name: "myapex",
3156 key: "myapex.key",
3157 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003158 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003159 `+tc.additionalProp+`
3160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 prebuilt_firmware {
3167 name: "myfirmware",
3168 src: "myfirmware.bin",
3169 filename_from_src: true,
3170 `+tc.additionalProp+`
3171 }
3172 `)
3173 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3174 "etc/firmware/myfirmware.bin",
3175 })
3176 })
3177 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003178}
3179
Jooyung Hanefb184e2020-06-25 17:14:25 +09003180func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003181 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003182 apex {
3183 name: "myapex",
3184 key: "myapex.key",
3185 vendor: true,
3186 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003187 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003188 }
3189
3190 apex_key {
3191 name: "myapex.key",
3192 public_key: "testkey.avbpubkey",
3193 private_key: "testkey.pem",
3194 }
3195
3196 cc_library {
3197 name: "mylib",
3198 vendor_available: true,
3199 }
3200 `)
3201
3202 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003203 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003204 name := apexBundle.BaseModuleName()
3205 prefix := "TARGET_"
3206 var builder strings.Builder
3207 data.Custom(&builder, name, prefix, "", data)
3208 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003209 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003210}
3211
Jooyung Han2ed99d02020-06-24 23:26:26 +09003212func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003213 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003214 apex {
3215 name: "myapex",
3216 key: "myapex.key",
3217 vintf_fragments: ["fragment.xml"],
3218 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003219 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003220 }
3221 apex_key {
3222 name: "myapex.key",
3223 public_key: "testkey.avbpubkey",
3224 private_key: "testkey.pem",
3225 }
3226 cc_binary {
3227 name: "mybin",
3228 }
3229 `)
3230
3231 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003232 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003233 name := apexBundle.BaseModuleName()
3234 prefix := "TARGET_"
3235 var builder strings.Builder
3236 data.Custom(&builder, name, prefix, "", data)
3237 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003238 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003239 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003240}
3241
Jiyong Park16e91a02018-12-20 18:18:08 +09003242func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003244 apex {
3245 name: "myapex",
3246 key: "myapex.key",
3247 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003248 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003249 }
3250
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256
3257 cc_library {
3258 name: "mylib",
3259 srcs: ["mylib.cpp"],
3260 system_shared_libs: [],
3261 stl: "none",
3262 stubs: {
3263 versions: ["1", "2", "3"],
3264 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003265 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003266 }
3267
3268 cc_binary {
3269 name: "not_in_apex",
3270 srcs: ["mylib.cpp"],
3271 static_libs: ["mylib"],
3272 static_executable: true,
3273 system_shared_libs: [],
3274 stl: "none",
3275 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003276 `)
3277
Colin Cross7113d202019-11-20 16:39:12 -08003278 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003279
3280 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003281 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003282}
Jiyong Park9335a262018-12-24 11:31:58 +09003283
3284func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003285 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003286 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003287 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003288 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003289 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003290 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003291 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003292 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003293 }
3294
3295 cc_library {
3296 name: "mylib",
3297 srcs: ["mylib.cpp"],
3298 system_shared_libs: [],
3299 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003300 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003301 }
3302
3303 apex_key {
3304 name: "myapex.key",
3305 public_key: "testkey.avbpubkey",
3306 private_key: "testkey.pem",
3307 }
3308
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003309 android_app_certificate {
3310 name: "myapex.certificate",
3311 certificate: "testkey",
3312 }
3313
3314 android_app_certificate {
3315 name: "myapex.certificate.override",
3316 certificate: "testkey.override",
3317 }
3318
Jiyong Park9335a262018-12-24 11:31:58 +09003319 `)
3320
3321 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003322 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003323
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003324 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3325 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003326 "vendor/foo/devkeys/testkey.avbpubkey")
3327 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003328 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3329 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003330 "vendor/foo/devkeys/testkey.pem")
3331 }
3332
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003333 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003334 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003335 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003336 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003337 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003338 }
3339}
Jiyong Park58e364a2019-01-19 19:24:06 +09003340
Jooyung Hanf121a652019-12-17 14:30:11 +09003341func TestCertificate(t *testing.T) {
3342 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003343 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 apex {
3345 name: "myapex",
3346 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003347 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003348 }
3349 apex_key {
3350 name: "myapex.key",
3351 public_key: "testkey.avbpubkey",
3352 private_key: "testkey.pem",
3353 }`)
3354 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3355 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3356 if actual := rule.Args["certificates"]; actual != expected {
3357 t.Errorf("certificates should be %q, not %q", expected, actual)
3358 }
3359 })
3360 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003361 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003362 apex {
3363 name: "myapex_keytest",
3364 key: "myapex.key",
3365 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003366 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003367 }
3368 apex_key {
3369 name: "myapex.key",
3370 public_key: "testkey.avbpubkey",
3371 private_key: "testkey.pem",
3372 }
3373 android_app_certificate {
3374 name: "myapex.certificate.override",
3375 certificate: "testkey.override",
3376 }`)
3377 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3378 expected := "testkey.override.x509.pem testkey.override.pk8"
3379 if actual := rule.Args["certificates"]; actual != expected {
3380 t.Errorf("certificates should be %q, not %q", expected, actual)
3381 }
3382 })
3383 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003384 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003385 apex {
3386 name: "myapex",
3387 key: "myapex.key",
3388 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003389 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003390 }
3391 apex_key {
3392 name: "myapex.key",
3393 public_key: "testkey.avbpubkey",
3394 private_key: "testkey.pem",
3395 }
3396 android_app_certificate {
3397 name: "myapex.certificate",
3398 certificate: "testkey",
3399 }`)
3400 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3401 expected := "testkey.x509.pem testkey.pk8"
3402 if actual := rule.Args["certificates"]; actual != expected {
3403 t.Errorf("certificates should be %q, not %q", expected, actual)
3404 }
3405 })
3406 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003407 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003408 apex {
3409 name: "myapex_keytest",
3410 key: "myapex.key",
3411 file_contexts: ":myapex-file_contexts",
3412 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003413 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003414 }
3415 apex_key {
3416 name: "myapex.key",
3417 public_key: "testkey.avbpubkey",
3418 private_key: "testkey.pem",
3419 }
3420 android_app_certificate {
3421 name: "myapex.certificate.override",
3422 certificate: "testkey.override",
3423 }`)
3424 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3425 expected := "testkey.override.x509.pem testkey.override.pk8"
3426 if actual := rule.Args["certificates"]; actual != expected {
3427 t.Errorf("certificates should be %q, not %q", expected, actual)
3428 }
3429 })
3430 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003431 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003432 apex {
3433 name: "myapex",
3434 key: "myapex.key",
3435 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003436 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003437 }
3438 apex_key {
3439 name: "myapex.key",
3440 public_key: "testkey.avbpubkey",
3441 private_key: "testkey.pem",
3442 }`)
3443 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3444 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3445 if actual := rule.Args["certificates"]; actual != expected {
3446 t.Errorf("certificates should be %q, not %q", expected, actual)
3447 }
3448 })
3449 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003450 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003451 apex {
3452 name: "myapex_keytest",
3453 key: "myapex.key",
3454 file_contexts: ":myapex-file_contexts",
3455 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003456 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003457 }
3458 apex_key {
3459 name: "myapex.key",
3460 public_key: "testkey.avbpubkey",
3461 private_key: "testkey.pem",
3462 }
3463 android_app_certificate {
3464 name: "myapex.certificate.override",
3465 certificate: "testkey.override",
3466 }`)
3467 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3468 expected := "testkey.override.x509.pem testkey.override.pk8"
3469 if actual := rule.Args["certificates"]; actual != expected {
3470 t.Errorf("certificates should be %q, not %q", expected, actual)
3471 }
3472 })
3473}
3474
Jiyong Park58e364a2019-01-19 19:24:06 +09003475func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003477 apex {
3478 name: "myapex",
3479 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003480 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003481 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003482 }
3483
3484 apex {
3485 name: "otherapex",
3486 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003487 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003488 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003489 }
3490
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }
3496
3497 cc_library {
3498 name: "mylib",
3499 srcs: ["mylib.cpp"],
3500 system_shared_libs: [],
3501 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003502 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003503 "myapex",
3504 "otherapex",
3505 ],
Jooyung Han24282772020-03-21 23:20:55 +09003506 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003507 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003508 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003509 cc_library {
3510 name: "mylib2",
3511 srcs: ["mylib.cpp"],
3512 system_shared_libs: [],
3513 stl: "none",
3514 apex_available: [
3515 "myapex",
3516 "otherapex",
3517 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003518 static_libs: ["mylib3"],
3519 recovery_available: true,
3520 min_sdk_version: "29",
3521 }
3522 cc_library {
3523 name: "mylib3",
3524 srcs: ["mylib.cpp"],
3525 system_shared_libs: [],
3526 stl: "none",
3527 apex_available: [
3528 "myapex",
3529 "otherapex",
3530 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003531 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003532 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003533 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003534 `)
3535
Jooyung Hanc87a0592020-03-02 17:44:33 +09003536 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003537 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003538 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539
Vinh Tranf9754732023-01-19 22:41:46 -05003540 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003541 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003543
Vinh Tranf9754732023-01-19 22:41:46 -05003544 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003545 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003546 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003547
Colin Crossaede88c2020-08-11 12:17:01 -07003548 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3549 // each variant defines additional macros to distinguish which apex variant it is built for
3550
3551 // non-APEX variant does not have __ANDROID_APEX__ defined
3552 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3553 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3554
Vinh Tranf9754732023-01-19 22:41:46 -05003555 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003556 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003558
Jooyung Hanc87a0592020-03-02 17:44:33 +09003559 // non-APEX variant does not have __ANDROID_APEX__ defined
3560 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3561 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3562
Vinh Tranf9754732023-01-19 22:41:46 -05003563 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003564 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003565 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003566}
Jiyong Park7e636d02019-01-28 16:16:54 +09003567
3568func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003569 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003570 apex {
3571 name: "myapex",
3572 key: "myapex.key",
3573 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003574 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003575 }
3576
3577 apex_key {
3578 name: "myapex.key",
3579 public_key: "testkey.avbpubkey",
3580 private_key: "testkey.pem",
3581 }
3582
3583 cc_library_headers {
3584 name: "mylib_headers",
3585 export_include_dirs: ["my_include"],
3586 system_shared_libs: [],
3587 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003588 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003589 }
3590
3591 cc_library {
3592 name: "mylib",
3593 srcs: ["mylib.cpp"],
3594 system_shared_libs: [],
3595 stl: "none",
3596 header_libs: ["mylib_headers"],
3597 export_header_lib_headers: ["mylib_headers"],
3598 stubs: {
3599 versions: ["1", "2", "3"],
3600 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003601 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003602 }
3603
3604 cc_library {
3605 name: "otherlib",
3606 srcs: ["mylib.cpp"],
3607 system_shared_libs: [],
3608 stl: "none",
3609 shared_libs: ["mylib"],
3610 }
3611 `)
3612
Colin Cross7113d202019-11-20 16:39:12 -08003613 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003614
3615 // Ensure that the include path of the header lib is exported to 'otherlib'
3616 ensureContains(t, cFlags, "-Imy_include")
3617}
Alex Light9670d332019-01-29 18:07:33 -08003618
Jiyong Park7cd10e32020-01-14 09:22:18 +09003619type fileInApex struct {
3620 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003621 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 isLink bool
3623}
3624
Jooyung Han1724d582022-12-21 10:17:44 +09003625func (f fileInApex) String() string {
3626 return f.src + ":" + f.path
3627}
3628
3629func (f fileInApex) match(expectation string) bool {
3630 parts := strings.Split(expectation, ":")
3631 if len(parts) == 1 {
3632 match, _ := path.Match(parts[0], f.path)
3633 return match
3634 }
3635 if len(parts) == 2 {
3636 matchSrc, _ := path.Match(parts[0], f.src)
3637 matchDst, _ := path.Match(parts[1], f.path)
3638 return matchSrc && matchDst
3639 }
3640 panic("invalid expected file specification: " + expectation)
3641}
3642
Jooyung Hana57af4a2020-01-23 05:36:59 +00003643func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003644 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003645 module := ctx.ModuleForTests(moduleName, variant)
3646 apexRule := module.MaybeRule("apexRule")
3647 apexDir := "/image.apex/"
3648 if apexRule.Rule == nil {
3649 apexRule = module.Rule("zipApexRule")
3650 apexDir = "/image.zipapex/"
3651 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003652 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 for _, cmd := range strings.Split(copyCmds, "&&") {
3655 cmd = strings.TrimSpace(cmd)
3656 if cmd == "" {
3657 continue
3658 }
3659 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003660 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003661 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003662 switch terms[0] {
3663 case "mkdir":
3664 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 t.Fatal("copyCmds contains invalid cp command", cmd)
3667 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003669 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 isLink = false
3671 case "ln":
3672 if len(terms) != 3 && len(terms) != 4 {
3673 // ln LINK TARGET or ln -s LINK TARGET
3674 t.Fatal("copyCmds contains invalid ln command", cmd)
3675 }
3676 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003677 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003678 isLink = true
3679 default:
3680 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3681 }
3682 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003683 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003685 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003686 }
Jooyung Han1724d582022-12-21 10:17:44 +09003687 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003688 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 }
3690 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003691 return ret
3692}
3693
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003694func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003695 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003696 var failed bool
3697 var surplus []string
3698 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003699 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003700 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003701 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003702 if file.match(expected) {
3703 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003704 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003705 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003706 }
3707 }
Jooyung Han1724d582022-12-21 10:17:44 +09003708 if !matchFound {
3709 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003710 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003711 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003712
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003714 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 t.Log("surplus files", surplus)
3716 failed = true
3717 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003718
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003719 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003720 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003721 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003722 if !filesMatched[expected] {
3723 missing = append(missing, expected)
3724 }
3725 }
3726 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003727 t.Log("missing files", missing)
3728 failed = true
3729 }
3730 if failed {
3731 t.Fail()
3732 }
3733}
3734
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003735func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3736 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3737}
3738
3739func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3740 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3741 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3742 if deapexer.Output != nil {
3743 outputs = append(outputs, deapexer.Output.String())
3744 }
3745 for _, output := range deapexer.ImplicitOutputs {
3746 outputs = append(outputs, output.String())
3747 }
3748 actualFiles := make([]fileInApex, 0, len(outputs))
3749 for _, output := range outputs {
3750 dir := "/deapexer/"
3751 pos := strings.LastIndex(output, dir)
3752 if pos == -1 {
3753 t.Fatal("Unknown deapexer output ", output)
3754 }
3755 path := output[pos+len(dir):]
3756 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3757 }
3758 assertFileListEquals(t, files, actualFiles)
3759}
3760
Jooyung Han344d5432019-08-23 11:17:39 +09003761func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003762 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003763 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003764 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003765 "etc/llndk.libraries.29.txt",
3766 "etc/vndkcore.libraries.29.txt",
3767 "etc/vndksp.libraries.29.txt",
3768 "etc/vndkprivate.libraries.29.txt",
3769 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003770 }
3771 testCases := []struct {
3772 vndkVersion string
3773 expectedFiles []string
3774 }{
3775 {
3776 vndkVersion: "current",
3777 expectedFiles: append(commonFiles,
3778 "lib/libvndk.so",
3779 "lib/libvndksp.so",
3780 "lib64/libvndk.so",
3781 "lib64/libvndksp.so"),
3782 },
3783 {
3784 vndkVersion: "",
3785 expectedFiles: append(commonFiles,
3786 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3787 "lib/libvndksp.so",
3788 "lib64/libvndksp.so"),
3789 },
3790 }
3791 for _, tc := range testCases {
3792 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3793 ctx := testApex(t, `
3794 apex_vndk {
3795 name: "com.android.vndk.current",
3796 key: "com.android.vndk.current.key",
3797 updatable: false,
3798 }
3799
3800 apex_key {
3801 name: "com.android.vndk.current.key",
3802 public_key: "testkey.avbpubkey",
3803 private_key: "testkey.pem",
3804 }
3805
3806 cc_library {
3807 name: "libvndk",
3808 srcs: ["mylib.cpp"],
3809 vendor_available: true,
3810 product_available: true,
3811 vndk: {
3812 enabled: true,
3813 },
3814 system_shared_libs: [],
3815 stl: "none",
3816 apex_available: [ "com.android.vndk.current" ],
3817 }
3818
3819 cc_library {
3820 name: "libvndksp",
3821 srcs: ["mylib.cpp"],
3822 vendor_available: true,
3823 product_available: true,
3824 vndk: {
3825 enabled: true,
3826 support_system_process: true,
3827 },
3828 system_shared_libs: [],
3829 stl: "none",
3830 apex_available: [ "com.android.vndk.current" ],
3831 }
3832
3833 // VNDK-Ext should not cause any problems
3834
3835 cc_library {
3836 name: "libvndk.ext",
3837 srcs: ["mylib2.cpp"],
3838 vendor: true,
3839 vndk: {
3840 enabled: true,
3841 extends: "libvndk",
3842 },
3843 system_shared_libs: [],
3844 stl: "none",
3845 }
3846
3847 cc_library {
3848 name: "libvndksp.ext",
3849 srcs: ["mylib2.cpp"],
3850 vendor: true,
3851 vndk: {
3852 enabled: true,
3853 support_system_process: true,
3854 extends: "libvndksp",
3855 },
3856 system_shared_libs: [],
3857 stl: "none",
3858 }
3859 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3860 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3861 }))
3862 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3863 })
3864 }
Jooyung Han344d5432019-08-23 11:17:39 +09003865}
3866
3867func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003868 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003869 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003870 name: "com.android.vndk.current",
3871 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003872 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003873 }
3874
3875 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003876 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003877 public_key: "testkey.avbpubkey",
3878 private_key: "testkey.pem",
3879 }
3880
3881 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 name: "libvndk",
3883 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003884 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003885 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003886 vndk: {
3887 enabled: true,
3888 },
3889 system_shared_libs: [],
3890 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003891 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003892 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003893
3894 cc_prebuilt_library_shared {
3895 name: "libvndk.arm",
3896 srcs: ["libvndk.arm.so"],
3897 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003898 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003899 vndk: {
3900 enabled: true,
3901 },
3902 enabled: false,
3903 arch: {
3904 arm: {
3905 enabled: true,
3906 },
3907 },
3908 system_shared_libs: [],
3909 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003910 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003912 `+vndkLibrariesTxtFiles("current"),
3913 withFiles(map[string][]byte{
3914 "libvndk.so": nil,
3915 "libvndk.arm.so": nil,
3916 }))
Colin Cross2807f002021-03-02 10:15:29 -08003917 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003918 "lib/libvndk.so",
3919 "lib/libvndk.arm.so",
3920 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003921 "lib/libc++.so",
3922 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003923 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 })
Jooyung Han344d5432019-08-23 11:17:39 +09003925}
3926
Jooyung Han39edb6c2019-11-06 16:53:07 +09003927func vndkLibrariesTxtFiles(vers ...string) (result string) {
3928 for _, v := range vers {
3929 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003930 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003931 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003932 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003933 name: "` + txt + `.libraries.txt",
3934 }
3935 `
3936 }
3937 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003938 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 result += `
3940 prebuilt_etc {
3941 name: "` + txt + `.libraries.` + v + `.txt",
3942 src: "dummy.txt",
3943 }
3944 `
3945 }
3946 }
3947 }
3948 return
3949}
3950
Jooyung Han344d5432019-08-23 11:17:39 +09003951func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003952 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003953 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003954 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003955 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003956 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003957 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
Jooyung Han31c470b2019-10-18 16:26:59 +09003967 vndk_prebuilt_shared {
3968 name: "libvndk27",
3969 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003971 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003972 vndk: {
3973 enabled: true,
3974 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 target_arch: "arm64",
3976 arch: {
3977 arm: {
3978 srcs: ["libvndk27_arm.so"],
3979 },
3980 arm64: {
3981 srcs: ["libvndk27_arm64.so"],
3982 },
3983 },
Colin Cross2807f002021-03-02 10:15:29 -08003984 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003985 }
3986
3987 vndk_prebuilt_shared {
3988 name: "libvndk27",
3989 version: "27",
3990 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003991 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003992 vndk: {
3993 enabled: true,
3994 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003995 target_arch: "x86_64",
3996 arch: {
3997 x86: {
3998 srcs: ["libvndk27_x86.so"],
3999 },
4000 x86_64: {
4001 srcs: ["libvndk27_x86_64.so"],
4002 },
4003 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004004 }
4005 `+vndkLibrariesTxtFiles("27"),
4006 withFiles(map[string][]byte{
4007 "libvndk27_arm.so": nil,
4008 "libvndk27_arm64.so": nil,
4009 "libvndk27_x86.so": nil,
4010 "libvndk27_x86_64.so": nil,
4011 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004012
Colin Cross2807f002021-03-02 10:15:29 -08004013 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 "lib/libvndk27_arm.so",
4015 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004016 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 })
Jooyung Han344d5432019-08-23 11:17:39 +09004018}
4019
Jooyung Han90eee022019-10-01 20:02:42 +09004020func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004021 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004022 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004023 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004026 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004027 }
4028 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004029 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004030 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004032 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004033 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004034 }
4035 apex_key {
4036 name: "myapex.key",
4037 public_key: "testkey.avbpubkey",
4038 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004039 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004040
4041 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004042 module := ctx.ModuleForTests(moduleName, "android_common_image")
4043 apexManifestRule := module.Rule("apexManifestRule")
4044 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004045 }
4046
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004047 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004048 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004049}
4050
Jooyung Han344d5432019-08-23 11:17:39 +09004051func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004052 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004053 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004054 name: "com.android.vndk.current",
4055 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004056 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004057 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004058 }
4059
4060 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004061 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004062 public_key: "testkey.avbpubkey",
4063 private_key: "testkey.pem",
4064 }
4065
4066 cc_library {
4067 name: "libvndk",
4068 srcs: ["mylib.cpp"],
4069 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004070 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004071 native_bridge_supported: true,
4072 host_supported: true,
4073 vndk: {
4074 enabled: true,
4075 },
4076 system_shared_libs: [],
4077 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004078 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004079 }
Colin Cross2807f002021-03-02 10:15:29 -08004080 `+vndkLibrariesTxtFiles("current"),
4081 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004082
Colin Cross2807f002021-03-02 10:15:29 -08004083 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 "lib/libvndk.so",
4085 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004086 "lib/libc++.so",
4087 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004088 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 })
Jooyung Han344d5432019-08-23 11:17:39 +09004090}
4091
4092func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004093 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004094 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004095 name: "com.android.vndk.current",
4096 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004097 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004098 native_bridge_supported: true,
4099 }
4100
4101 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004102 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004103 public_key: "testkey.avbpubkey",
4104 private_key: "testkey.pem",
4105 }
4106
4107 cc_library {
4108 name: "libvndk",
4109 srcs: ["mylib.cpp"],
4110 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004111 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004112 native_bridge_supported: true,
4113 host_supported: true,
4114 vndk: {
4115 enabled: true,
4116 },
4117 system_shared_libs: [],
4118 stl: "none",
4119 }
4120 `)
4121}
4122
Jooyung Han31c470b2019-10-18 16:26:59 +09004123func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004124 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004126 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004127 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004128 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004130 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 }
4132
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138
4139 vndk_prebuilt_shared {
4140 name: "libvndk27",
4141 version: "27",
4142 target_arch: "arm",
4143 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004144 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 vndk: {
4146 enabled: true,
4147 },
4148 arch: {
4149 arm: {
4150 srcs: ["libvndk27.so"],
4151 }
4152 },
4153 }
4154
4155 vndk_prebuilt_shared {
4156 name: "libvndk27",
4157 version: "27",
4158 target_arch: "arm",
4159 binder32bit: true,
4160 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004161 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004162 vndk: {
4163 enabled: true,
4164 },
4165 arch: {
4166 arm: {
4167 srcs: ["libvndk27binder32.so"],
4168 }
4169 },
Colin Cross2807f002021-03-02 10:15:29 -08004170 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004171 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004172 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004173 withFiles(map[string][]byte{
4174 "libvndk27.so": nil,
4175 "libvndk27binder32.so": nil,
4176 }),
4177 withBinder32bit,
4178 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004179 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004180 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4181 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004182 },
4183 }),
4184 )
4185
Colin Cross2807f002021-03-02 10:15:29 -08004186 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004187 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004188 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004189 })
4190}
4191
Jooyung Han45a96772020-06-15 14:59:42 +09004192func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004193 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004194 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004195 name: "com.android.vndk.current",
4196 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004197 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004198 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004199 }
4200
4201 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004202 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004203 public_key: "testkey.avbpubkey",
4204 private_key: "testkey.pem",
4205 }
4206
4207 cc_library {
4208 name: "libz",
4209 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004210 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004211 vndk: {
4212 enabled: true,
4213 },
4214 stubs: {
4215 symbol_file: "libz.map.txt",
4216 versions: ["30"],
4217 }
4218 }
4219 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4220 "libz.map.txt": nil,
4221 }))
4222
Colin Cross2807f002021-03-02 10:15:29 -08004223 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004224 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4225 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004226 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4227 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4228 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4229 "*/*",
4230 })
Jooyung Han45a96772020-06-15 14:59:42 +09004231}
4232
Jooyung Hane3f02812023-05-08 13:54:50 +09004233func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4234 ctx := testApex(t, "",
4235 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4236 variables.DeviceVndkVersion = proptools.StringPtr("27")
4237 }),
4238 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4239 cc.RegisterVendorSnapshotModules(ctx)
4240 }),
4241 withFiles(map[string][]byte{
4242 "vendor/foo/Android.bp": []byte(`
4243 apex {
4244 name: "myapex",
4245 binaries: ["foo"],
4246 key: "myapex.key",
4247 min_sdk_version: "27",
4248 vendor: true,
4249 }
4250
4251 cc_binary {
4252 name: "foo",
4253 vendor: true,
4254 srcs: ["abc.cpp"],
4255 shared_libs: [
4256 "libllndk",
4257 "libvndk",
4258 ],
4259 nocrt: true,
4260 system_shared_libs: [],
4261 min_sdk_version: "27",
4262 }
4263
4264 apex_key {
4265 name: "myapex.key",
4266 public_key: "testkey.avbpubkey",
4267 private_key: "testkey.pem",
4268 }
4269 `),
4270 // Simulate VNDK prebuilts with vendor_snapshot
4271 "prebuilts/vndk/Android.bp": []byte(`
4272 vndk_prebuilt_shared {
4273 name: "libllndk",
4274 version: "27",
4275 vendor_available: true,
4276 product_available: true,
4277 target_arch: "arm64",
4278 arch: {
4279 arm64: {
4280 srcs: ["libllndk.so"],
4281 },
4282 },
4283 }
4284
4285 vndk_prebuilt_shared {
4286 name: "libvndk",
4287 version: "27",
4288 vendor_available: true,
4289 product_available: true,
4290 target_arch: "arm64",
4291 arch: {
4292 arm64: {
4293 srcs: ["libvndk.so"],
4294 },
4295 },
4296 vndk: {
4297 enabled: true,
4298 },
4299 min_sdk_version: "27",
4300 }
4301
4302 vndk_prebuilt_shared {
4303 name: "libc++",
4304 version: "27",
4305 target_arch: "arm64",
4306 vendor_available: true,
4307 product_available: true,
4308 vndk: {
4309 enabled: true,
4310 support_system_process: true,
4311 },
4312 arch: {
4313 arm64: {
4314 srcs: ["libc++.so"],
4315 },
4316 },
4317 min_sdk_version: "apex_inherit",
4318 }
4319
4320 vendor_snapshot {
4321 name: "vendor_snapshot",
4322 version: "27",
4323 arch: {
4324 arm64: {
4325 vndk_libs: [
4326 "libc++",
4327 "libllndk",
4328 "libvndk",
4329 ],
4330 static_libs: [
4331 "libc++demangle",
4332 "libclang_rt.builtins",
4333 "libunwind",
4334 ],
4335 },
4336 }
4337 }
4338
4339 vendor_snapshot_static {
4340 name: "libclang_rt.builtins",
4341 version: "27",
4342 target_arch: "arm64",
4343 vendor: true,
4344 arch: {
4345 arm64: {
4346 src: "libclang_rt.builtins-aarch64-android.a",
4347 },
4348 },
4349 }
4350
4351 vendor_snapshot_static {
4352 name: "libc++demangle",
4353 version: "27",
4354 target_arch: "arm64",
4355 compile_multilib: "64",
4356 vendor: true,
4357 arch: {
4358 arm64: {
4359 src: "libc++demangle.a",
4360 },
4361 },
4362 min_sdk_version: "apex_inherit",
4363 }
4364
4365 vendor_snapshot_static {
4366 name: "libunwind",
4367 version: "27",
4368 target_arch: "arm64",
4369 compile_multilib: "64",
4370 vendor: true,
4371 arch: {
4372 arm64: {
4373 src: "libunwind.a",
4374 },
4375 },
4376 min_sdk_version: "apex_inherit",
4377 }
4378 `),
4379 }))
4380
4381 // Should embed the prebuilt VNDK libraries in the apex
4382 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4383 "bin/foo",
4384 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4385 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4386 })
4387
4388 // Should link foo with prebuilt libraries (shared/static)
4389 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4390 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4391 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4392 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4393 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4394
4395 // Should declare the LLNDK library as a "required" external dependency
4396 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4397 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4398 ensureListContains(t, requireNativeLibs, "libllndk.so")
4399}
4400
Jooyung Hane1633032019-08-01 17:41:43 +09004401func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004402 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004403 apex {
4404 name: "myapex_nodep",
4405 key: "myapex.key",
4406 native_shared_libs: ["lib_nodep"],
4407 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004408 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004410 }
4411
4412 apex {
4413 name: "myapex_dep",
4414 key: "myapex.key",
4415 native_shared_libs: ["lib_dep"],
4416 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004418 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 apex {
4422 name: "myapex_provider",
4423 key: "myapex.key",
4424 native_shared_libs: ["libfoo"],
4425 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004426 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004427 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004428 }
4429
4430 apex {
4431 name: "myapex_selfcontained",
4432 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004433 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004434 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004435 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004436 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 apex_key {
4440 name: "myapex.key",
4441 public_key: "testkey.avbpubkey",
4442 private_key: "testkey.pem",
4443 }
4444
4445 cc_library {
4446 name: "lib_nodep",
4447 srcs: ["mylib.cpp"],
4448 system_shared_libs: [],
4449 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004450 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004451 }
4452
4453 cc_library {
4454 name: "lib_dep",
4455 srcs: ["mylib.cpp"],
4456 shared_libs: ["libfoo"],
4457 system_shared_libs: [],
4458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004459 apex_available: [
4460 "myapex_dep",
4461 "myapex_provider",
4462 "myapex_selfcontained",
4463 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004464 }
4465
4466 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004467 name: "lib_dep_on_bar",
4468 srcs: ["mylib.cpp"],
4469 shared_libs: ["libbar"],
4470 system_shared_libs: [],
4471 stl: "none",
4472 apex_available: [
4473 "myapex_selfcontained",
4474 ],
4475 }
4476
4477
4478 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004479 name: "libfoo",
4480 srcs: ["mytest.cpp"],
4481 stubs: {
4482 versions: ["1"],
4483 },
4484 system_shared_libs: [],
4485 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004486 apex_available: [
4487 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004488 ],
4489 }
4490
4491 cc_library {
4492 name: "libbar",
4493 srcs: ["mytest.cpp"],
4494 stubs: {
4495 versions: ["1"],
4496 },
4497 system_shared_libs: [],
4498 stl: "none",
4499 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004500 "myapex_selfcontained",
4501 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004502 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004503
Jooyung Hane1633032019-08-01 17:41:43 +09004504 `)
4505
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004506 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004507 var provideNativeLibs, requireNativeLibs []string
4508
Sundong Ahnabb64432019-10-22 13:58:29 +09004509 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004510 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4511 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004512 ensureListEmpty(t, provideNativeLibs)
4513 ensureListEmpty(t, requireNativeLibs)
4514
Sundong Ahnabb64432019-10-22 13:58:29 +09004515 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004516 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4517 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004518 ensureListEmpty(t, provideNativeLibs)
4519 ensureListContains(t, requireNativeLibs, "libfoo.so")
4520
Sundong Ahnabb64432019-10-22 13:58:29 +09004521 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004522 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4523 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004524 ensureListContains(t, provideNativeLibs, "libfoo.so")
4525 ensureListEmpty(t, requireNativeLibs)
4526
Sundong Ahnabb64432019-10-22 13:58:29 +09004527 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004528 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4529 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004530 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004531 ensureListEmpty(t, requireNativeLibs)
4532}
4533
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004534func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4535 ctx := testApex(t, `
4536 apex {
4537 name: "myapex",
4538 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004539 native_shared_libs: ["mylib"],
4540 updatable: false,
4541 }
4542
4543 apex_key {
4544 name: "myapex.key",
4545 public_key: "testkey.avbpubkey",
4546 private_key: "testkey.pem",
4547 }
4548
4549 cc_library {
4550 name: "mylib",
4551 srcs: ["mylib.cpp"],
4552 system_shared_libs: [],
4553 stl: "none",
4554 apex_available: [
4555 "//apex_available:platform",
4556 "myapex",
4557 ],
4558 }
4559 `, android.FixtureMergeEnv(map[string]string{
4560 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4561 }))
4562
Jooyung Han63dff462023-02-09 00:11:27 +00004563 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004564 apexManifestRule := module.Rule("apexManifestRule")
4565 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4566}
4567
Vinh Tran8f5310f2022-10-07 18:16:47 -04004568func TestCompileMultilibProp(t *testing.T) {
4569 testCases := []struct {
4570 compileMultiLibProp string
4571 containedLibs []string
4572 notContainedLibs []string
4573 }{
4574 {
4575 containedLibs: []string{
4576 "image.apex/lib64/mylib.so",
4577 "image.apex/lib/mylib.so",
4578 },
4579 compileMultiLibProp: `compile_multilib: "both",`,
4580 },
4581 {
4582 containedLibs: []string{"image.apex/lib64/mylib.so"},
4583 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4584 compileMultiLibProp: `compile_multilib: "first",`,
4585 },
4586 {
4587 containedLibs: []string{"image.apex/lib64/mylib.so"},
4588 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4589 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4590 },
4591 {
4592 containedLibs: []string{"image.apex/lib64/mylib.so"},
4593 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4594 compileMultiLibProp: `compile_multilib: "64",`,
4595 },
4596 {
4597 containedLibs: []string{"image.apex/lib/mylib.so"},
4598 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4599 compileMultiLibProp: `compile_multilib: "32",`,
4600 },
4601 }
4602 for _, testCase := range testCases {
4603 ctx := testApex(t, fmt.Sprintf(`
4604 apex {
4605 name: "myapex",
4606 key: "myapex.key",
4607 %s
4608 native_shared_libs: ["mylib"],
4609 updatable: false,
4610 }
4611 apex_key {
4612 name: "myapex.key",
4613 public_key: "testkey.avbpubkey",
4614 private_key: "testkey.pem",
4615 }
4616 cc_library {
4617 name: "mylib",
4618 srcs: ["mylib.cpp"],
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
4623 }
4624 `, testCase.compileMultiLibProp),
4625 )
4626 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4627 apexRule := module.Rule("apexRule")
4628 copyCmds := apexRule.Args["copy_commands"]
4629 for _, containedLib := range testCase.containedLibs {
4630 ensureContains(t, copyCmds, containedLib)
4631 }
4632 for _, notContainedLib := range testCase.notContainedLibs {
4633 ensureNotContains(t, copyCmds, notContainedLib)
4634 }
4635 }
4636}
4637
Alex Light0851b882019-02-07 13:20:53 -08004638func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004639 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004640 apex {
4641 name: "myapex",
4642 key: "myapex.key",
4643 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004644 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004645 }
4646
4647 apex_key {
4648 name: "myapex.key",
4649 public_key: "testkey.avbpubkey",
4650 private_key: "testkey.pem",
4651 }
4652
4653 cc_library {
4654 name: "mylib_common",
4655 srcs: ["mylib.cpp"],
4656 system_shared_libs: [],
4657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004658 apex_available: [
4659 "//apex_available:platform",
4660 "myapex",
4661 ],
Alex Light0851b882019-02-07 13:20:53 -08004662 }
4663 `)
4664
Sundong Ahnabb64432019-10-22 13:58:29 +09004665 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004666 apexRule := module.Rule("apexRule")
4667 copyCmds := apexRule.Args["copy_commands"]
4668
4669 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4670 t.Log("Apex was a test apex!")
4671 t.Fail()
4672 }
4673 // Ensure that main rule creates an output
4674 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4675
4676 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004677 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004678
4679 // Ensure that both direct and indirect deps are copied into apex
4680 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4681
Colin Cross7113d202019-11-20 16:39:12 -08004682 // Ensure that the platform variant ends with _shared
4683 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004684
Colin Cross56a83212020-09-15 18:30:11 -07004685 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004686 t.Log("Found mylib_common not in any apex!")
4687 t.Fail()
4688 }
4689}
4690
4691func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004692 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004693 apex_test {
4694 name: "myapex",
4695 key: "myapex.key",
4696 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004697 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004698 }
4699
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705
4706 cc_library {
4707 name: "mylib_common_test",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
Alex Light0851b882019-02-07 13:20:53 -08004716 }
4717 `)
4718
Sundong Ahnabb64432019-10-22 13:58:29 +09004719 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004720 apexRule := module.Rule("apexRule")
4721 copyCmds := apexRule.Args["copy_commands"]
4722
4723 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4724 t.Log("Apex was not a test apex!")
4725 t.Fail()
4726 }
4727 // Ensure that main rule creates an output
4728 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4729
4730 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004731 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004732
4733 // Ensure that both direct and indirect deps are copied into apex
4734 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4735
Colin Cross7113d202019-11-20 16:39:12 -08004736 // Ensure that the platform variant ends with _shared
4737 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004738}
4739
Alex Light9670d332019-01-29 18:07:33 -08004740func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004741 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004742 apex {
4743 name: "myapex",
4744 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004745 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004746 multilib: {
4747 first: {
4748 native_shared_libs: ["mylib_common"],
4749 }
4750 },
4751 target: {
4752 android: {
4753 multilib: {
4754 first: {
4755 native_shared_libs: ["mylib"],
4756 }
4757 }
4758 },
4759 host: {
4760 multilib: {
4761 first: {
4762 native_shared_libs: ["mylib2"],
4763 }
4764 }
4765 }
4766 }
4767 }
4768
4769 apex_key {
4770 name: "myapex.key",
4771 public_key: "testkey.avbpubkey",
4772 private_key: "testkey.pem",
4773 }
4774
4775 cc_library {
4776 name: "mylib",
4777 srcs: ["mylib.cpp"],
4778 system_shared_libs: [],
4779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004780 // TODO: remove //apex_available:platform
4781 apex_available: [
4782 "//apex_available:platform",
4783 "myapex",
4784 ],
Alex Light9670d332019-01-29 18:07:33 -08004785 }
4786
4787 cc_library {
4788 name: "mylib_common",
4789 srcs: ["mylib.cpp"],
4790 system_shared_libs: [],
4791 stl: "none",
4792 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004793 // TODO: remove //apex_available:platform
4794 apex_available: [
4795 "//apex_available:platform",
4796 "myapex",
4797 ],
Alex Light9670d332019-01-29 18:07:33 -08004798 }
4799
4800 cc_library {
4801 name: "mylib2",
4802 srcs: ["mylib.cpp"],
4803 system_shared_libs: [],
4804 stl: "none",
4805 compile_multilib: "first",
4806 }
4807 `)
4808
Sundong Ahnabb64432019-10-22 13:58:29 +09004809 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004810 copyCmds := apexRule.Args["copy_commands"]
4811
4812 // Ensure that main rule creates an output
4813 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4814
4815 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004816 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4817 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4818 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004819
4820 // Ensure that both direct and indirect deps are copied into apex
4821 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4822 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4823 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4824
Colin Cross7113d202019-11-20 16:39:12 -08004825 // Ensure that the platform variant ends with _shared
4826 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4827 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004829}
Jiyong Park04480cf2019-02-06 00:16:29 +09004830
Jiyong Park59140302020-12-14 18:44:04 +09004831func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004832 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004833 apex {
4834 name: "myapex",
4835 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004836 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004837 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004838 arch: {
4839 arm64: {
4840 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004841 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004842 },
4843 x86_64: {
4844 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004845 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004846 },
4847 }
4848 }
4849
4850 apex_key {
4851 name: "myapex.key",
4852 public_key: "testkey.avbpubkey",
4853 private_key: "testkey.pem",
4854 }
4855
4856 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004857 name: "mylib.generic",
4858 srcs: ["mylib.cpp"],
4859 system_shared_libs: [],
4860 stl: "none",
4861 // TODO: remove //apex_available:platform
4862 apex_available: [
4863 "//apex_available:platform",
4864 "myapex",
4865 ],
4866 }
4867
4868 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004869 name: "mylib.arm64",
4870 srcs: ["mylib.cpp"],
4871 system_shared_libs: [],
4872 stl: "none",
4873 // TODO: remove //apex_available:platform
4874 apex_available: [
4875 "//apex_available:platform",
4876 "myapex",
4877 ],
4878 }
4879
4880 cc_library {
4881 name: "mylib.x64",
4882 srcs: ["mylib.cpp"],
4883 system_shared_libs: [],
4884 stl: "none",
4885 // TODO: remove //apex_available:platform
4886 apex_available: [
4887 "//apex_available:platform",
4888 "myapex",
4889 ],
4890 }
4891 `)
4892
4893 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4894 copyCmds := apexRule.Args["copy_commands"]
4895
4896 // Ensure that apex variant is created for the direct dep
4897 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004898 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004899 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4900
4901 // Ensure that both direct and indirect deps are copied into apex
4902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4903 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4904}
4905
Jiyong Park04480cf2019-02-06 00:16:29 +09004906func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004907 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004908 apex {
4909 name: "myapex",
4910 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004911 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004912 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004913 }
4914
4915 apex_key {
4916 name: "myapex.key",
4917 public_key: "testkey.avbpubkey",
4918 private_key: "testkey.pem",
4919 }
4920
4921 sh_binary {
4922 name: "myscript",
4923 src: "mylib.cpp",
4924 filename: "myscript.sh",
4925 sub_dir: "script",
4926 }
4927 `)
4928
Sundong Ahnabb64432019-10-22 13:58:29 +09004929 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004930 copyCmds := apexRule.Args["copy_commands"]
4931
4932 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4933}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004934
Jooyung Han91df2082019-11-20 01:49:42 +09004935func TestApexInVariousPartition(t *testing.T) {
4936 testcases := []struct {
4937 propName, parition, flattenedPartition string
4938 }{
4939 {"", "system", "system_ext"},
4940 {"product_specific: true", "product", "product"},
4941 {"soc_specific: true", "vendor", "vendor"},
4942 {"proprietary: true", "vendor", "vendor"},
4943 {"vendor: true", "vendor", "vendor"},
4944 {"system_ext_specific: true", "system_ext", "system_ext"},
4945 }
4946 for _, tc := range testcases {
4947 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004949 apex {
4950 name: "myapex",
4951 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004952 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004953 `+tc.propName+`
4954 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004955
Jooyung Han91df2082019-11-20 01:49:42 +09004956 apex_key {
4957 name: "myapex.key",
4958 public_key: "testkey.avbpubkey",
4959 private_key: "testkey.pem",
4960 }
4961 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004962
Jooyung Han91df2082019-11-20 01:49:42 +09004963 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004964 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4965 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004966 if actual != expected {
4967 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4968 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004969
Jooyung Han91df2082019-11-20 01:49:42 +09004970 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004971 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4972 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004973 if actual != expected {
4974 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4975 }
4976 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004977 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004978}
Jiyong Park67882562019-03-21 01:11:21 +09004979
Jooyung Han580eb4f2020-06-24 19:33:06 +09004980func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004981 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004982 apex {
4983 name: "myapex",
4984 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004985 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004986 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004987
Jooyung Han580eb4f2020-06-24 19:33:06 +09004988 apex_key {
4989 name: "myapex.key",
4990 public_key: "testkey.avbpubkey",
4991 private_key: "testkey.pem",
4992 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004993 `)
4994 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 rule := module.Output("file_contexts")
4996 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4997}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004998
Jooyung Han580eb4f2020-06-24 19:33:06 +09004999func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005000 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 apex {
5002 name: "myapex",
5003 key: "myapex.key",
5004 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005005 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005006 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005007
Jooyung Han580eb4f2020-06-24 19:33:06 +09005008 apex_key {
5009 name: "myapex.key",
5010 public_key: "testkey.avbpubkey",
5011 private_key: "testkey.pem",
5012 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005013 `, withFiles(map[string][]byte{
5014 "my_own_file_contexts": nil,
5015 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005017
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005019 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005020 apex {
5021 name: "myapex",
5022 key: "myapex.key",
5023 product_specific: true,
5024 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005025 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005027
Jooyung Han580eb4f2020-06-24 19:33:06 +09005028 apex_key {
5029 name: "myapex.key",
5030 public_key: "testkey.avbpubkey",
5031 private_key: "testkey.pem",
5032 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005033 `)
5034
Colin Cross1c460562021-02-16 17:55:47 -08005035 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005036 apex {
5037 name: "myapex",
5038 key: "myapex.key",
5039 product_specific: true,
5040 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005041 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005042 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005043
Jooyung Han580eb4f2020-06-24 19:33:06 +09005044 apex_key {
5045 name: "myapex.key",
5046 public_key: "testkey.avbpubkey",
5047 private_key: "testkey.pem",
5048 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005049 `, withFiles(map[string][]byte{
5050 "product_specific_file_contexts": nil,
5051 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5053 rule := module.Output("file_contexts")
5054 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5055}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005056
Jooyung Han580eb4f2020-06-24 19:33:06 +09005057func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005058 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005059 apex {
5060 name: "myapex",
5061 key: "myapex.key",
5062 product_specific: true,
5063 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005064 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005065 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005066
Jooyung Han580eb4f2020-06-24 19:33:06 +09005067 apex_key {
5068 name: "myapex.key",
5069 public_key: "testkey.avbpubkey",
5070 private_key: "testkey.pem",
5071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005072
Jooyung Han580eb4f2020-06-24 19:33:06 +09005073 filegroup {
5074 name: "my-file-contexts",
5075 srcs: ["product_specific_file_contexts"],
5076 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005077 `, withFiles(map[string][]byte{
5078 "product_specific_file_contexts": nil,
5079 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005080 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5081 rule := module.Output("file_contexts")
5082 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005083}
5084
Jiyong Park67882562019-03-21 01:11:21 +09005085func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005086 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005087 apex_key {
5088 name: "myapex.key",
5089 public_key: ":my.avbpubkey",
5090 private_key: ":my.pem",
5091 product_specific: true,
5092 }
5093
5094 filegroup {
5095 name: "my.avbpubkey",
5096 srcs: ["testkey2.avbpubkey"],
5097 }
5098
5099 filegroup {
5100 name: "my.pem",
5101 srcs: ["testkey2.pem"],
5102 }
5103 `)
5104
5105 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5106 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005107 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005108 if actual_pubkey != expected_pubkey {
5109 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5110 }
5111 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005112 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005113 if actual_privkey != expected_privkey {
5114 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5115 }
5116}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005117
5118func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005119 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005120 prebuilt_apex {
5121 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005122 arch: {
5123 arm64: {
5124 src: "myapex-arm64.apex",
5125 },
5126 arm: {
5127 src: "myapex-arm.apex",
5128 },
5129 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005130 }
5131 `)
5132
Wei Li340ee8e2022-03-18 17:33:24 -07005133 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5134 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005135
Jiyong Parkc95714e2019-03-29 14:23:10 +09005136 expectedInput := "myapex-arm64.apex"
5137 if prebuilt.inputApex.String() != expectedInput {
5138 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5139 }
Wei Li340ee8e2022-03-18 17:33:24 -07005140 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5141 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5142 rule := testingModule.Rule("genProvenanceMetaData")
5143 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5144 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5145 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5146 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005147
5148 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5149 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005150}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005151
Paul Duffinc0609c62021-03-01 17:27:16 +00005152func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005153 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005154 prebuilt_apex {
5155 name: "myapex",
5156 }
5157 `)
5158}
5159
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005160func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005161 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005162 prebuilt_apex {
5163 name: "myapex",
5164 src: "myapex-arm.apex",
5165 filename: "notmyapex.apex",
5166 }
5167 `)
5168
Wei Li340ee8e2022-03-18 17:33:24 -07005169 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5170 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005171
5172 expected := "notmyapex.apex"
5173 if p.installFilename != expected {
5174 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5175 }
Wei Li340ee8e2022-03-18 17:33:24 -07005176 rule := testingModule.Rule("genProvenanceMetaData")
5177 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5178 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5179 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5180 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005181}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005182
Samiul Islam7c02e262021-09-08 17:48:28 +01005183func TestApexSetFilenameOverride(t *testing.T) {
5184 testApex(t, `
5185 apex_set {
5186 name: "com.company.android.myapex",
5187 apex_name: "com.android.myapex",
5188 set: "company-myapex.apks",
5189 filename: "com.company.android.myapex.apex"
5190 }
5191 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5192
5193 testApex(t, `
5194 apex_set {
5195 name: "com.company.android.myapex",
5196 apex_name: "com.android.myapex",
5197 set: "company-myapex.apks",
5198 filename: "com.company.android.myapex.capex"
5199 }
5200 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5201
5202 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5203 apex_set {
5204 name: "com.company.android.myapex",
5205 apex_name: "com.android.myapex",
5206 set: "company-myapex.apks",
5207 filename: "some-random-suffix"
5208 }
5209 `)
5210}
5211
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005212func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005213 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005214 prebuilt_apex {
5215 name: "myapex.prebuilt",
5216 src: "myapex-arm.apex",
5217 overrides: [
5218 "myapex",
5219 ],
5220 }
5221 `)
5222
Wei Li340ee8e2022-03-18 17:33:24 -07005223 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5224 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005225
5226 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005227 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005228 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005229 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005230 }
Wei Li340ee8e2022-03-18 17:33:24 -07005231 rule := testingModule.Rule("genProvenanceMetaData")
5232 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5233 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5234 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5235 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005236}
5237
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005238func TestPrebuiltApexName(t *testing.T) {
5239 testApex(t, `
5240 prebuilt_apex {
5241 name: "com.company.android.myapex",
5242 apex_name: "com.android.myapex",
5243 src: "company-myapex-arm.apex",
5244 }
5245 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5246
5247 testApex(t, `
5248 apex_set {
5249 name: "com.company.android.myapex",
5250 apex_name: "com.android.myapex",
5251 set: "company-myapex.apks",
5252 }
5253 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5254}
5255
5256func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5257 _ = android.GroupFixturePreparers(
5258 java.PrepareForTestWithJavaDefaultModules,
5259 PrepareForTestWithApexBuildComponents,
5260 android.FixtureWithRootAndroidBp(`
5261 platform_bootclasspath {
5262 name: "platform-bootclasspath",
5263 fragments: [
5264 {
5265 apex: "com.android.art",
5266 module: "art-bootclasspath-fragment",
5267 },
5268 ],
5269 }
5270
5271 prebuilt_apex {
5272 name: "com.company.android.art",
5273 apex_name: "com.android.art",
5274 src: "com.company.android.art-arm.apex",
5275 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5276 }
5277
5278 prebuilt_bootclasspath_fragment {
5279 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005280 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005281 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005282 hidden_api: {
5283 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5284 metadata: "my-bootclasspath-fragment/metadata.csv",
5285 index: "my-bootclasspath-fragment/index.csv",
5286 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5287 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5288 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005289 }
5290
5291 java_import {
5292 name: "core-oj",
5293 jars: ["prebuilt.jar"],
5294 }
5295 `),
5296 ).RunTest(t)
5297}
5298
Paul Duffin092153d2021-01-26 11:42:39 +00005299// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5300// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005301func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005302 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005303
Paul Duffin89886cb2021-02-05 16:44:03 +00005304 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005305 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005306 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005307 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005308 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005309 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005310 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5311 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5312 android.NormalizePathForTesting(dexJarBuildPath))
5313 }
5314
5315 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005316 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005317 // Make sure the import has been given the correct path to the dex jar.
5318 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5319 dexJarBuildPath := p.DexJarInstallPath()
5320 stem := android.RemoveOptionalPrebuiltPrefix(name)
5321 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5322 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5323 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005324 }
5325
Paul Duffin39853512021-02-26 11:09:39 +00005326 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005327 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005328 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005329 android.AssertArrayString(t, "Check if there is no source variant",
5330 []string{"android_common"},
5331 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005332 }
5333
5334 t.Run("prebuilt only", func(t *testing.T) {
5335 bp := `
5336 prebuilt_apex {
5337 name: "myapex",
5338 arch: {
5339 arm64: {
5340 src: "myapex-arm64.apex",
5341 },
5342 arm: {
5343 src: "myapex-arm.apex",
5344 },
5345 },
Paul Duffin39853512021-02-26 11:09:39 +00005346 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005347 }
5348
5349 java_import {
5350 name: "libfoo",
5351 jars: ["libfoo.jar"],
5352 }
Paul Duffin39853512021-02-26 11:09:39 +00005353
5354 java_sdk_library_import {
5355 name: "libbar",
5356 public: {
5357 jars: ["libbar.jar"],
5358 },
5359 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005360 `
5361
5362 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5363 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5364
Martin Stjernholm44825602021-09-17 01:44:12 +01005365 deapexerName := deapexerModuleName("myapex")
5366 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5367
Paul Duffinf6932af2021-02-26 18:21:56 +00005368 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005369 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005370 rule := deapexer.Rule("deapexer")
5371 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5372 t.Errorf("expected: %q, found: %q", expected, actual)
5373 }
5374
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005375 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005376 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005377 rule = prebuiltApex.Rule("android/soong/android.Cp")
5378 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5379 t.Errorf("expected: %q, found: %q", expected, actual)
5380 }
5381
Paul Duffin89886cb2021-02-05 16:44:03 +00005382 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005384
5385 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005386 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005387 })
5388
5389 t.Run("prebuilt with source preferred", func(t *testing.T) {
5390
5391 bp := `
5392 prebuilt_apex {
5393 name: "myapex",
5394 arch: {
5395 arm64: {
5396 src: "myapex-arm64.apex",
5397 },
5398 arm: {
5399 src: "myapex-arm.apex",
5400 },
5401 },
Paul Duffin39853512021-02-26 11:09:39 +00005402 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005403 }
5404
5405 java_import {
5406 name: "libfoo",
5407 jars: ["libfoo.jar"],
5408 }
5409
5410 java_library {
5411 name: "libfoo",
5412 }
Paul Duffin39853512021-02-26 11:09:39 +00005413
5414 java_sdk_library_import {
5415 name: "libbar",
5416 public: {
5417 jars: ["libbar.jar"],
5418 },
5419 }
5420
5421 java_sdk_library {
5422 name: "libbar",
5423 srcs: ["foo/bar/MyClass.java"],
5424 unsafe_ignore_missing_latest_api: true,
5425 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005426 `
5427
5428 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5429 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5430
Paul Duffin89886cb2021-02-05 16:44:03 +00005431 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005432 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005433 ensureNoSourceVariant(t, ctx, "libfoo")
5434
5435 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005436 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005437 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005438 })
5439
5440 t.Run("prebuilt preferred with source", func(t *testing.T) {
5441 bp := `
5442 prebuilt_apex {
5443 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005444 arch: {
5445 arm64: {
5446 src: "myapex-arm64.apex",
5447 },
5448 arm: {
5449 src: "myapex-arm.apex",
5450 },
5451 },
Paul Duffin39853512021-02-26 11:09:39 +00005452 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005453 }
5454
5455 java_import {
5456 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005457 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005458 jars: ["libfoo.jar"],
5459 }
5460
5461 java_library {
5462 name: "libfoo",
5463 }
Paul Duffin39853512021-02-26 11:09:39 +00005464
5465 java_sdk_library_import {
5466 name: "libbar",
5467 prefer: true,
5468 public: {
5469 jars: ["libbar.jar"],
5470 },
5471 }
5472
5473 java_sdk_library {
5474 name: "libbar",
5475 srcs: ["foo/bar/MyClass.java"],
5476 unsafe_ignore_missing_latest_api: true,
5477 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005478 `
5479
5480 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5481 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5482
Paul Duffin89886cb2021-02-05 16:44:03 +00005483 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005484 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005485 ensureNoSourceVariant(t, ctx, "libfoo")
5486
5487 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005488 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005489 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005490 })
5491}
5492
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005493func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005494 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005495 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005496 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5497 // is disabled.
5498 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5499 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005500
Paul Duffin37856732021-02-26 14:24:15 +00005501 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5502 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005503 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005505 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005506 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005507 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 foundLibfooJar = true
5509 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005510 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 }
5512 }
5513 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005514 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 +00005515 }
5516 }
5517
Paul Duffin40a3f652021-07-19 13:11:24 +01005518 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005519 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005520 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005521 var rule android.TestingBuildParams
5522
5523 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5524 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005525 }
5526
Paul Duffin40a3f652021-07-19 13:11:24 +01005527 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5528 t.Helper()
5529 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5530 var rule android.TestingBuildParams
5531
5532 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5533 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5534 }
5535
Paul Duffin89f570a2021-06-16 01:42:33 +01005536 fragment := java.ApexVariantReference{
5537 Apex: proptools.StringPtr("myapex"),
5538 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5539 }
5540
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005541 t.Run("prebuilt only", func(t *testing.T) {
5542 bp := `
5543 prebuilt_apex {
5544 name: "myapex",
5545 arch: {
5546 arm64: {
5547 src: "myapex-arm64.apex",
5548 },
5549 arm: {
5550 src: "myapex-arm.apex",
5551 },
5552 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005553 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5554 }
5555
5556 prebuilt_bootclasspath_fragment {
5557 name: "my-bootclasspath-fragment",
5558 contents: ["libfoo", "libbar"],
5559 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005560 hidden_api: {
5561 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5562 metadata: "my-bootclasspath-fragment/metadata.csv",
5563 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005564 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5565 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5566 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005567 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005568 }
5569
5570 java_import {
5571 name: "libfoo",
5572 jars: ["libfoo.jar"],
5573 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005574 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005575 }
Paul Duffin37856732021-02-26 14:24:15 +00005576
5577 java_sdk_library_import {
5578 name: "libbar",
5579 public: {
5580 jars: ["libbar.jar"],
5581 },
5582 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005583 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005584 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005585 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005586 `
5587
Paul Duffin89f570a2021-06-16 01:42:33 +01005588 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005589 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5590 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005591
Paul Duffin537ea3d2021-05-14 10:38:00 +01005592 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005593 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005594 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005595 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005596 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5597 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 })
5599
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005600 t.Run("apex_set only", func(t *testing.T) {
5601 bp := `
5602 apex_set {
5603 name: "myapex",
5604 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005605 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005606 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005607 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5608 }
5609
5610 java_import {
5611 name: "myjavalib",
5612 jars: ["myjavalib.jar"],
5613 apex_available: ["myapex"],
5614 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005615 }
5616
5617 prebuilt_bootclasspath_fragment {
5618 name: "my-bootclasspath-fragment",
5619 contents: ["libfoo", "libbar"],
5620 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005621 hidden_api: {
5622 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5623 metadata: "my-bootclasspath-fragment/metadata.csv",
5624 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005625 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5626 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5627 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005628 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005629 }
5630
Liz Kammer2dc72442023-04-20 10:10:48 -04005631 prebuilt_systemserverclasspath_fragment {
5632 name: "my-systemserverclasspath-fragment",
5633 contents: ["libbaz"],
5634 apex_available: ["myapex"],
5635 }
5636
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005637 java_import {
5638 name: "libfoo",
5639 jars: ["libfoo.jar"],
5640 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005641 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005642 }
5643
5644 java_sdk_library_import {
5645 name: "libbar",
5646 public: {
5647 jars: ["libbar.jar"],
5648 },
5649 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005650 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005651 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005652 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005653
5654 java_sdk_library_import {
5655 name: "libbaz",
5656 public: {
5657 jars: ["libbaz.jar"],
5658 },
5659 apex_available: ["myapex"],
5660 shared_library: false,
5661 permitted_packages: ["baz"],
5662 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005663 `
5664
Paul Duffin89f570a2021-06-16 01:42:33 +01005665 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005666 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5667 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5668
Paul Duffin537ea3d2021-05-14 10:38:00 +01005669 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005670 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005671 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005672 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005673 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5674 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005675
5676 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5677
5678 overrideNames := []string{
5679 "",
5680 "myjavalib.myapex",
5681 "libfoo.myapex",
5682 "libbar.myapex",
5683 "libbaz.myapex",
5684 }
5685 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5686 for i, e := range mkEntries {
5687 g := e.OverrideName
5688 if w := overrideNames[i]; w != g {
5689 t.Errorf("Expected override name %q, got %q", w, g)
5690 }
5691 }
5692
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005693 })
5694
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005695 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5696 bp := `
5697 prebuilt_apex {
5698 name: "myapex",
5699 arch: {
5700 arm64: {
5701 src: "myapex-arm64.apex",
5702 },
5703 arm: {
5704 src: "myapex-arm.apex",
5705 },
5706 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005707 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5708 }
5709
5710 prebuilt_bootclasspath_fragment {
5711 name: "my-bootclasspath-fragment",
5712 contents: ["libfoo", "libbar"],
5713 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005714 hidden_api: {
5715 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5716 metadata: "my-bootclasspath-fragment/metadata.csv",
5717 index: "my-bootclasspath-fragment/index.csv",
5718 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5719 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5720 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005721 }
5722
5723 java_import {
5724 name: "libfoo",
5725 jars: ["libfoo.jar"],
5726 apex_available: ["myapex"],
5727 }
5728
5729 java_library {
5730 name: "libfoo",
5731 srcs: ["foo/bar/MyClass.java"],
5732 apex_available: ["myapex"],
5733 }
Paul Duffin37856732021-02-26 14:24:15 +00005734
5735 java_sdk_library_import {
5736 name: "libbar",
5737 public: {
5738 jars: ["libbar.jar"],
5739 },
5740 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005741 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005742 }
5743
5744 java_sdk_library {
5745 name: "libbar",
5746 srcs: ["foo/bar/MyClass.java"],
5747 unsafe_ignore_missing_latest_api: true,
5748 apex_available: ["myapex"],
5749 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005750 `
5751
5752 // In this test the source (java_library) libfoo is active since the
5753 // prebuilt (java_import) defaults to prefer:false. However the
5754 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5755 // find the dex boot jar in it. We either need to disable the source libfoo
5756 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005757 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005758 // dexbootjar check is skipped if AllowMissingDependencies is true
5759 preparerAllowMissingDeps := android.GroupFixturePreparers(
5760 preparer,
5761 android.PrepareForTestWithAllowMissingDependencies,
5762 )
5763 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005764 })
5765
5766 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5767 bp := `
5768 prebuilt_apex {
5769 name: "myapex",
5770 arch: {
5771 arm64: {
5772 src: "myapex-arm64.apex",
5773 },
5774 arm: {
5775 src: "myapex-arm.apex",
5776 },
5777 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005778 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5779 }
5780
5781 prebuilt_bootclasspath_fragment {
5782 name: "my-bootclasspath-fragment",
5783 contents: ["libfoo", "libbar"],
5784 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005785 hidden_api: {
5786 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5787 metadata: "my-bootclasspath-fragment/metadata.csv",
5788 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005789 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5790 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5791 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005792 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005793 }
5794
5795 java_import {
5796 name: "libfoo",
5797 prefer: true,
5798 jars: ["libfoo.jar"],
5799 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005800 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005801 }
5802
5803 java_library {
5804 name: "libfoo",
5805 srcs: ["foo/bar/MyClass.java"],
5806 apex_available: ["myapex"],
5807 }
Paul Duffin37856732021-02-26 14:24:15 +00005808
5809 java_sdk_library_import {
5810 name: "libbar",
5811 prefer: true,
5812 public: {
5813 jars: ["libbar.jar"],
5814 },
5815 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005816 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005817 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005818 }
5819
5820 java_sdk_library {
5821 name: "libbar",
5822 srcs: ["foo/bar/MyClass.java"],
5823 unsafe_ignore_missing_latest_api: true,
5824 apex_available: ["myapex"],
5825 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005826 `
5827
Paul Duffin89f570a2021-06-16 01:42:33 +01005828 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005829 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5830 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005831
Paul Duffin537ea3d2021-05-14 10:38:00 +01005832 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005833 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005834 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005835 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005836 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5837 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005838 })
5839
5840 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5841 bp := `
5842 apex {
5843 name: "myapex",
5844 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005845 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005846 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005847 }
5848
5849 apex_key {
5850 name: "myapex.key",
5851 public_key: "testkey.avbpubkey",
5852 private_key: "testkey.pem",
5853 }
5854
5855 prebuilt_apex {
5856 name: "myapex",
5857 arch: {
5858 arm64: {
5859 src: "myapex-arm64.apex",
5860 },
5861 arm: {
5862 src: "myapex-arm.apex",
5863 },
5864 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005865 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5866 }
5867
5868 prebuilt_bootclasspath_fragment {
5869 name: "my-bootclasspath-fragment",
5870 contents: ["libfoo", "libbar"],
5871 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005872 hidden_api: {
5873 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5874 metadata: "my-bootclasspath-fragment/metadata.csv",
5875 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005876 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5877 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5878 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005879 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005880 }
5881
5882 java_import {
5883 name: "libfoo",
5884 jars: ["libfoo.jar"],
5885 apex_available: ["myapex"],
5886 }
5887
5888 java_library {
5889 name: "libfoo",
5890 srcs: ["foo/bar/MyClass.java"],
5891 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005892 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005893 }
Paul Duffin37856732021-02-26 14:24:15 +00005894
5895 java_sdk_library_import {
5896 name: "libbar",
5897 public: {
5898 jars: ["libbar.jar"],
5899 },
5900 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005901 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005902 }
5903
5904 java_sdk_library {
5905 name: "libbar",
5906 srcs: ["foo/bar/MyClass.java"],
5907 unsafe_ignore_missing_latest_api: true,
5908 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005909 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005910 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005911 `
5912
Paul Duffin89f570a2021-06-16 01:42:33 +01005913 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005914 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5915 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005916
Paul Duffin537ea3d2021-05-14 10:38:00 +01005917 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005918 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005919 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005920 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005921 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5922 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005923 })
5924
5925 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5926 bp := `
5927 apex {
5928 name: "myapex",
5929 enabled: false,
5930 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005931 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005932 }
5933
5934 apex_key {
5935 name: "myapex.key",
5936 public_key: "testkey.avbpubkey",
5937 private_key: "testkey.pem",
5938 }
5939
5940 prebuilt_apex {
5941 name: "myapex",
5942 arch: {
5943 arm64: {
5944 src: "myapex-arm64.apex",
5945 },
5946 arm: {
5947 src: "myapex-arm.apex",
5948 },
5949 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005950 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5951 }
5952
5953 prebuilt_bootclasspath_fragment {
5954 name: "my-bootclasspath-fragment",
5955 contents: ["libfoo", "libbar"],
5956 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005957 hidden_api: {
5958 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5959 metadata: "my-bootclasspath-fragment/metadata.csv",
5960 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005961 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5962 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5963 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005964 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005965 }
5966
5967 java_import {
5968 name: "libfoo",
5969 prefer: true,
5970 jars: ["libfoo.jar"],
5971 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005972 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005973 }
5974
5975 java_library {
5976 name: "libfoo",
5977 srcs: ["foo/bar/MyClass.java"],
5978 apex_available: ["myapex"],
5979 }
Paul Duffin37856732021-02-26 14:24:15 +00005980
5981 java_sdk_library_import {
5982 name: "libbar",
5983 prefer: true,
5984 public: {
5985 jars: ["libbar.jar"],
5986 },
5987 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005988 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005989 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005990 }
5991
5992 java_sdk_library {
5993 name: "libbar",
5994 srcs: ["foo/bar/MyClass.java"],
5995 unsafe_ignore_missing_latest_api: true,
5996 apex_available: ["myapex"],
5997 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005998 `
5999
Paul Duffin89f570a2021-06-16 01:42:33 +01006000 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006001 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6002 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006003
Paul Duffin537ea3d2021-05-14 10:38:00 +01006004 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006005 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006006 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006007 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006008 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
6009 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006010 })
6011}
6012
Roland Levillain630846d2019-06-26 12:48:34 +01006013func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006014 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006015 apex_test {
6016 name: "myapex",
6017 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006018 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006019 tests: [
6020 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006021 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006022 ],
6023 }
6024
6025 apex_key {
6026 name: "myapex.key",
6027 public_key: "testkey.avbpubkey",
6028 private_key: "testkey.pem",
6029 }
6030
Liz Kammer1c14a212020-05-12 15:26:55 -07006031 filegroup {
6032 name: "fg",
6033 srcs: [
6034 "baz",
6035 "bar/baz"
6036 ],
6037 }
6038
Roland Levillain630846d2019-06-26 12:48:34 +01006039 cc_test {
6040 name: "mytest",
6041 gtest: false,
6042 srcs: ["mytest.cpp"],
6043 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006044 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006045 system_shared_libs: [],
6046 static_executable: true,
6047 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006048 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006049 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006050
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006051 cc_library {
6052 name: "mylib",
6053 srcs: ["mylib.cpp"],
6054 system_shared_libs: [],
6055 stl: "none",
6056 }
6057
Liz Kammer5bd365f2020-05-27 15:15:11 -07006058 filegroup {
6059 name: "fg2",
6060 srcs: [
6061 "testdata/baz"
6062 ],
6063 }
6064
Roland Levillain9b5fde92019-06-28 15:41:19 +01006065 cc_test {
6066 name: "mytests",
6067 gtest: false,
6068 srcs: [
6069 "mytest1.cpp",
6070 "mytest2.cpp",
6071 "mytest3.cpp",
6072 ],
6073 test_per_src: true,
6074 relative_install_path: "test",
6075 system_shared_libs: [],
6076 static_executable: true,
6077 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006078 data: [
6079 ":fg",
6080 ":fg2",
6081 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006082 }
Roland Levillain630846d2019-06-26 12:48:34 +01006083 `)
6084
Sundong Ahnabb64432019-10-22 13:58:29 +09006085 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006086 copyCmds := apexRule.Args["copy_commands"]
6087
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006088 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006089 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006090 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006091
Liz Kammer1c14a212020-05-12 15:26:55 -07006092 //Ensure that test data are copied into apex.
6093 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6094 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6095
Roland Levillain9b5fde92019-06-28 15:41:19 +01006096 // Ensure that test deps built with `test_per_src` are copied into apex.
6097 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6098 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6099 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006100
6101 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006102 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006103 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006104 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006105 prefix := "TARGET_"
6106 var builder strings.Builder
6107 data.Custom(&builder, name, prefix, "", data)
6108 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006109 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6110 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6111 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6113 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006115 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006116
6117 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006118 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006119 data.Custom(&builder, name, prefix, "", data)
6120 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006121 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6122 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006123}
6124
Jooyung Hand48f3c32019-08-23 11:18:57 +09006125func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6126 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6127 apex {
6128 name: "myapex",
6129 key: "myapex.key",
6130 native_shared_libs: ["libfoo"],
6131 }
6132
6133 apex_key {
6134 name: "myapex.key",
6135 public_key: "testkey.avbpubkey",
6136 private_key: "testkey.pem",
6137 }
6138
6139 cc_library {
6140 name: "libfoo",
6141 stl: "none",
6142 system_shared_libs: [],
6143 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006144 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006145 }
6146 `)
6147 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6148 apex {
6149 name: "myapex",
6150 key: "myapex.key",
6151 java_libs: ["myjar"],
6152 }
6153
6154 apex_key {
6155 name: "myapex.key",
6156 public_key: "testkey.avbpubkey",
6157 private_key: "testkey.pem",
6158 }
6159
6160 java_library {
6161 name: "myjar",
6162 srcs: ["foo/bar/MyClass.java"],
6163 sdk_version: "none",
6164 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006165 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006166 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006167 }
6168 `)
6169}
6170
Bill Peckhama41a6962021-01-11 10:58:54 -08006171func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006172 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006173 apex {
6174 name: "myapex",
6175 key: "myapex.key",
6176 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006177 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006178 }
6179
6180 apex_key {
6181 name: "myapex.key",
6182 public_key: "testkey.avbpubkey",
6183 private_key: "testkey.pem",
6184 }
6185
6186 java_import {
6187 name: "myjavaimport",
6188 apex_available: ["myapex"],
6189 jars: ["my.jar"],
6190 compile_dex: true,
6191 }
6192 `)
6193
6194 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6195 apexRule := module.Rule("apexRule")
6196 copyCmds := apexRule.Args["copy_commands"]
6197 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6198}
6199
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006200func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006201 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 apps: [
6206 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006207 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006208 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006209 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006210 }
6211
6212 apex_key {
6213 name: "myapex.key",
6214 public_key: "testkey.avbpubkey",
6215 private_key: "testkey.pem",
6216 }
6217
6218 android_app {
6219 name: "AppFoo",
6220 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006221 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006222 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006223 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006224 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006225 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006226 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006227
6228 android_app {
6229 name: "AppFooPriv",
6230 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006231 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006232 system_modules: "none",
6233 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006234 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006235 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006236 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006237 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006238
6239 cc_library_shared {
6240 name: "libjni",
6241 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006242 shared_libs: ["libfoo"],
6243 stl: "none",
6244 system_shared_libs: [],
6245 apex_available: [ "myapex" ],
6246 sdk_version: "current",
6247 }
6248
6249 cc_library_shared {
6250 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006251 stl: "none",
6252 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006253 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006254 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006255 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006256 `)
6257
Sundong Ahnabb64432019-10-22 13:58:29 +09006258 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006259 apexRule := module.Rule("apexRule")
6260 copyCmds := apexRule.Args["copy_commands"]
6261
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006262 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6263 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006264 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006265
Colin Crossaede88c2020-08-11 12:17:01 -07006266 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006267 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006268 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006269 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006270 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006271 // JNI libraries including transitive deps are
6272 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006273 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006274 // ... embedded inside APK (jnilibs.zip)
6275 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6276 // ... and not directly inside the APEX
6277 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6278 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006279
6280 apexBundle := module.Module().(*apexBundle)
6281 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6282 var builder strings.Builder
6283 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6284 androidMk := builder.String()
6285 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6286 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6287 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6288 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6289 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6290 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006291}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006292
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006293func TestApexWithAppImportBuildId(t *testing.T) {
6294 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6295 for _, id := range invalidBuildIds {
6296 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6297 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6298 variables.BuildId = proptools.StringPtr(id)
6299 })
6300 testApexError(t, message, `apex {
6301 name: "myapex",
6302 key: "myapex.key",
6303 apps: ["AppFooPrebuilt"],
6304 updatable: false,
6305 }
6306
6307 apex_key {
6308 name: "myapex.key",
6309 public_key: "testkey.avbpubkey",
6310 private_key: "testkey.pem",
6311 }
6312
6313 android_app_import {
6314 name: "AppFooPrebuilt",
6315 apk: "PrebuiltAppFoo.apk",
6316 presigned: true,
6317 apex_available: ["myapex"],
6318 }
6319 `, fixture)
6320 }
6321}
6322
Dario Frenicde2a032019-10-27 00:29:22 +01006323func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006324 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006325 apex {
6326 name: "myapex",
6327 key: "myapex.key",
6328 apps: [
6329 "AppFooPrebuilt",
6330 "AppFooPrivPrebuilt",
6331 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006332 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006333 }
6334
6335 apex_key {
6336 name: "myapex.key",
6337 public_key: "testkey.avbpubkey",
6338 private_key: "testkey.pem",
6339 }
6340
6341 android_app_import {
6342 name: "AppFooPrebuilt",
6343 apk: "PrebuiltAppFoo.apk",
6344 presigned: true,
6345 dex_preopt: {
6346 enabled: false,
6347 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006348 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006349 }
6350
6351 android_app_import {
6352 name: "AppFooPrivPrebuilt",
6353 apk: "PrebuiltAppFooPriv.apk",
6354 privileged: true,
6355 presigned: true,
6356 dex_preopt: {
6357 enabled: false,
6358 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006359 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006360 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006361 }
6362 `)
6363
Sundong Ahnabb64432019-10-22 13:58:29 +09006364 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006365 apexRule := module.Rule("apexRule")
6366 copyCmds := apexRule.Args["copy_commands"]
6367
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006368 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6369 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006370}
6371
6372func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006373 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006374 apex {
6375 name: "myapex",
6376 key: "myapex.key",
6377 apps: [
6378 "AppFoo",
6379 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006380 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006381 }
6382
6383 apex_key {
6384 name: "myapex.key",
6385 public_key: "testkey.avbpubkey",
6386 private_key: "testkey.pem",
6387 }
6388
6389 android_app {
6390 name: "AppFoo",
6391 srcs: ["foo/bar/MyClass.java"],
6392 sdk_version: "none",
6393 system_modules: "none",
6394 apex_available: [ "myapex" ],
6395 }
6396
6397 android_app_import {
6398 name: "AppFoo",
6399 apk: "AppFooPrebuilt.apk",
6400 filename: "AppFooPrebuilt.apk",
6401 presigned: true,
6402 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006403 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006404 }
6405 `, withFiles(map[string][]byte{
6406 "AppFooPrebuilt.apk": nil,
6407 }))
6408
6409 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006410 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006411 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006412}
6413
Dario Freni6f3937c2019-12-20 22:58:03 +00006414func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006415 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006416 apex {
6417 name: "myapex",
6418 key: "myapex.key",
6419 apps: [
6420 "TesterHelpAppFoo",
6421 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006422 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006423 }
6424
6425 apex_key {
6426 name: "myapex.key",
6427 public_key: "testkey.avbpubkey",
6428 private_key: "testkey.pem",
6429 }
6430
6431 android_test_helper_app {
6432 name: "TesterHelpAppFoo",
6433 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006434 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006435 }
6436
6437 `)
6438
6439 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6440 apexRule := module.Rule("apexRule")
6441 copyCmds := apexRule.Args["copy_commands"]
6442
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006443 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006444}
6445
Jooyung Han18020ea2019-11-13 10:50:48 +09006446func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6447 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006448 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006449 apex {
6450 name: "myapex",
6451 key: "myapex.key",
6452 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006453 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006454 }
6455
6456 apex_key {
6457 name: "myapex.key",
6458 public_key: "testkey.avbpubkey",
6459 private_key: "testkey.pem",
6460 }
6461
6462 apex {
6463 name: "otherapex",
6464 key: "myapex.key",
6465 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006466 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006467 }
6468
6469 cc_defaults {
6470 name: "libfoo-defaults",
6471 apex_available: ["otherapex"],
6472 }
6473
6474 cc_library {
6475 name: "libfoo",
6476 defaults: ["libfoo-defaults"],
6477 stl: "none",
6478 system_shared_libs: [],
6479 }`)
6480}
6481
Paul Duffine52e66f2020-03-30 17:54:29 +01006482func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006483 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006484 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 apex {
6486 name: "myapex",
6487 key: "myapex.key",
6488 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006489 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006490 }
6491
6492 apex_key {
6493 name: "myapex.key",
6494 public_key: "testkey.avbpubkey",
6495 private_key: "testkey.pem",
6496 }
6497
6498 apex {
6499 name: "otherapex",
6500 key: "otherapex.key",
6501 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006502 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006503 }
6504
6505 apex_key {
6506 name: "otherapex.key",
6507 public_key: "testkey.avbpubkey",
6508 private_key: "testkey.pem",
6509 }
6510
6511 cc_library {
6512 name: "libfoo",
6513 stl: "none",
6514 system_shared_libs: [],
6515 apex_available: ["otherapex"],
6516 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006517}
Jiyong Park127b40b2019-09-30 16:04:35 +09006518
Paul Duffine52e66f2020-03-30 17:54:29 +01006519func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006520 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006521 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006522.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006523.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006524.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006525.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006526.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006527.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006528 apex {
6529 name: "myapex",
6530 key: "myapex.key",
6531 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006532 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006533 }
6534
6535 apex_key {
6536 name: "myapex.key",
6537 public_key: "testkey.avbpubkey",
6538 private_key: "testkey.pem",
6539 }
6540
Jiyong Park127b40b2019-09-30 16:04:35 +09006541 cc_library {
6542 name: "libfoo",
6543 stl: "none",
6544 shared_libs: ["libbar"],
6545 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006546 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006547 }
6548
6549 cc_library {
6550 name: "libbar",
6551 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006552 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006553 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006554 apex_available: ["myapex"],
6555 }
6556
6557 cc_library {
6558 name: "libbaz",
6559 stl: "none",
6560 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006562}
Jiyong Park127b40b2019-09-30 16:04:35 +09006563
Liz Kammer5f108fa2023-05-11 14:33:17 -04006564func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6565 testApex(t, `
6566 apex {
6567 name: "myapex",
6568 key: "myapex.key",
6569 native_shared_libs: ["libfoo"],
6570 updatable: false,
6571 }
6572
6573 apex_key {
6574 name: "myapex.key",
6575 public_key: "testkey.avbpubkey",
6576 private_key: "testkey.pem",
6577 }
6578
6579 cc_library {
6580 name: "libfoo",
6581 stl: "none",
6582 static_libs: ["libbar"],
6583 system_shared_libs: [],
6584 apex_available: ["myapex"],
6585 }
6586
6587 cc_library {
6588 name: "libbar",
6589 stl: "none",
6590 shared_libs: ["libbaz"],
6591 system_shared_libs: [],
6592 apex_available: ["myapex"],
6593 }
6594
6595 cc_library {
6596 name: "libbaz",
6597 stl: "none",
6598 system_shared_libs: [],
6599 }`)
6600
6601 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6602 apex {
6603 name: "myapex",
6604 key: "myapex.key",
6605 native_shared_libs: ["libfoo"],
6606 updatable: false,
6607 }
6608
6609 apex_key {
6610 name: "myapex.key",
6611 public_key: "testkey.avbpubkey",
6612 private_key: "testkey.pem",
6613 }
6614
6615 cc_library {
6616 name: "libfoo",
6617 stl: "none",
6618 static_libs: ["libbar"],
6619 system_shared_libs: [],
6620 apex_available: ["myapex"],
6621 }
6622
6623 cc_library {
6624 name: "libbar",
6625 stl: "none",
6626 system_shared_libs: [],
6627 }`)
6628}
6629
Paul Duffine52e66f2020-03-30 17:54:29 +01006630func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006631 testApexError(t, "\"otherapex\" is not a valid module name", `
6632 apex {
6633 name: "myapex",
6634 key: "myapex.key",
6635 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006636 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006637 }
6638
6639 apex_key {
6640 name: "myapex.key",
6641 public_key: "testkey.avbpubkey",
6642 private_key: "testkey.pem",
6643 }
6644
6645 cc_library {
6646 name: "libfoo",
6647 stl: "none",
6648 system_shared_libs: [],
6649 apex_available: ["otherapex"],
6650 }`)
6651
Paul Duffine52e66f2020-03-30 17:54:29 +01006652 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
6656 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006657 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006658 }
6659
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }
6665
6666 cc_library {
6667 name: "libfoo",
6668 stl: "none",
6669 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006670 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006671 apex_available: ["myapex"],
6672 }
6673
6674 cc_library {
6675 name: "libbar",
6676 stl: "none",
6677 system_shared_libs: [],
6678 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006679 }
6680
6681 cc_library {
6682 name: "libbaz",
6683 stl: "none",
6684 system_shared_libs: [],
6685 stubs: {
6686 versions: ["10", "20", "30"],
6687 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006688 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006689}
Jiyong Park127b40b2019-09-30 16:04:35 +09006690
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006691func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6692 t.Run("negative variant_version produces error", func(t *testing.T) {
6693 testApexError(t, "expected an integer between 0-9; got -1", `
6694 apex {
6695 name: "myapex",
6696 key: "myapex.key",
6697 apex_available_name: "com.android.foo",
6698 variant_version: "-1",
6699 updatable: false,
6700 }
6701 apex_key {
6702 name: "myapex.key",
6703 public_key: "testkey.avbpubkey",
6704 private_key: "testkey.pem",
6705 }
6706 `)
6707 })
6708
6709 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6710 testApexError(t, "expected an integer between 0-9; got 10", `
6711 apex {
6712 name: "myapex",
6713 key: "myapex.key",
6714 apex_available_name: "com.android.foo",
6715 variant_version: "10",
6716 updatable: false,
6717 }
6718 apex_key {
6719 name: "myapex.key",
6720 public_key: "testkey.avbpubkey",
6721 private_key: "testkey.pem",
6722 }
6723 `)
6724 })
6725}
6726
6727func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6728 context := android.GroupFixturePreparers(
6729 android.PrepareForIntegrationTestWithAndroid,
6730 PrepareForTestWithApexBuildComponents,
6731 android.FixtureMergeMockFs(android.MockFS{
6732 "system/sepolicy/apex/foo-file_contexts": nil,
6733 "system/sepolicy/apex/bar-file_contexts": nil,
6734 }),
6735 )
6736 result := context.RunTestWithBp(t, `
6737 apex {
6738 name: "foo",
6739 key: "myapex.key",
6740 apex_available_name: "com.android.foo",
6741 variant_version: "0",
6742 updatable: false,
6743 }
6744 apex {
6745 name: "bar",
6746 key: "myapex.key",
6747 apex_available_name: "com.android.foo",
6748 variant_version: "3",
6749 updatable: false,
6750 }
6751 apex_key {
6752 name: "myapex.key",
6753 public_key: "testkey.avbpubkey",
6754 private_key: "testkey.pem",
6755 }
6756 `)
6757
6758 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6759 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6760 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6761 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6762 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6763 }
6764
6765 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6766 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6767 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6768 barActualDefaultVersion := barManifestRule.Args["default_version"]
6769 if barActualDefaultVersion != barExpectedDefaultVersion {
6770 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6771 }
6772}
6773
Sam Delmericoca816532023-06-02 14:09:50 -04006774func TestApexAvailable_ApexAvailableName(t *testing.T) {
6775 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6776 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6777 apex {
6778 name: "myapex_sminus",
6779 key: "myapex.key",
6780 apps: ["AppFoo"],
6781 apex_available_name: "myapex",
6782 updatable: false,
6783 }
6784 apex {
6785 name: "myapex",
6786 key: "myapex.key",
6787 apps: ["AppFoo"],
6788 updatable: false,
6789 }
6790 apex_key {
6791 name: "myapex.key",
6792 public_key: "testkey.avbpubkey",
6793 private_key: "testkey.pem",
6794 }
6795 android_app {
6796 name: "AppFoo",
6797 srcs: ["foo/bar/MyClass.java"],
6798 sdk_version: "none",
6799 system_modules: "none",
6800 apex_available: [ "myapex_sminus" ],
6801 }`,
6802 android.FixtureMergeMockFs(android.MockFS{
6803 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6804 }),
6805 )
6806 })
6807
6808 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6809 testApex(t, `
6810 apex {
6811 name: "myapex_sminus",
6812 key: "myapex.key",
6813 apps: ["AppFoo"],
6814 apex_available_name: "myapex",
6815 updatable: false,
6816 }
6817 apex {
6818 name: "myapex",
6819 key: "myapex.key",
6820 apps: ["AppFoo"],
6821 updatable: false,
6822 }
6823 apex_key {
6824 name: "myapex.key",
6825 public_key: "testkey.avbpubkey",
6826 private_key: "testkey.pem",
6827 }
6828 android_app {
6829 name: "AppFoo",
6830 srcs: ["foo/bar/MyClass.java"],
6831 sdk_version: "none",
6832 system_modules: "none",
6833 apex_available: [ "myapex" ],
6834 }`,
6835 android.FixtureMergeMockFs(android.MockFS{
6836 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6837 }),
6838 )
6839 })
6840
6841 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6842 testApex(t, `
6843 override_apex {
6844 name: "myoverrideapex_sminus",
6845 base: "myapex_sminus",
6846 key: "myapex.key",
6847 apps: ["AppFooOverride"],
6848 }
6849 override_apex {
6850 name: "myoverrideapex",
6851 base: "myapex",
6852 key: "myapex.key",
6853 apps: ["AppFooOverride"],
6854 }
6855 apex {
6856 name: "myapex_sminus",
6857 key: "myapex.key",
6858 apps: ["AppFoo"],
6859 apex_available_name: "myapex",
6860 updatable: false,
6861 }
6862 apex {
6863 name: "myapex",
6864 key: "myapex.key",
6865 apps: ["AppFoo"],
6866 updatable: false,
6867 }
6868 apex_key {
6869 name: "myapex.key",
6870 public_key: "testkey.avbpubkey",
6871 private_key: "testkey.pem",
6872 }
6873 android_app {
6874 name: "AppFooOverride",
6875 srcs: ["foo/bar/MyClass.java"],
6876 sdk_version: "none",
6877 system_modules: "none",
6878 apex_available: [ "myapex" ],
6879 }
6880 android_app {
6881 name: "AppFoo",
6882 srcs: ["foo/bar/MyClass.java"],
6883 sdk_version: "none",
6884 system_modules: "none",
6885 apex_available: [ "myapex" ],
6886 }`,
6887 android.FixtureMergeMockFs(android.MockFS{
6888 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6889 }),
6890 )
6891 })
6892}
6893
6894func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6895 context := android.GroupFixturePreparers(
6896 android.PrepareForIntegrationTestWithAndroid,
6897 PrepareForTestWithApexBuildComponents,
6898 java.PrepareForTestWithDexpreopt,
6899 android.FixtureMergeMockFs(android.MockFS{
6900 "system/sepolicy/apex/myapex-file_contexts": nil,
6901 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6902 }),
6903 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6904 variables.BuildId = proptools.StringPtr("buildid")
6905 }),
6906 )
6907 context.RunTestWithBp(t, `
6908 override_apex {
6909 name: "myoverrideapex_sminus",
6910 base: "myapex_sminus",
6911 }
6912 override_apex {
6913 name: "myoverrideapex",
6914 base: "myapex",
6915 }
6916 apex {
6917 name: "myapex",
6918 key: "myapex.key",
6919 apps: ["AppFoo"],
6920 updatable: false,
6921 }
6922 apex {
6923 name: "myapex_sminus",
6924 apex_available_name: "myapex",
6925 key: "myapex.key",
6926 apps: ["AppFoo_sminus"],
6927 updatable: false,
6928 }
6929 apex_key {
6930 name: "myapex.key",
6931 public_key: "testkey.avbpubkey",
6932 private_key: "testkey.pem",
6933 }
6934 android_app {
6935 name: "AppFoo",
6936 srcs: ["foo/bar/MyClass.java"],
6937 sdk_version: "none",
6938 system_modules: "none",
6939 apex_available: [ "myapex" ],
6940 }
6941 android_app {
6942 name: "AppFoo_sminus",
6943 srcs: ["foo/bar/MyClass.java"],
6944 sdk_version: "none",
6945 min_sdk_version: "29",
6946 system_modules: "none",
6947 apex_available: [ "myapex" ],
6948 }`)
6949}
6950
Jiyong Park89e850a2020-04-07 16:37:39 +09006951func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006952 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006953 apex {
6954 name: "myapex",
6955 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006956 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006957 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006958 }
6959
6960 apex_key {
6961 name: "myapex.key",
6962 public_key: "testkey.avbpubkey",
6963 private_key: "testkey.pem",
6964 }
6965
6966 cc_library {
6967 name: "libfoo",
6968 stl: "none",
6969 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006970 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006971 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006972 }
6973
6974 cc_library {
6975 name: "libfoo2",
6976 stl: "none",
6977 system_shared_libs: [],
6978 shared_libs: ["libbaz"],
6979 apex_available: ["//apex_available:platform"],
6980 }
6981
6982 cc_library {
6983 name: "libbar",
6984 stl: "none",
6985 system_shared_libs: [],
6986 apex_available: ["myapex"],
6987 }
6988
6989 cc_library {
6990 name: "libbaz",
6991 stl: "none",
6992 system_shared_libs: [],
6993 apex_available: ["myapex"],
6994 stubs: {
6995 versions: ["1"],
6996 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006997 }`)
6998
Jiyong Park89e850a2020-04-07 16:37:39 +09006999 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7000 // because it depends on libbar which isn't available to platform
7001 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7002 if libfoo.NotAvailableForPlatform() != true {
7003 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7004 }
7005
7006 // libfoo2 however can be available to platform because it depends on libbaz which provides
7007 // stubs
7008 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7009 if libfoo2.NotAvailableForPlatform() == true {
7010 t.Errorf("%q should be available to platform", libfoo2.String())
7011 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007012}
Jiyong Parka90ca002019-10-07 15:47:24 +09007013
Paul Duffine52e66f2020-03-30 17:54:29 +01007014func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007015 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007016 apex {
7017 name: "myapex",
7018 key: "myapex.key",
7019 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007020 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007021 }
7022
7023 apex_key {
7024 name: "myapex.key",
7025 public_key: "testkey.avbpubkey",
7026 private_key: "testkey.pem",
7027 }
7028
7029 cc_library {
7030 name: "libfoo",
7031 stl: "none",
7032 system_shared_libs: [],
7033 apex_available: ["myapex"],
7034 static: {
7035 apex_available: ["//apex_available:platform"],
7036 },
7037 }`)
7038
Jiyong Park89e850a2020-04-07 16:37:39 +09007039 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7040 if libfooShared.NotAvailableForPlatform() != true {
7041 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7042 }
7043 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7044 if libfooStatic.NotAvailableForPlatform() != false {
7045 t.Errorf("%q should be available to platform", libfooStatic.String())
7046 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007047}
7048
Jiyong Park5d790c32019-11-15 18:40:32 +09007049func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007050 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007051 apex {
7052 name: "myapex",
7053 key: "myapex.key",
7054 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007055 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007056 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007057 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007058 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007059 }
7060
7061 override_apex {
7062 name: "override_myapex",
7063 base: "myapex",
7064 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007065 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007066 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007067 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007068 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007069 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007070 key: "mynewapex.key",
7071 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007072 }
7073
7074 apex_key {
7075 name: "myapex.key",
7076 public_key: "testkey.avbpubkey",
7077 private_key: "testkey.pem",
7078 }
7079
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007080 apex_key {
7081 name: "mynewapex.key",
7082 public_key: "testkey2.avbpubkey",
7083 private_key: "testkey2.pem",
7084 }
7085
7086 android_app_certificate {
7087 name: "myapex.certificate",
7088 certificate: "testkey",
7089 }
7090
Jiyong Park5d790c32019-11-15 18:40:32 +09007091 android_app {
7092 name: "app",
7093 srcs: ["foo/bar/MyClass.java"],
7094 package_name: "foo",
7095 sdk_version: "none",
7096 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007097 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007098 }
7099
7100 override_android_app {
7101 name: "override_app",
7102 base: "app",
7103 package_name: "bar",
7104 }
markchien7c803b82021-08-26 22:10:06 +08007105
7106 bpf {
7107 name: "bpf",
7108 srcs: ["bpf.c"],
7109 }
7110
7111 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007112 name: "overrideBpf",
7113 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007114 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007115
7116 prebuilt_etc {
7117 name: "myetc",
7118 src: "myprebuilt",
7119 }
7120
7121 prebuilt_etc {
7122 name: "override_myetc",
7123 src: "override_myprebuilt",
7124 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007125 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007126
Jiyong Park317645e2019-12-05 13:20:58 +09007127 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7128 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7129 if originalVariant.GetOverriddenBy() != "" {
7130 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7131 }
7132 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7133 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7134 }
7135
Jiyong Park5d790c32019-11-15 18:40:32 +09007136 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7137 apexRule := module.Rule("apexRule")
7138 copyCmds := apexRule.Args["copy_commands"]
7139
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007140 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7141 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007142
markchien7c803b82021-08-26 22:10:06 +08007143 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007144 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007145
Daniel Norman5a3ce132021-08-26 15:44:43 -07007146 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7147 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7148
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007149 apexBundle := module.Module().(*apexBundle)
7150 name := apexBundle.Name()
7151 if name != "override_myapex" {
7152 t.Errorf("name should be \"override_myapex\", but was %q", name)
7153 }
7154
Baligh Uddin004d7172020-02-19 21:29:28 -08007155 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7156 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7157 }
7158
Jiyong Park20bacab2020-03-03 11:45:41 +09007159 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007160 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007161 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7162
7163 signApkRule := module.Rule("signapk")
7164 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007165
Colin Crossaa255532020-07-03 13:18:24 -07007166 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007167 var builder strings.Builder
7168 data.Custom(&builder, name, "TARGET_", "", data)
7169 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007170 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7171 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
7172 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007173 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007174 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007175 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007176 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007177 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007178 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
7179 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007180}
7181
Albert Martineefabcf2022-03-21 20:11:16 +00007182func TestMinSdkVersionOverride(t *testing.T) {
7183 // Override from 29 to 31
7184 minSdkOverride31 := "31"
7185 ctx := testApex(t, `
7186 apex {
7187 name: "myapex",
7188 key: "myapex.key",
7189 native_shared_libs: ["mylib"],
7190 updatable: true,
7191 min_sdk_version: "29"
7192 }
7193
7194 override_apex {
7195 name: "override_myapex",
7196 base: "myapex",
7197 logging_parent: "com.foo.bar",
7198 package_name: "test.overridden.package"
7199 }
7200
7201 apex_key {
7202 name: "myapex.key",
7203 public_key: "testkey.avbpubkey",
7204 private_key: "testkey.pem",
7205 }
7206
7207 cc_library {
7208 name: "mylib",
7209 srcs: ["mylib.cpp"],
7210 runtime_libs: ["libbar"],
7211 system_shared_libs: [],
7212 stl: "none",
7213 apex_available: [ "myapex" ],
7214 min_sdk_version: "apex_inherit"
7215 }
7216
7217 cc_library {
7218 name: "libbar",
7219 srcs: ["mylib.cpp"],
7220 system_shared_libs: [],
7221 stl: "none",
7222 apex_available: [ "myapex" ],
7223 min_sdk_version: "apex_inherit"
7224 }
7225
7226 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7227
7228 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7229 copyCmds := apexRule.Args["copy_commands"]
7230
7231 // Ensure that direct non-stubs dep is always included
7232 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7233
7234 // Ensure that runtime_libs dep in included
7235 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7236
7237 // Ensure libraries target overridden min_sdk_version value
7238 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7239}
7240
7241func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7242 // Attempt to override from 31 to 29, should be a NOOP
7243 minSdkOverride29 := "29"
7244 ctx := testApex(t, `
7245 apex {
7246 name: "myapex",
7247 key: "myapex.key",
7248 native_shared_libs: ["mylib"],
7249 updatable: true,
7250 min_sdk_version: "31"
7251 }
7252
7253 override_apex {
7254 name: "override_myapex",
7255 base: "myapex",
7256 logging_parent: "com.foo.bar",
7257 package_name: "test.overridden.package"
7258 }
7259
7260 apex_key {
7261 name: "myapex.key",
7262 public_key: "testkey.avbpubkey",
7263 private_key: "testkey.pem",
7264 }
7265
7266 cc_library {
7267 name: "mylib",
7268 srcs: ["mylib.cpp"],
7269 runtime_libs: ["libbar"],
7270 system_shared_libs: [],
7271 stl: "none",
7272 apex_available: [ "myapex" ],
7273 min_sdk_version: "apex_inherit"
7274 }
7275
7276 cc_library {
7277 name: "libbar",
7278 srcs: ["mylib.cpp"],
7279 system_shared_libs: [],
7280 stl: "none",
7281 apex_available: [ "myapex" ],
7282 min_sdk_version: "apex_inherit"
7283 }
7284
7285 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7286
7287 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7288 copyCmds := apexRule.Args["copy_commands"]
7289
7290 // Ensure that direct non-stubs dep is always included
7291 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7292
7293 // Ensure that runtime_libs dep in included
7294 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7295
7296 // Ensure libraries target the original min_sdk_version value rather than the overridden
7297 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7298}
7299
Jooyung Han214bf372019-11-12 13:03:50 +09007300func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007301 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007302 apex {
7303 name: "myapex",
7304 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007305 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007306 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007314
7315 cc_library {
7316 name: "mylib",
7317 srcs: ["mylib.cpp"],
7318 stl: "libc++",
7319 system_shared_libs: [],
7320 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007321 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007322 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007323 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007324
7325 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7326 args := module.Rule("apexRule").Args
7327 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007328 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007329
7330 // The copies of the libraries in the apex should have one more dependency than
7331 // the ones outside the apex, namely the unwinder. Ideally we should check
7332 // the dependency names directly here but for some reason the names are blank in
7333 // this test.
7334 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007335 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007336 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7337 if len(apexImplicits) != len(nonApexImplicits)+1 {
7338 t.Errorf("%q missing unwinder dep", lib)
7339 }
7340 }
Jooyung Han214bf372019-11-12 13:03:50 +09007341}
7342
Paul Duffine05480a2021-03-08 15:07:14 +00007343var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007344 "api/current.txt": nil,
7345 "api/removed.txt": nil,
7346 "api/system-current.txt": nil,
7347 "api/system-removed.txt": nil,
7348 "api/test-current.txt": nil,
7349 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007350
Anton Hanssondff2c782020-12-21 17:10:01 +00007351 "100/public/api/foo.txt": nil,
7352 "100/public/api/foo-removed.txt": nil,
7353 "100/system/api/foo.txt": nil,
7354 "100/system/api/foo-removed.txt": nil,
7355
Paul Duffineedc5d52020-06-12 17:46:39 +01007356 // For java_sdk_library_import
7357 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007358}
7359
Jooyung Han58f26ab2019-12-18 15:34:32 +09007360func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007361 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007362 apex {
7363 name: "myapex",
7364 key: "myapex.key",
7365 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007366 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007367 }
7368
7369 apex_key {
7370 name: "myapex.key",
7371 public_key: "testkey.avbpubkey",
7372 private_key: "testkey.pem",
7373 }
7374
7375 java_sdk_library {
7376 name: "foo",
7377 srcs: ["a.java"],
7378 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007379 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007380 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007381
7382 prebuilt_apis {
7383 name: "sdk",
7384 api_dirs: ["100"],
7385 }
Paul Duffin9b879592020-05-26 13:21:35 +01007386 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007387
7388 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007389 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007390 "javalib/foo.jar",
7391 "etc/permissions/foo.xml",
7392 })
7393 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007394 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007395 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 +09007396}
7397
Paul Duffin9b879592020-05-26 13:21:35 +01007398func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007399 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007400 apex {
7401 name: "myapex",
7402 key: "myapex.key",
7403 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007404 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007405 }
7406
7407 apex_key {
7408 name: "myapex.key",
7409 public_key: "testkey.avbpubkey",
7410 private_key: "testkey.pem",
7411 }
7412
7413 java_sdk_library {
7414 name: "foo",
7415 srcs: ["a.java"],
7416 api_packages: ["foo"],
7417 apex_available: ["myapex"],
7418 sdk_version: "none",
7419 system_modules: "none",
7420 }
7421
7422 java_library {
7423 name: "bar",
7424 srcs: ["a.java"],
7425 libs: ["foo"],
7426 apex_available: ["myapex"],
7427 sdk_version: "none",
7428 system_modules: "none",
7429 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007430
7431 prebuilt_apis {
7432 name: "sdk",
7433 api_dirs: ["100"],
7434 }
Paul Duffin9b879592020-05-26 13:21:35 +01007435 `, withFiles(filesForSdkLibrary))
7436
7437 // java_sdk_library installs both impl jar and permission XML
7438 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7439 "javalib/bar.jar",
7440 "javalib/foo.jar",
7441 "etc/permissions/foo.xml",
7442 })
7443
7444 // The bar library should depend on the implementation jar.
7445 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007446 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007447 t.Errorf("expected %q, found %#q", expected, actual)
7448 }
7449}
7450
7451func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007452 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007453 apex {
7454 name: "myapex",
7455 key: "myapex.key",
7456 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007457 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007458 }
7459
7460 apex_key {
7461 name: "myapex.key",
7462 public_key: "testkey.avbpubkey",
7463 private_key: "testkey.pem",
7464 }
7465
7466 java_sdk_library {
7467 name: "foo",
7468 srcs: ["a.java"],
7469 api_packages: ["foo"],
7470 apex_available: ["myapex"],
7471 sdk_version: "none",
7472 system_modules: "none",
7473 }
7474
7475 java_library {
7476 name: "bar",
7477 srcs: ["a.java"],
7478 libs: ["foo"],
7479 sdk_version: "none",
7480 system_modules: "none",
7481 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007482
7483 prebuilt_apis {
7484 name: "sdk",
7485 api_dirs: ["100"],
7486 }
Paul Duffin9b879592020-05-26 13:21:35 +01007487 `, withFiles(filesForSdkLibrary))
7488
7489 // java_sdk_library installs both impl jar and permission XML
7490 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7491 "javalib/foo.jar",
7492 "etc/permissions/foo.xml",
7493 })
7494
7495 // The bar library should depend on the stubs jar.
7496 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007497 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007498 t.Errorf("expected %q, found %#q", expected, actual)
7499 }
7500}
7501
Paul Duffineedc5d52020-06-12 17:46:39 +01007502func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007503 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007504 prebuilt_apis {
7505 name: "sdk",
7506 api_dirs: ["100"],
7507 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007508 withFiles(map[string][]byte{
7509 "apex/a.java": nil,
7510 "apex/apex_manifest.json": nil,
7511 "apex/Android.bp": []byte(`
7512 package {
7513 default_visibility: ["//visibility:private"],
7514 }
7515
7516 apex {
7517 name: "myapex",
7518 key: "myapex.key",
7519 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007520 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007521 }
7522
7523 apex_key {
7524 name: "myapex.key",
7525 public_key: "testkey.avbpubkey",
7526 private_key: "testkey.pem",
7527 }
7528
7529 java_library {
7530 name: "bar",
7531 srcs: ["a.java"],
7532 libs: ["foo"],
7533 apex_available: ["myapex"],
7534 sdk_version: "none",
7535 system_modules: "none",
7536 }
7537`),
7538 "source/a.java": nil,
7539 "source/api/current.txt": nil,
7540 "source/api/removed.txt": nil,
7541 "source/Android.bp": []byte(`
7542 package {
7543 default_visibility: ["//visibility:private"],
7544 }
7545
7546 java_sdk_library {
7547 name: "foo",
7548 visibility: ["//apex"],
7549 srcs: ["a.java"],
7550 api_packages: ["foo"],
7551 apex_available: ["myapex"],
7552 sdk_version: "none",
7553 system_modules: "none",
7554 public: {
7555 enabled: true,
7556 },
7557 }
7558`),
7559 "prebuilt/a.jar": nil,
7560 "prebuilt/Android.bp": []byte(`
7561 package {
7562 default_visibility: ["//visibility:private"],
7563 }
7564
7565 java_sdk_library_import {
7566 name: "foo",
7567 visibility: ["//apex", "//source"],
7568 apex_available: ["myapex"],
7569 prefer: true,
7570 public: {
7571 jars: ["a.jar"],
7572 },
7573 }
7574`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007575 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007576 )
7577
7578 // java_sdk_library installs both impl jar and permission XML
7579 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7580 "javalib/bar.jar",
7581 "javalib/foo.jar",
7582 "etc/permissions/foo.xml",
7583 })
7584
7585 // The bar library should depend on the implementation jar.
7586 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007587 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007588 t.Errorf("expected %q, found %#q", expected, actual)
7589 }
7590}
7591
7592func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7593 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7594 apex {
7595 name: "myapex",
7596 key: "myapex.key",
7597 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007598 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007599 }
7600
7601 apex_key {
7602 name: "myapex.key",
7603 public_key: "testkey.avbpubkey",
7604 private_key: "testkey.pem",
7605 }
7606
7607 java_sdk_library_import {
7608 name: "foo",
7609 apex_available: ["myapex"],
7610 prefer: true,
7611 public: {
7612 jars: ["a.jar"],
7613 },
7614 }
7615
7616 `, withFiles(filesForSdkLibrary))
7617}
7618
atrost6e126252020-01-27 17:01:16 +00007619func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007620 result := android.GroupFixturePreparers(
7621 prepareForApexTest,
7622 java.PrepareForTestWithPlatformCompatConfig,
7623 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007624 apex {
7625 name: "myapex",
7626 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007627 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007628 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007629 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007630 }
7631
7632 apex_key {
7633 name: "myapex.key",
7634 public_key: "testkey.avbpubkey",
7635 private_key: "testkey.pem",
7636 }
7637
7638 platform_compat_config {
7639 name: "myjar-platform-compat-config",
7640 src: ":myjar",
7641 }
7642
7643 java_library {
7644 name: "myjar",
7645 srcs: ["foo/bar/MyClass.java"],
7646 sdk_version: "none",
7647 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007648 apex_available: [ "myapex" ],
7649 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007650
7651 // Make sure that a preferred prebuilt does not affect the apex contents.
7652 prebuilt_platform_compat_config {
7653 name: "myjar-platform-compat-config",
7654 metadata: "compat-config/metadata.xml",
7655 prefer: true,
7656 }
atrost6e126252020-01-27 17:01:16 +00007657 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007658 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007659 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7660 "etc/compatconfig/myjar-platform-compat-config.xml",
7661 "javalib/myjar.jar",
7662 })
7663}
7664
Jooyung Han862c0d62022-12-21 10:15:37 +09007665func TestNoDupeApexFiles(t *testing.T) {
7666 android.GroupFixturePreparers(
7667 android.PrepareForTestWithAndroidBuildComponents,
7668 PrepareForTestWithApexBuildComponents,
7669 prepareForTestWithMyapex,
7670 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7671 ).
7672 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7673 RunTestWithBp(t, `
7674 apex {
7675 name: "myapex",
7676 key: "myapex.key",
7677 prebuilts: ["foo", "bar"],
7678 updatable: false,
7679 }
7680
7681 apex_key {
7682 name: "myapex.key",
7683 public_key: "testkey.avbpubkey",
7684 private_key: "testkey.pem",
7685 }
7686
7687 prebuilt_etc {
7688 name: "foo",
7689 src: "myprebuilt",
7690 filename_from_src: true,
7691 }
7692
7693 prebuilt_etc {
7694 name: "bar",
7695 src: "myprebuilt",
7696 filename_from_src: true,
7697 }
7698 `)
7699}
7700
Jiyong Park479321d2019-12-16 11:47:12 +09007701func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7702 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7703 apex {
7704 name: "myapex",
7705 key: "myapex.key",
7706 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007707 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007708 }
7709
7710 apex_key {
7711 name: "myapex.key",
7712 public_key: "testkey.avbpubkey",
7713 private_key: "testkey.pem",
7714 }
7715
7716 java_library {
7717 name: "myjar",
7718 srcs: ["foo/bar/MyClass.java"],
7719 sdk_version: "none",
7720 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007721 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007722 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007723 }
7724 `)
7725}
7726
Jiyong Park7afd1072019-12-30 16:56:33 +09007727func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007728 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007729 apex {
7730 name: "myapex",
7731 key: "myapex.key",
7732 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007733 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007734 }
7735
7736 apex_key {
7737 name: "myapex.key",
7738 public_key: "testkey.avbpubkey",
7739 private_key: "testkey.pem",
7740 }
7741
7742 cc_library {
7743 name: "mylib",
7744 srcs: ["mylib.cpp"],
7745 system_shared_libs: [],
7746 stl: "none",
7747 required: ["a", "b"],
7748 host_required: ["c", "d"],
7749 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007750 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007751 }
7752 `)
7753
7754 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007755 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007756 name := apexBundle.BaseModuleName()
7757 prefix := "TARGET_"
7758 var builder strings.Builder
7759 data.Custom(&builder, name, prefix, "", data)
7760 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007761 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007762 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7763 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007764}
7765
Jiyong Park7cd10e32020-01-14 09:22:18 +09007766func TestSymlinksFromApexToSystem(t *testing.T) {
7767 bp := `
7768 apex {
7769 name: "myapex",
7770 key: "myapex.key",
7771 native_shared_libs: ["mylib"],
7772 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007773 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007774 }
7775
Jiyong Park9d677202020-02-19 16:29:35 +09007776 apex {
7777 name: "myapex.updatable",
7778 key: "myapex.key",
7779 native_shared_libs: ["mylib"],
7780 java_libs: ["myjar"],
7781 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007782 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007783 }
7784
Jiyong Park7cd10e32020-01-14 09:22:18 +09007785 apex_key {
7786 name: "myapex.key",
7787 public_key: "testkey.avbpubkey",
7788 private_key: "testkey.pem",
7789 }
7790
7791 cc_library {
7792 name: "mylib",
7793 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007794 shared_libs: [
7795 "myotherlib",
7796 "myotherlib_ext",
7797 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007798 system_shared_libs: [],
7799 stl: "none",
7800 apex_available: [
7801 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007802 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007803 "//apex_available:platform",
7804 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007805 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806 }
7807
7808 cc_library {
7809 name: "myotherlib",
7810 srcs: ["mylib.cpp"],
7811 system_shared_libs: [],
7812 stl: "none",
7813 apex_available: [
7814 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007815 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007816 "//apex_available:platform",
7817 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007818 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007819 }
7820
Jiyong Parkce243632023-02-17 18:22:25 +09007821 cc_library {
7822 name: "myotherlib_ext",
7823 srcs: ["mylib.cpp"],
7824 system_shared_libs: [],
7825 system_ext_specific: true,
7826 stl: "none",
7827 apex_available: [
7828 "myapex",
7829 "myapex.updatable",
7830 "//apex_available:platform",
7831 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007832 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007833 }
7834
Jiyong Park7cd10e32020-01-14 09:22:18 +09007835 java_library {
7836 name: "myjar",
7837 srcs: ["foo/bar/MyClass.java"],
7838 sdk_version: "none",
7839 system_modules: "none",
7840 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007841 apex_available: [
7842 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007843 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007844 "//apex_available:platform",
7845 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007846 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 }
7848
7849 java_library {
7850 name: "myotherjar",
7851 srcs: ["foo/bar/MyClass.java"],
7852 sdk_version: "none",
7853 system_modules: "none",
7854 apex_available: [
7855 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007856 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007857 "//apex_available:platform",
7858 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007859 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007860 }
7861 `
7862
7863 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7864 for _, f := range files {
7865 if f.path == file {
7866 if f.isLink {
7867 t.Errorf("%q is not a real file", file)
7868 }
7869 return
7870 }
7871 }
7872 t.Errorf("%q is not found", file)
7873 }
7874
Jiyong Parkce243632023-02-17 18:22:25 +09007875 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007876 for _, f := range files {
7877 if f.path == file {
7878 if !f.isLink {
7879 t.Errorf("%q is not a symlink", file)
7880 }
Jiyong Parkce243632023-02-17 18:22:25 +09007881 if f.src != target {
7882 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7883 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007884 return
7885 }
7886 }
7887 t.Errorf("%q is not found", file)
7888 }
7889
Jiyong Park9d677202020-02-19 16:29:35 +09007890 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7891 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007892 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007893 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007894 ensureRealfileExists(t, files, "javalib/myjar.jar")
7895 ensureRealfileExists(t, files, "lib64/mylib.so")
7896 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007897 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007898
Jiyong Park9d677202020-02-19 16:29:35 +09007899 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7900 ensureRealfileExists(t, files, "javalib/myjar.jar")
7901 ensureRealfileExists(t, files, "lib64/mylib.so")
7902 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007903 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007904
7905 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007906 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007907 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007908 ensureRealfileExists(t, files, "javalib/myjar.jar")
7909 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007910 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7911 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007912
7913 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7914 ensureRealfileExists(t, files, "javalib/myjar.jar")
7915 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007916 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7917 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918}
7919
Yo Chiange8128052020-07-23 20:09:18 +08007920func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007921 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007922 apex {
7923 name: "myapex",
7924 key: "myapex.key",
7925 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007926 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007927 }
7928
7929 apex_key {
7930 name: "myapex.key",
7931 public_key: "testkey.avbpubkey",
7932 private_key: "testkey.pem",
7933 }
7934
7935 cc_library_shared {
7936 name: "mylib",
7937 srcs: ["mylib.cpp"],
7938 shared_libs: ["myotherlib"],
7939 system_shared_libs: [],
7940 stl: "none",
7941 apex_available: [
7942 "myapex",
7943 "//apex_available:platform",
7944 ],
7945 }
7946
7947 cc_prebuilt_library_shared {
7948 name: "myotherlib",
7949 srcs: ["prebuilt.so"],
7950 system_shared_libs: [],
7951 stl: "none",
7952 apex_available: [
7953 "myapex",
7954 "//apex_available:platform",
7955 ],
7956 }
7957 `)
7958
Prerana Patilb1896c82022-11-09 18:14:34 +00007959 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007960 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007961 var builder strings.Builder
7962 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7963 androidMk := builder.String()
7964 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007965 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007966 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7967 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7968 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007969 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007970}
7971
Jooyung Han643adc42020-02-27 13:50:06 +09007972func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007973 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007974 apex {
7975 name: "myapex",
7976 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007977 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007978 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007979 }
7980
7981 apex_key {
7982 name: "myapex.key",
7983 public_key: "testkey.avbpubkey",
7984 private_key: "testkey.pem",
7985 }
7986
7987 cc_library {
7988 name: "mylib",
7989 srcs: ["mylib.cpp"],
7990 shared_libs: ["mylib2"],
7991 system_shared_libs: [],
7992 stl: "none",
7993 apex_available: [ "myapex" ],
7994 }
7995
7996 cc_library {
7997 name: "mylib2",
7998 srcs: ["mylib.cpp"],
7999 system_shared_libs: [],
8000 stl: "none",
8001 apex_available: [ "myapex" ],
8002 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008003
8004 rust_ffi_shared {
8005 name: "libfoo.rust",
8006 crate_name: "foo",
8007 srcs: ["foo.rs"],
8008 shared_libs: ["libfoo.shared_from_rust"],
8009 prefer_rlib: true,
8010 apex_available: ["myapex"],
8011 }
8012
8013 cc_library_shared {
8014 name: "libfoo.shared_from_rust",
8015 srcs: ["mylib.cpp"],
8016 system_shared_libs: [],
8017 stl: "none",
8018 stubs: {
8019 versions: ["10", "11", "12"],
8020 },
8021 }
8022
Jooyung Han643adc42020-02-27 13:50:06 +09008023 `)
8024
8025 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8026 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008027 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008028 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8029 "lib64/mylib.so",
8030 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008031 "lib64/libfoo.rust.so",
8032 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8033 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008034 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008035
8036 // b/220397949
8037 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008038}
8039
Jooyung Han49f67012020-04-17 13:43:10 +09008040func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008041 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008042 apex {
8043 name: "myapex",
8044 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008045 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008046 }
8047 apex_key {
8048 name: "myapex.key",
8049 public_key: "testkey.avbpubkey",
8050 private_key: "testkey.pem",
8051 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008052 `,
8053 android.FixtureModifyConfig(func(config android.Config) {
8054 delete(config.Targets, android.Android)
8055 config.AndroidCommonTarget = android.Target{}
8056 }),
8057 )
Jooyung Han49f67012020-04-17 13:43:10 +09008058
8059 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8060 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8061 }
8062}
8063
Jiyong Parkbd159612020-02-28 15:22:21 +09008064func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008065 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008066 apex {
8067 name: "myapex",
8068 key: "myapex.key",
8069 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008070 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008071 }
8072
8073 apex_key {
8074 name: "myapex.key",
8075 public_key: "testkey.avbpubkey",
8076 private_key: "testkey.pem",
8077 }
8078
8079 android_app {
8080 name: "AppFoo",
8081 srcs: ["foo/bar/MyClass.java"],
8082 sdk_version: "none",
8083 system_modules: "none",
8084 apex_available: [ "myapex" ],
8085 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008086 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008087
Colin Crosscf371cc2020-11-13 11:48:42 -08008088 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008089 content := bundleConfigRule.Args["content"]
8090
8091 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008092 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 +09008093}
8094
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008095func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008096 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008097 apex {
8098 name: "myapex",
8099 key: "myapex.key",
8100 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008101 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008102 }
8103
8104 apex_key {
8105 name: "myapex.key",
8106 public_key: "testkey.avbpubkey",
8107 private_key: "testkey.pem",
8108 }
8109
8110 android_app_set {
8111 name: "AppSet",
8112 set: "AppSet.apks",
8113 }`)
8114 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008115 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008116 content := bundleConfigRule.Args["content"]
8117 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8118 s := mod.Rule("apexRule").Args["copy_commands"]
8119 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008120 if len(copyCmds) != 4 {
8121 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008122 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008123 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8124 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008125 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8126 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008127
8128 // Ensure that canned_fs_config has an entry for the app set zip file
8129 generateFsRule := mod.Rule("generateFsConfig")
8130 cmd := generateFsRule.RuleParams.Command
8131 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008132}
8133
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008134func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008135 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008136 apex_set {
8137 name: "myapex",
8138 filename: "foo_v2.apex",
8139 sanitized: {
8140 none: { set: "myapex.apks", },
8141 hwaddress: { set: "myapex.hwasan.apks", },
8142 },
Paul Duffin24704672021-04-06 16:09:30 +01008143 }
8144 `
8145 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008146
Paul Duffin24704672021-04-06 16:09:30 +01008147 // Check that the extractor produces the correct output file from the correct input file.
8148 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008149
Paul Duffin24704672021-04-06 16:09:30 +01008150 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8151 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008152
Paul Duffin24704672021-04-06 16:09:30 +01008153 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8154
8155 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008156 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8157 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008158
8159 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008160}
8161
Pranav Guptaeba03b02022-09-27 00:27:08 +00008162func TestApexSetApksModuleAssignment(t *testing.T) {
8163 ctx := testApex(t, `
8164 apex_set {
8165 name: "myapex",
8166 set: ":myapex_apks_file",
8167 }
8168
8169 filegroup {
8170 name: "myapex_apks_file",
8171 srcs: ["myapex.apks"],
8172 }
8173 `)
8174
8175 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8176
8177 // Check that the extractor produces the correct apks file from the input module
8178 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8179 extractedApex := m.Output(extractorOutput)
8180
8181 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8182}
8183
Paul Duffin89f570a2021-06-16 01:42:33 +01008184func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008185 t.Helper()
8186
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008187 bp := `
8188 java_library {
8189 name: "some-updatable-apex-lib",
8190 srcs: ["a.java"],
8191 sdk_version: "current",
8192 apex_available: [
8193 "some-updatable-apex",
8194 ],
satayevabcd5972021-08-06 17:49:46 +01008195 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00008196 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008197 }
8198
8199 java_library {
8200 name: "some-non-updatable-apex-lib",
8201 srcs: ["a.java"],
8202 apex_available: [
8203 "some-non-updatable-apex",
8204 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01008205 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01008206 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008207 }
8208
8209 bootclasspath_fragment {
8210 name: "some-non-updatable-fragment",
8211 contents: ["some-non-updatable-apex-lib"],
8212 apex_available: [
8213 "some-non-updatable-apex",
8214 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008215 hidden_api: {
8216 split_packages: ["*"],
8217 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008218 }
8219
8220 java_library {
8221 name: "some-platform-lib",
8222 srcs: ["a.java"],
8223 sdk_version: "current",
8224 installable: true,
8225 }
8226
8227 java_library {
8228 name: "some-art-lib",
8229 srcs: ["a.java"],
8230 sdk_version: "current",
8231 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00008232 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008233 ],
8234 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01008235 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008236 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008237 }
8238
8239 apex {
8240 name: "some-updatable-apex",
8241 key: "some-updatable-apex.key",
8242 java_libs: ["some-updatable-apex-lib"],
8243 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008244 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008245 }
8246
8247 apex {
8248 name: "some-non-updatable-apex",
8249 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008250 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008251 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008252 }
8253
8254 apex_key {
8255 name: "some-updatable-apex.key",
8256 }
8257
8258 apex_key {
8259 name: "some-non-updatable-apex.key",
8260 }
8261
8262 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008263 name: "com.android.art.debug",
8264 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008265 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008266 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008267 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008268 }
8269
Paul Duffinf23bc472021-04-27 12:42:20 +01008270 bootclasspath_fragment {
8271 name: "art-bootclasspath-fragment",
8272 image_name: "art",
8273 contents: ["some-art-lib"],
8274 apex_available: [
8275 "com.android.art.debug",
8276 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008277 hidden_api: {
8278 split_packages: ["*"],
8279 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008280 }
8281
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008282 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008283 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008284 }
8285
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008286 filegroup {
8287 name: "some-updatable-apex-file_contexts",
8288 srcs: [
8289 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8290 ],
8291 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008292
8293 filegroup {
8294 name: "some-non-updatable-apex-file_contexts",
8295 srcs: [
8296 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8297 ],
8298 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008299 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008300
Paul Duffin89f570a2021-06-16 01:42:33 +01008301 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008302}
8303
Paul Duffin89f570a2021-06-16 01:42:33 +01008304func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008305 t.Helper()
8306
Paul Duffin55607122021-03-30 23:32:51 +01008307 fs := android.MockFS{
8308 "a.java": nil,
8309 "a.jar": nil,
8310 "apex_manifest.json": nil,
8311 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008312 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008313 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8314 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8315 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008316 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008317 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008318
Paul Duffin55607122021-03-30 23:32:51 +01008319 errorHandler := android.FixtureExpectsNoErrors
8320 if errmsg != "" {
8321 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008322 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008323
Paul Duffin55607122021-03-30 23:32:51 +01008324 result := android.GroupFixturePreparers(
8325 cc.PrepareForTestWithCcDefaultModules,
8326 java.PrepareForTestWithHiddenApiBuildComponents,
8327 java.PrepareForTestWithJavaDefaultModules,
8328 java.PrepareForTestWithJavaSdkLibraryFiles,
8329 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008330 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008331 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008332 android.FixtureModifyMockFS(func(fs android.MockFS) {
8333 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8334 insert := ""
8335 for _, fragment := range fragments {
8336 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8337 }
8338 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8339 platform_bootclasspath {
8340 name: "platform-bootclasspath",
8341 fragments: [
8342 %s
8343 ],
8344 }
8345 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008346 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008347 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008348 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008349 ).
8350 ExtendWithErrorHandler(errorHandler).
8351 RunTestWithBp(t, bp)
8352
8353 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008354}
8355
Paul Duffin5556c5f2022-06-09 17:32:21 +00008356func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008357 preparers := android.GroupFixturePreparers(
8358 java.PrepareForTestWithJavaDefaultModules,
8359 PrepareForTestWithApexBuildComponents,
8360 ).
8361 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8362 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8363
8364 bpBase := `
8365 apex_set {
8366 name: "com.android.myapex",
8367 installable: true,
8368 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8369 set: "myapex.apks",
8370 }
8371
8372 apex_set {
8373 name: "com.mycompany.android.myapex",
8374 apex_name: "com.android.myapex",
8375 installable: true,
8376 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8377 set: "company-myapex.apks",
8378 }
8379
8380 prebuilt_bootclasspath_fragment {
8381 name: "my-bootclasspath-fragment",
8382 apex_available: ["com.android.myapex"],
8383 %s
8384 }
8385 `
8386
8387 t.Run("java_import", func(t *testing.T) {
8388 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8389 java_import {
8390 name: "libfoo",
8391 jars: ["libfoo.jar"],
8392 apex_available: ["com.android.myapex"],
8393 }
8394 `)
8395 })
8396
8397 t.Run("java_sdk_library_import", func(t *testing.T) {
8398 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8399 java_sdk_library_import {
8400 name: "libfoo",
8401 public: {
8402 jars: ["libbar.jar"],
8403 },
8404 apex_available: ["com.android.myapex"],
8405 }
8406 `)
8407 })
8408
8409 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8410 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8411 image_name: "art",
8412 contents: ["libfoo"],
8413 `)+`
8414 java_sdk_library_import {
8415 name: "libfoo",
8416 public: {
8417 jars: ["libbar.jar"],
8418 },
8419 apex_available: ["com.android.myapex"],
8420 }
8421 `)
8422 })
8423}
8424
Paul Duffin5556c5f2022-06-09 17:32:21 +00008425func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8426 preparers := android.GroupFixturePreparers(
8427 java.PrepareForTestWithJavaDefaultModules,
8428 PrepareForTestWithApexBuildComponents,
8429 )
8430
8431 bpBase := `
8432 apex_set {
8433 name: "com.android.myapex",
8434 installable: true,
8435 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8436 set: "myapex.apks",
8437 }
8438
8439 apex_set {
8440 name: "com.android.myapex_compressed",
8441 apex_name: "com.android.myapex",
8442 installable: true,
8443 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8444 set: "myapex_compressed.apks",
8445 }
8446
8447 prebuilt_bootclasspath_fragment {
8448 name: "my-bootclasspath-fragment",
8449 apex_available: [
8450 "com.android.myapex",
8451 "com.android.myapex_compressed",
8452 ],
8453 hidden_api: {
8454 annotation_flags: "annotation-flags.csv",
8455 metadata: "metadata.csv",
8456 index: "index.csv",
8457 signature_patterns: "signature_patterns.csv",
8458 },
8459 %s
8460 }
8461 `
8462
8463 t.Run("java_import", func(t *testing.T) {
8464 result := preparers.RunTestWithBp(t,
8465 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8466 java_import {
8467 name: "libfoo",
8468 jars: ["libfoo.jar"],
8469 apex_available: [
8470 "com.android.myapex",
8471 "com.android.myapex_compressed",
8472 ],
8473 }
8474 `)
8475
8476 module := result.Module("libfoo", "android_common_com.android.myapex")
8477 usesLibraryDep := module.(java.UsesLibraryDependency)
8478 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8479 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8480 usesLibraryDep.DexJarBuildPath().Path())
8481 })
8482
8483 t.Run("java_sdk_library_import", func(t *testing.T) {
8484 result := preparers.RunTestWithBp(t,
8485 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8486 java_sdk_library_import {
8487 name: "libfoo",
8488 public: {
8489 jars: ["libbar.jar"],
8490 },
8491 apex_available: [
8492 "com.android.myapex",
8493 "com.android.myapex_compressed",
8494 ],
8495 compile_dex: true,
8496 }
8497 `)
8498
8499 module := result.Module("libfoo", "android_common_com.android.myapex")
8500 usesLibraryDep := module.(java.UsesLibraryDependency)
8501 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8502 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8503 usesLibraryDep.DexJarBuildPath().Path())
8504 })
8505
8506 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8507 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8508 image_name: "art",
8509 contents: ["libfoo"],
8510 `)+`
8511 java_sdk_library_import {
8512 name: "libfoo",
8513 public: {
8514 jars: ["libbar.jar"],
8515 },
8516 apex_available: [
8517 "com.android.myapex",
8518 "com.android.myapex_compressed",
8519 ],
8520 compile_dex: true,
8521 }
8522 `)
8523 })
8524}
8525
Jooyung Han548640b2020-04-27 12:10:30 +09008526func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8527 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8528 apex {
8529 name: "myapex",
8530 key: "myapex.key",
8531 updatable: true,
8532 }
8533
8534 apex_key {
8535 name: "myapex.key",
8536 public_key: "testkey.avbpubkey",
8537 private_key: "testkey.pem",
8538 }
8539 `)
8540}
8541
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008542func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8543 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8544 apex {
8545 name: "myapex",
8546 key: "myapex.key",
8547 }
8548
8549 apex_key {
8550 name: "myapex.key",
8551 public_key: "testkey.avbpubkey",
8552 private_key: "testkey.pem",
8553 }
8554 `)
8555}
8556
Jooyung Handfc864c2023-03-20 18:19:07 +09008557func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8558 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008559 apex {
8560 name: "myapex",
8561 key: "myapex.key",
8562 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008563 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008564 soc_specific: true,
8565 }
8566
8567 apex_key {
8568 name: "myapex.key",
8569 public_key: "testkey.avbpubkey",
8570 private_key: "testkey.pem",
8571 }
8572 `)
8573}
8574
Jooyung Han02873da2023-03-22 17:41:03 +09008575func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8576 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8577 apex {
8578 name: "myapex",
8579 key: "myapex.key",
8580 updatable: false,
8581 min_sdk_version: "29",
8582 use_vndk_as_stable: true,
8583 vendor: true,
8584 }
8585
8586 apex_key {
8587 name: "myapex.key",
8588 public_key: "testkey.avbpubkey",
8589 private_key: "testkey.pem",
8590 }
8591 `)
8592}
8593
Jooyung Handfc864c2023-03-20 18:19:07 +09008594func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8595 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8596 apex {
8597 name: "myapex",
8598 key: "myapex.key",
8599 updatable: false,
8600 use_vndk_as_stable: true,
8601 }
8602
8603 apex_key {
8604 name: "myapex.key",
8605 public_key: "testkey.avbpubkey",
8606 private_key: "testkey.pem",
8607 }
8608 `)
8609}
8610
satayevb98371c2021-06-15 16:49:50 +01008611func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8612 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8613 apex {
8614 name: "myapex",
8615 key: "myapex.key",
8616 systemserverclasspath_fragments: [
8617 "mysystemserverclasspathfragment",
8618 ],
8619 min_sdk_version: "29",
8620 updatable: true,
8621 }
8622
8623 apex_key {
8624 name: "myapex.key",
8625 public_key: "testkey.avbpubkey",
8626 private_key: "testkey.pem",
8627 }
8628
8629 java_library {
8630 name: "foo",
8631 srcs: ["b.java"],
8632 min_sdk_version: "29",
8633 installable: true,
8634 apex_available: [
8635 "myapex",
8636 ],
8637 }
8638
8639 systemserverclasspath_fragment {
8640 name: "mysystemserverclasspathfragment",
8641 generate_classpaths_proto: false,
8642 contents: [
8643 "foo",
8644 ],
8645 apex_available: [
8646 "myapex",
8647 ],
8648 }
satayevabcd5972021-08-06 17:49:46 +01008649 `,
8650 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8651 )
satayevb98371c2021-06-15 16:49:50 +01008652}
8653
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008654func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008655 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8656 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8657 // modules to be included in the BootJars.
8658 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8659 return android.GroupFixturePreparers(
8660 dexpreopt.FixtureSetBootJars(bootJars...),
8661 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8662 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8663 }),
8664 )
8665 }
8666
8667 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8668 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8669 // specified in the ArtApexJars configuration.
8670 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8671 return android.GroupFixturePreparers(
8672 dexpreopt.FixtureSetArtBootJars(bootJars...),
8673 dexpreopt.FixtureSetBootJars(bootJars...),
8674 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8675 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8676 }),
8677 )
8678 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008679
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008680 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008681 preparer := android.GroupFixturePreparers(
8682 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8683 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8684 )
8685 fragments := []java.ApexVariantReference{
8686 {
8687 Apex: proptools.StringPtr("com.android.art.debug"),
8688 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8689 },
8690 {
8691 Apex: proptools.StringPtr("some-non-updatable-apex"),
8692 Module: proptools.StringPtr("some-non-updatable-fragment"),
8693 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008694 }
satayevabcd5972021-08-06 17:49:46 +01008695 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008696 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008697
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008698 t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
8699 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the platform bootclasspath`
Paul Duffin60264a02021-04-12 20:02:36 +01008700 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008701 preparer := android.GroupFixturePreparers(
8702 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8703 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8704 )
Paul Duffin60264a02021-04-12 20:02:36 +01008705 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008706 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008707
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008708 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 +01008709 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 +01008710 // Update the dexpreopt ArtApexJars directly.
8711 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8712 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008713 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008714
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008715 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 +01008716 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 +01008717 // Update the dexpreopt ArtApexJars directly.
8718 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8719 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008720 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008721
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008722 t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
8723 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the platform bootclasspath`
satayevabcd5972021-08-06 17:49:46 +01008724 preparer := android.GroupFixturePreparers(
8725 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8726 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8727 )
Paul Duffin60264a02021-04-12 20:02:36 +01008728 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008729 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008730
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008731 t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008732 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008733 fragment := java.ApexVariantReference{
8734 Apex: proptools.StringPtr("some-non-updatable-apex"),
8735 Module: proptools.StringPtr("some-non-updatable-fragment"),
8736 }
8737 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008738 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008739
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008740 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008741 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008742 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8743 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008744 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008745
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008746 t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008747 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008748 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8749 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008750 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008751
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008752 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008753 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008754 // Update the dexpreopt ArtApexJars directly.
8755 preparer := prepareSetArtJars("platform:some-platform-lib")
8756 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008757 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008758
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008759 t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008760 preparer := android.GroupFixturePreparers(
8761 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8762 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8763 )
8764 fragments := []java.ApexVariantReference{
8765 {
8766 Apex: proptools.StringPtr("some-non-updatable-apex"),
8767 Module: proptools.StringPtr("some-non-updatable-fragment"),
8768 },
8769 }
8770 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008771 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008772}
8773
8774func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008775 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008776 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008777 fragment := java.ApexVariantReference{
8778 Apex: proptools.StringPtr("myapex"),
8779 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8780 }
8781
Paul Duffin064b70c2020-11-02 17:32:38 +00008782 testDexpreoptWithApexes(t, `
8783 prebuilt_apex {
8784 name: "myapex" ,
8785 arch: {
8786 arm64: {
8787 src: "myapex-arm64.apex",
8788 },
8789 arm: {
8790 src: "myapex-arm.apex",
8791 },
8792 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008793 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8794 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008795
Paul Duffin89f570a2021-06-16 01:42:33 +01008796 prebuilt_bootclasspath_fragment {
8797 name: "my-bootclasspath-fragment",
8798 contents: ["libfoo"],
8799 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008800 hidden_api: {
8801 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8802 metadata: "my-bootclasspath-fragment/metadata.csv",
8803 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008804 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8805 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8806 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008807 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008808 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008809
Paul Duffin89f570a2021-06-16 01:42:33 +01008810 java_import {
8811 name: "libfoo",
8812 jars: ["libfoo.jar"],
8813 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008814 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008815 }
8816 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008817 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008818}
8819
Spandan Dasf14e2542021-11-12 00:01:37 +00008820func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008821 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008822 bp += `
8823 apex_key {
8824 name: "myapex.key",
8825 public_key: "testkey.avbpubkey",
8826 private_key: "testkey.pem",
8827 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008828 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008829 "lib1/src/A.java": nil,
8830 "lib2/src/B.java": nil,
8831 "system/sepolicy/apex/myapex-file_contexts": nil,
8832 }
8833
Paul Duffin45338f02021-03-30 23:07:52 +01008834 errorHandler := android.FixtureExpectsNoErrors
8835 if errmsg != "" {
8836 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008837 }
Colin Crossae8600b2020-10-29 17:09:13 -07008838
Paul Duffin45338f02021-03-30 23:07:52 +01008839 android.GroupFixturePreparers(
8840 android.PrepareForTestWithAndroidBuildComponents,
8841 java.PrepareForTestWithJavaBuildComponents,
8842 PrepareForTestWithApexBuildComponents,
8843 android.PrepareForTestWithNeverallowRules(rules),
8844 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008845 apexBootJars := make([]string, 0, len(bootJars))
8846 for _, apexBootJar := range bootJars {
8847 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008848 }
satayevd604b212021-07-21 14:23:52 +01008849 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008850 }),
8851 fs.AddToFixture(),
8852 ).
8853 ExtendWithErrorHandler(errorHandler).
8854 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008855}
8856
8857func TestApexPermittedPackagesRules(t *testing.T) {
8858 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008859 name string
8860 expectedError string
8861 bp string
8862 bootJars []string
8863 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008864 }{
8865
8866 {
8867 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8868 expectedError: "",
8869 bp: `
8870 java_library {
8871 name: "bcp_lib1",
8872 srcs: ["lib1/src/*.java"],
8873 permitted_packages: ["foo.bar"],
8874 apex_available: ["myapex"],
8875 sdk_version: "none",
8876 system_modules: "none",
8877 }
8878 java_library {
8879 name: "nonbcp_lib2",
8880 srcs: ["lib2/src/*.java"],
8881 apex_available: ["myapex"],
8882 permitted_packages: ["a.b"],
8883 sdk_version: "none",
8884 system_modules: "none",
8885 }
8886 apex {
8887 name: "myapex",
8888 key: "myapex.key",
8889 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008890 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008891 }`,
8892 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008893 bcpPermittedPackages: map[string][]string{
8894 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008895 "foo.bar",
8896 },
8897 },
8898 },
8899 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008900 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008901 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 +01008902 bp: `
8903 java_library {
8904 name: "bcp_lib1",
8905 srcs: ["lib1/src/*.java"],
8906 apex_available: ["myapex"],
8907 permitted_packages: ["foo.bar"],
8908 sdk_version: "none",
8909 system_modules: "none",
8910 }
8911 java_library {
8912 name: "bcp_lib2",
8913 srcs: ["lib2/src/*.java"],
8914 apex_available: ["myapex"],
8915 permitted_packages: ["foo.bar", "bar.baz"],
8916 sdk_version: "none",
8917 system_modules: "none",
8918 }
8919 apex {
8920 name: "myapex",
8921 key: "myapex.key",
8922 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008923 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008924 }
8925 `,
8926 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008927 bcpPermittedPackages: map[string][]string{
8928 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008929 "foo.bar",
8930 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008931 "bcp_lib2": []string{
8932 "foo.bar",
8933 },
8934 },
8935 },
8936 {
8937 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8938 expectedError: "",
8939 bp: `
8940 java_library {
8941 name: "bcp_lib_restricted",
8942 srcs: ["lib1/src/*.java"],
8943 apex_available: ["myapex"],
8944 permitted_packages: ["foo.bar"],
8945 sdk_version: "none",
8946 min_sdk_version: "29",
8947 system_modules: "none",
8948 }
8949 java_library {
8950 name: "bcp_lib_unrestricted",
8951 srcs: ["lib2/src/*.java"],
8952 apex_available: ["myapex"],
8953 permitted_packages: ["foo.bar", "bar.baz"],
8954 sdk_version: "none",
8955 min_sdk_version: "29",
8956 system_modules: "none",
8957 }
8958 apex {
8959 name: "myapex",
8960 key: "myapex.key",
8961 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8962 updatable: true,
8963 min_sdk_version: "29",
8964 }
8965 `,
8966 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8967 bcpPermittedPackages: map[string][]string{
8968 "bcp_lib1_non_updateable": []string{
8969 "foo.bar",
8970 },
8971 // 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 +01008972 },
8973 },
8974 }
8975 for _, tc := range testcases {
8976 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008977 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8978 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008979 })
8980 }
8981}
8982
Jiyong Park62304bb2020-04-13 16:19:48 +09008983func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008984 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008985 apex {
8986 name: "myapex",
8987 key: "myapex.key",
8988 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008989 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008990 }
8991
8992 apex_key {
8993 name: "myapex.key",
8994 public_key: "testkey.avbpubkey",
8995 private_key: "testkey.pem",
8996 }
8997
8998 cc_library {
8999 name: "mylib",
9000 srcs: ["mylib.cpp"],
9001 system_shared_libs: [],
9002 stl: "none",
9003 stubs: {
9004 versions: ["1"],
9005 },
9006 apex_available: ["myapex"],
9007 }
9008
9009 cc_library {
9010 name: "myprivlib",
9011 srcs: ["mylib.cpp"],
9012 system_shared_libs: [],
9013 stl: "none",
9014 apex_available: ["myapex"],
9015 }
9016
9017
9018 cc_test {
9019 name: "mytest",
9020 gtest: false,
9021 srcs: ["mylib.cpp"],
9022 system_shared_libs: [],
9023 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009024 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009025 test_for: ["myapex"]
9026 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009027
9028 cc_library {
9029 name: "mytestlib",
9030 srcs: ["mylib.cpp"],
9031 system_shared_libs: [],
9032 shared_libs: ["mylib", "myprivlib"],
9033 stl: "none",
9034 test_for: ["myapex"],
9035 }
9036
9037 cc_benchmark {
9038 name: "mybench",
9039 srcs: ["mylib.cpp"],
9040 system_shared_libs: [],
9041 shared_libs: ["mylib", "myprivlib"],
9042 stl: "none",
9043 test_for: ["myapex"],
9044 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009045 `)
9046
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009047 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009048 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009049 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9050 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9051 }
9052
9053 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009054 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009055 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9056 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9057 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9058}
Jiyong Park46a512f2020-12-04 18:02:13 +09009059
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009060func TestIndirectTestFor(t *testing.T) {
9061 ctx := testApex(t, `
9062 apex {
9063 name: "myapex",
9064 key: "myapex.key",
9065 native_shared_libs: ["mylib", "myprivlib"],
9066 updatable: false,
9067 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009068
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009069 apex_key {
9070 name: "myapex.key",
9071 public_key: "testkey.avbpubkey",
9072 private_key: "testkey.pem",
9073 }
9074
9075 cc_library {
9076 name: "mylib",
9077 srcs: ["mylib.cpp"],
9078 system_shared_libs: [],
9079 stl: "none",
9080 stubs: {
9081 versions: ["1"],
9082 },
9083 apex_available: ["myapex"],
9084 }
9085
9086 cc_library {
9087 name: "myprivlib",
9088 srcs: ["mylib.cpp"],
9089 system_shared_libs: [],
9090 stl: "none",
9091 shared_libs: ["mylib"],
9092 apex_available: ["myapex"],
9093 }
9094
9095 cc_library {
9096 name: "mytestlib",
9097 srcs: ["mylib.cpp"],
9098 system_shared_libs: [],
9099 shared_libs: ["myprivlib"],
9100 stl: "none",
9101 test_for: ["myapex"],
9102 }
9103 `)
9104
9105 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009106 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009107 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9108 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9109 }
9110
9111 // The platform variant of mytestlib links to the platform variant of the
9112 // internal myprivlib.
9113 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9114
9115 // The platform variant of myprivlib links to the platform variant of mylib
9116 // and bypasses its stubs.
9117 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 +09009118}
9119
Martin Stjernholmec009002021-03-27 15:18:31 +00009120func TestTestForForLibInOtherApex(t *testing.T) {
9121 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9122 _ = testApex(t, `
9123 apex {
9124 name: "com.android.art",
9125 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009126 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009127 updatable: false,
9128 }
9129
9130 apex {
9131 name: "com.android.art.debug",
9132 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009133 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009134 updatable: false,
9135 }
9136
9137 apex_key {
9138 name: "myapex.key",
9139 public_key: "testkey.avbpubkey",
9140 private_key: "testkey.pem",
9141 }
9142
9143 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009144 name: "libnativebridge",
9145 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009146 system_shared_libs: [],
9147 stl: "none",
9148 stubs: {
9149 versions: ["1"],
9150 },
9151 apex_available: ["com.android.art", "com.android.art.debug"],
9152 }
9153
9154 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009155 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009156 srcs: ["mylib.cpp"],
9157 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009158 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009159 stl: "none",
9160 apex_available: ["com.android.art.debug"],
9161 test_for: ["com.android.art"],
9162 }
9163 `,
9164 android.MockFS{
9165 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9166 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9167 }.AddToFixture())
9168}
9169
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009170// TODO(jungjw): Move this to proptools
9171func intPtr(i int) *int {
9172 return &i
9173}
9174
9175func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009176 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009177 apex_set {
9178 name: "myapex",
9179 set: "myapex.apks",
9180 filename: "foo_v2.apex",
9181 overrides: ["foo"],
9182 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009183 `,
9184 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9185 variables.Platform_sdk_version = intPtr(30)
9186 }),
9187 android.FixtureModifyConfig(func(config android.Config) {
9188 config.Targets[android.Android] = []android.Target{
9189 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9190 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9191 }
9192 }),
9193 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009194
Paul Duffin24704672021-04-06 16:09:30 +01009195 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009196
9197 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009198 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009199 actual := extractedApex.Args["abis"]
9200 expected := "ARMEABI_V7A,ARM64_V8A"
9201 if actual != expected {
9202 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9203 }
9204 actual = extractedApex.Args["sdk-version"]
9205 expected = "30"
9206 if actual != expected {
9207 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9208 }
9209
Paul Duffin6717d882021-06-15 19:09:41 +01009210 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009211 a := m.Module().(*ApexSet)
9212 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009213 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009214 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9215 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9216 }
9217}
9218
Anton Hansson805e0a52022-11-25 14:06:46 +00009219func TestApexSet_NativeBridge(t *testing.T) {
9220 ctx := testApex(t, `
9221 apex_set {
9222 name: "myapex",
9223 set: "myapex.apks",
9224 filename: "foo_v2.apex",
9225 overrides: ["foo"],
9226 }
9227 `,
9228 android.FixtureModifyConfig(func(config android.Config) {
9229 config.Targets[android.Android] = []android.Target{
9230 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9231 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9232 }
9233 }),
9234 )
9235
9236 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9237
9238 // Check extract_apks tool parameters. No native bridge arch expected
9239 extractedApex := m.Output("extracted/myapex.apks")
9240 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9241}
9242
Jiyong Park7d95a512020-05-10 15:16:24 +09009243func TestNoStaticLinkingToStubsLib(t *testing.T) {
9244 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9245 apex {
9246 name: "myapex",
9247 key: "myapex.key",
9248 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009249 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009250 }
9251
9252 apex_key {
9253 name: "myapex.key",
9254 public_key: "testkey.avbpubkey",
9255 private_key: "testkey.pem",
9256 }
9257
9258 cc_library {
9259 name: "mylib",
9260 srcs: ["mylib.cpp"],
9261 static_libs: ["otherlib"],
9262 system_shared_libs: [],
9263 stl: "none",
9264 apex_available: [ "myapex" ],
9265 }
9266
9267 cc_library {
9268 name: "otherlib",
9269 srcs: ["mylib.cpp"],
9270 system_shared_libs: [],
9271 stl: "none",
9272 stubs: {
9273 versions: ["1", "2", "3"],
9274 },
9275 apex_available: [ "myapex" ],
9276 }
9277 `)
9278}
9279
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009280func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009281 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009282 apex {
9283 name: "myapex",
9284 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009285 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009286 custom_sign_tool: "sign_myapex",
9287 }
9288
9289 apex_key {
9290 name: "myapex.key",
9291 public_key: "testkey.avbpubkey",
9292 private_key: "testkey.pem",
9293 }
9294 `)
9295
9296 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9297 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9298 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"`)
9299}
9300
9301func TestApexKeysTxtOverrides(t *testing.T) {
9302 ctx := testApex(t, `
9303 apex {
9304 name: "myapex",
9305 key: "myapex.key",
9306 updatable: false,
9307 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009308 }
9309
9310 apex_key {
9311 name: "myapex.key",
9312 public_key: "testkey.avbpubkey",
9313 private_key: "testkey.pem",
9314 }
9315
9316 prebuilt_apex {
9317 name: "myapex",
9318 prefer: true,
9319 arch: {
9320 arm64: {
9321 src: "myapex-arm64.apex",
9322 },
9323 arm: {
9324 src: "myapex-arm.apex",
9325 },
9326 },
9327 }
9328
9329 apex_set {
9330 name: "myapex_set",
9331 set: "myapex.apks",
9332 filename: "myapex_set.apex",
9333 overrides: ["myapex"],
9334 }
9335 `)
9336
9337 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9338 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9339 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 +09009340 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 +09009341}
9342
Jooyung Han938b5932020-06-20 12:47:47 +09009343func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009344 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009345 apex {
9346 name: "myapex",
9347 key: "myapex.key",
9348 apps: ["app"],
9349 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009350 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009351 }
9352
9353 apex_key {
9354 name: "myapex.key",
9355 public_key: "testkey.avbpubkey",
9356 private_key: "testkey.pem",
9357 }
9358
9359 android_app {
9360 name: "app",
9361 srcs: ["foo/bar/MyClass.java"],
9362 package_name: "foo",
9363 sdk_version: "none",
9364 system_modules: "none",
9365 apex_available: [ "myapex" ],
9366 }
9367 `, withFiles(map[string][]byte{
9368 "sub/Android.bp": []byte(`
9369 override_apex {
9370 name: "override_myapex",
9371 base: "myapex",
9372 apps: ["override_app"],
9373 allowed_files: ":allowed",
9374 }
9375 // Overridable "path" property should be referenced indirectly
9376 filegroup {
9377 name: "allowed",
9378 srcs: ["allowed.txt"],
9379 }
9380 override_android_app {
9381 name: "override_app",
9382 base: "app",
9383 package_name: "bar",
9384 }
9385 `),
9386 }))
9387
9388 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9389 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9390 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9391 }
9392
9393 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9394 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9395 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9396 }
9397}
9398
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009399func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009400 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009401 apex {
9402 name: "myapex",
9403 key: "myapex.key",
9404 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009405 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009406 }
9407
9408 apex_key {
9409 name: "myapex.key",
9410 public_key: "testkey.avbpubkey",
9411 private_key: "testkey.pem",
9412 }
9413
9414 cc_library {
9415 name: "mylib",
9416 srcs: ["mylib.cpp"],
9417 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009418 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009419 },
9420 apex_available: ["myapex"],
9421 }
9422
9423 cc_prebuilt_library_shared {
9424 name: "mylib",
9425 prefer: false,
9426 srcs: ["prebuilt.so"],
9427 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009428 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009429 },
9430 apex_available: ["myapex"],
9431 }
9432 `)
9433}
9434
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009435func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009436 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009437 apex {
9438 name: "myapex",
9439 key: "myapex.key",
9440 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009441 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009442 }
9443 apex_key {
9444 name: "myapex.key",
9445 public_key: "testkey.avbpubkey",
9446 private_key: "testkey.pem",
9447 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009448 `,
9449 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9450 variables.CompressedApex = proptools.BoolPtr(true)
9451 }),
9452 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009453
9454 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9455 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9456
9457 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9458 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9459
9460 // Make sure output of bundle is .capex
9461 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9462 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9463
9464 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009465 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009466 var builder strings.Builder
9467 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9468 androidMk := builder.String()
9469 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9470}
9471
Martin Stjernholm2856c662020-12-02 15:03:42 +00009472func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009473 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009474 apex {
9475 name: "myapex",
9476 key: "myapex.key",
9477 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009478 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009479 }
9480
9481 apex_key {
9482 name: "myapex.key",
9483 public_key: "testkey.avbpubkey",
9484 private_key: "testkey.pem",
9485 }
9486
9487 cc_library {
9488 name: "mylib",
9489 srcs: ["mylib.cpp"],
9490 apex_available: ["myapex"],
9491 shared_libs: ["otherlib"],
9492 system_shared_libs: [],
9493 }
9494
9495 cc_library {
9496 name: "otherlib",
9497 srcs: ["mylib.cpp"],
9498 stubs: {
9499 versions: ["current"],
9500 },
9501 }
9502
9503 cc_prebuilt_library_shared {
9504 name: "otherlib",
9505 prefer: true,
9506 srcs: ["prebuilt.so"],
9507 stubs: {
9508 versions: ["current"],
9509 },
9510 }
9511 `)
9512
9513 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009514 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009515 var builder strings.Builder
9516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9517 androidMk := builder.String()
9518
9519 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9520 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009521 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009522}
9523
Jiyong Parke3867542020-12-03 17:28:25 +09009524func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009525 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009526 apex {
9527 name: "myapex",
9528 key: "myapex.key",
9529 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009530 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009531 }
9532
9533 apex_key {
9534 name: "myapex.key",
9535 public_key: "testkey.avbpubkey",
9536 private_key: "testkey.pem",
9537 }
9538
9539 cc_library {
9540 name: "mylib",
9541 srcs: ["mylib.cpp"],
9542 system_shared_libs: [],
9543 stl: "none",
9544 apex_available: ["myapex"],
9545 shared_libs: ["mylib2"],
9546 target: {
9547 apex: {
9548 exclude_shared_libs: ["mylib2"],
9549 },
9550 },
9551 }
9552
9553 cc_library {
9554 name: "mylib2",
9555 srcs: ["mylib.cpp"],
9556 system_shared_libs: [],
9557 stl: "none",
9558 }
9559 `)
9560
9561 // Check if mylib is linked to mylib2 for the non-apex target
9562 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9563 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9564
9565 // Make sure that the link doesn't occur for the apex target
9566 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9567 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9568
9569 // It shouldn't appear in the copy cmd as well.
9570 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9571 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9572}
9573
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009574func TestPrebuiltStubLibDep(t *testing.T) {
9575 bpBase := `
9576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009580 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009581 }
9582 apex_key {
9583 name: "myapex.key",
9584 public_key: "testkey.avbpubkey",
9585 private_key: "testkey.pem",
9586 }
9587 cc_library {
9588 name: "mylib",
9589 srcs: ["mylib.cpp"],
9590 apex_available: ["myapex"],
9591 shared_libs: ["stublib"],
9592 system_shared_libs: [],
9593 }
9594 apex {
9595 name: "otherapex",
9596 enabled: %s,
9597 key: "myapex.key",
9598 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009599 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009600 }
9601 `
9602
9603 stublibSourceBp := `
9604 cc_library {
9605 name: "stublib",
9606 srcs: ["mylib.cpp"],
9607 apex_available: ["otherapex"],
9608 system_shared_libs: [],
9609 stl: "none",
9610 stubs: {
9611 versions: ["1"],
9612 },
9613 }
9614 `
9615
9616 stublibPrebuiltBp := `
9617 cc_prebuilt_library_shared {
9618 name: "stublib",
9619 srcs: ["prebuilt.so"],
9620 apex_available: ["otherapex"],
9621 stubs: {
9622 versions: ["1"],
9623 },
9624 %s
9625 }
9626 `
9627
9628 tests := []struct {
9629 name string
9630 stublibBp string
9631 usePrebuilt bool
9632 modNames []string // Modules to collect AndroidMkEntries for
9633 otherApexEnabled []string
9634 }{
9635 {
9636 name: "only_source",
9637 stublibBp: stublibSourceBp,
9638 usePrebuilt: false,
9639 modNames: []string{"stublib"},
9640 otherApexEnabled: []string{"true", "false"},
9641 },
9642 {
9643 name: "source_preferred",
9644 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9645 usePrebuilt: false,
9646 modNames: []string{"stublib", "prebuilt_stublib"},
9647 otherApexEnabled: []string{"true", "false"},
9648 },
9649 {
9650 name: "prebuilt_preferred",
9651 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9652 usePrebuilt: true,
9653 modNames: []string{"stublib", "prebuilt_stublib"},
9654 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9655 },
9656 {
9657 name: "only_prebuilt",
9658 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9659 usePrebuilt: true,
9660 modNames: []string{"stublib"},
9661 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9662 },
9663 }
9664
9665 for _, test := range tests {
9666 t.Run(test.name, func(t *testing.T) {
9667 for _, otherApexEnabled := range test.otherApexEnabled {
9668 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009669 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009670
9671 type modAndMkEntries struct {
9672 mod *cc.Module
9673 mkEntries android.AndroidMkEntries
9674 }
9675 entries := []*modAndMkEntries{}
9676
9677 // Gather shared lib modules that are installable
9678 for _, modName := range test.modNames {
9679 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9680 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9681 continue
9682 }
9683 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009684 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009685 continue
9686 }
Colin Crossaa255532020-07-03 13:18:24 -07009687 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009688 if ent.Disabled {
9689 continue
9690 }
9691 entries = append(entries, &modAndMkEntries{
9692 mod: mod,
9693 mkEntries: ent,
9694 })
9695 }
9696 }
9697 }
9698
9699 var entry *modAndMkEntries = nil
9700 for _, ent := range entries {
9701 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9702 if entry != nil {
9703 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9704 } else {
9705 entry = ent
9706 }
9707 }
9708 }
9709
9710 if entry == nil {
9711 t.Errorf("AndroidMk entry for \"stublib\" missing")
9712 } else {
9713 isPrebuilt := entry.mod.Prebuilt() != nil
9714 if isPrebuilt != test.usePrebuilt {
9715 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9716 }
9717 if !entry.mod.IsStubs() {
9718 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9719 }
9720 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9721 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9722 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009723 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009724 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009725 if !android.InList(expected, cflags) {
9726 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9727 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009728 }
9729 })
9730 }
9731 })
9732 }
9733}
9734
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009735func TestHostApexInHostOnlyBuild(t *testing.T) {
9736 testApex(t, `
9737 apex {
9738 name: "myapex",
9739 host_supported: true,
9740 key: "myapex.key",
9741 updatable: false,
9742 payload_type: "zip",
9743 }
9744 apex_key {
9745 name: "myapex.key",
9746 public_key: "testkey.avbpubkey",
9747 private_key: "testkey.pem",
9748 }
9749 `,
9750 android.FixtureModifyConfig(func(config android.Config) {
9751 // We may not have device targets in all builds, e.g. in
9752 // prebuilts/build-tools/build-prebuilts.sh
9753 config.Targets[android.Android] = []android.Target{}
9754 }))
9755}
9756
Colin Crossc33e5212021-05-25 18:16:02 -07009757func TestApexJavaCoverage(t *testing.T) {
9758 bp := `
9759 apex {
9760 name: "myapex",
9761 key: "myapex.key",
9762 java_libs: ["mylib"],
9763 bootclasspath_fragments: ["mybootclasspathfragment"],
9764 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9765 updatable: false,
9766 }
9767
9768 apex_key {
9769 name: "myapex.key",
9770 public_key: "testkey.avbpubkey",
9771 private_key: "testkey.pem",
9772 }
9773
9774 java_library {
9775 name: "mylib",
9776 srcs: ["mylib.java"],
9777 apex_available: ["myapex"],
9778 compile_dex: true,
9779 }
9780
9781 bootclasspath_fragment {
9782 name: "mybootclasspathfragment",
9783 contents: ["mybootclasspathlib"],
9784 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009785 hidden_api: {
9786 split_packages: ["*"],
9787 },
Colin Crossc33e5212021-05-25 18:16:02 -07009788 }
9789
9790 java_library {
9791 name: "mybootclasspathlib",
9792 srcs: ["mybootclasspathlib.java"],
9793 apex_available: ["myapex"],
9794 compile_dex: true,
9795 }
9796
9797 systemserverclasspath_fragment {
9798 name: "mysystemserverclasspathfragment",
9799 contents: ["mysystemserverclasspathlib"],
9800 apex_available: ["myapex"],
9801 }
9802
9803 java_library {
9804 name: "mysystemserverclasspathlib",
9805 srcs: ["mysystemserverclasspathlib.java"],
9806 apex_available: ["myapex"],
9807 compile_dex: true,
9808 }
9809 `
9810
9811 result := android.GroupFixturePreparers(
9812 PrepareForTestWithApexBuildComponents,
9813 prepareForTestWithMyapex,
9814 java.PrepareForTestWithJavaDefaultModules,
9815 android.PrepareForTestWithAndroidBuildComponents,
9816 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009817 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9818 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009819 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009820 ).RunTest(t)
9821
9822 // Make sure jacoco ran on both mylib and mybootclasspathlib
9823 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9824 t.Errorf("Failed to find jacoco rule for mylib")
9825 }
9826 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9827 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9828 }
9829 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9830 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9831 }
9832}
9833
Jiyong Park192600a2021-08-03 07:52:17 +00009834func TestProhibitStaticExecutable(t *testing.T) {
9835 testApexError(t, `executable mybin is static`, `
9836 apex {
9837 name: "myapex",
9838 key: "myapex.key",
9839 binaries: ["mybin"],
9840 min_sdk_version: "29",
9841 }
9842
9843 apex_key {
9844 name: "myapex.key",
9845 public_key: "testkey.avbpubkey",
9846 private_key: "testkey.pem",
9847 }
9848
9849 cc_binary {
9850 name: "mybin",
9851 srcs: ["mylib.cpp"],
9852 relative_install_path: "foo/bar",
9853 static_executable: true,
9854 system_shared_libs: [],
9855 stl: "none",
9856 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009857 min_sdk_version: "29",
9858 }
9859 `)
9860
9861 testApexError(t, `executable mybin.rust is static`, `
9862 apex {
9863 name: "myapex",
9864 key: "myapex.key",
9865 binaries: ["mybin.rust"],
9866 min_sdk_version: "29",
9867 }
9868
9869 apex_key {
9870 name: "myapex.key",
9871 public_key: "testkey.avbpubkey",
9872 private_key: "testkey.pem",
9873 }
9874
9875 rust_binary {
9876 name: "mybin.rust",
9877 srcs: ["foo.rs"],
9878 static_executable: true,
9879 apex_available: ["myapex"],
9880 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009881 }
9882 `)
9883}
9884
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009885func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9886 ctx := testApex(t, `
9887 apex {
9888 name: "myapex",
9889 key: "myapex.key",
9890 updatable: false,
9891 java_libs: ["foo"],
9892 }
9893
9894 apex_key {
9895 name: "myapex.key",
9896 public_key: "testkey.avbpubkey",
9897 private_key: "testkey.pem",
9898 }
9899
9900 java_library {
9901 name: "foo",
9902 srcs: ["foo.java"],
9903 apex_available: ["myapex"],
9904 installable: true,
9905 }
9906 `,
9907 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9908 )
9909
9910 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9911 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9912 var builder strings.Builder
9913 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9914 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009915 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009916}
9917
9918func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9919 ctx := testApex(t, `
9920 prebuilt_apex {
9921 name: "myapex",
9922 arch: {
9923 arm64: {
9924 src: "myapex-arm64.apex",
9925 },
9926 arm: {
9927 src: "myapex-arm.apex",
9928 },
9929 },
9930 exported_java_libs: ["foo"],
9931 }
9932
9933 java_import {
9934 name: "foo",
9935 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009936 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009937 }
9938 `,
9939 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9940 )
9941
9942 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9943 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9944 mainModuleEntries := entriesList[0]
9945 android.AssertArrayString(t,
9946 "LOCAL_REQUIRED_MODULES",
9947 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9948 []string{
9949 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9950 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9951 })
9952}
9953
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009954func TestAndroidMk_RequiredModules(t *testing.T) {
9955 ctx := testApex(t, `
9956 apex {
9957 name: "myapex",
9958 key: "myapex.key",
9959 updatable: false,
9960 java_libs: ["foo"],
9961 required: ["otherapex"],
9962 }
9963
9964 apex {
9965 name: "otherapex",
9966 key: "myapex.key",
9967 updatable: false,
9968 java_libs: ["foo"],
9969 required: ["otherapex"],
9970 }
9971
9972 apex_key {
9973 name: "myapex.key",
9974 public_key: "testkey.avbpubkey",
9975 private_key: "testkey.pem",
9976 }
9977
9978 java_library {
9979 name: "foo",
9980 srcs: ["foo.java"],
9981 apex_available: ["myapex", "otherapex"],
9982 installable: true,
9983 }
9984 `)
9985
9986 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9987 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9988 var builder strings.Builder
9989 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9990 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009991 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009992}
9993
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009994func TestAndroidMk_RequiredDeps(t *testing.T) {
9995 ctx := testApex(t, `
9996 apex {
9997 name: "myapex",
9998 key: "myapex.key",
9999 updatable: false,
10000 }
10001
10002 apex_key {
10003 name: "myapex.key",
10004 public_key: "testkey.avbpubkey",
10005 private_key: "testkey.pem",
10006 }
10007 `)
10008
10009 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010010 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010011 data := android.AndroidMkDataForTest(t, ctx, bundle)
10012 var builder strings.Builder
10013 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10014 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +000010015 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010016
10017 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010018 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010019 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
10020 var flattenedBuilder strings.Builder
10021 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
10022 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -080010023 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010024}
10025
Jooyung Hana6d36672022-02-24 13:58:07 +090010026func TestApexOutputFileProducer(t *testing.T) {
10027 for _, tc := range []struct {
10028 name string
10029 ref string
10030 expected_data []string
10031 }{
10032 {
10033 name: "test_using_output",
10034 ref: ":myapex",
10035 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
10036 },
10037 {
10038 name: "test_using_apex",
10039 ref: ":myapex{.apex}",
10040 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
10041 },
10042 } {
10043 t.Run(tc.name, func(t *testing.T) {
10044 ctx := testApex(t, `
10045 apex {
10046 name: "myapex",
10047 key: "myapex.key",
10048 compressible: true,
10049 updatable: false,
10050 }
10051
10052 apex_key {
10053 name: "myapex.key",
10054 public_key: "testkey.avbpubkey",
10055 private_key: "testkey.pem",
10056 }
10057
10058 java_test {
10059 name: "`+tc.name+`",
10060 srcs: ["a.java"],
10061 data: ["`+tc.ref+`"],
10062 }
10063 `,
10064 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10065 variables.CompressedApex = proptools.BoolPtr(true)
10066 }))
10067 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10068 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10069 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10070 })
10071 }
10072}
10073
satayev758968a2021-12-06 11:42:40 +000010074func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10075 preparer := android.GroupFixturePreparers(
10076 PrepareForTestWithApexBuildComponents,
10077 prepareForTestWithMyapex,
10078 java.PrepareForTestWithJavaSdkLibraryFiles,
10079 java.PrepareForTestWithJavaDefaultModules,
10080 android.PrepareForTestWithAndroidBuildComponents,
10081 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10082 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10083 )
10084
10085 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10086 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10087 preparer.RunTestWithBp(t, `
10088 apex {
10089 name: "myapex",
10090 key: "myapex.key",
10091 bootclasspath_fragments: ["mybootclasspathfragment"],
10092 min_sdk_version: "30",
10093 updatable: false,
10094 }
10095
10096 apex_key {
10097 name: "myapex.key",
10098 public_key: "testkey.avbpubkey",
10099 private_key: "testkey.pem",
10100 }
10101
10102 bootclasspath_fragment {
10103 name: "mybootclasspathfragment",
10104 contents: ["mybootclasspathlib"],
10105 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010106 hidden_api: {
10107 split_packages: ["*"],
10108 },
satayev758968a2021-12-06 11:42:40 +000010109 }
10110
10111 java_sdk_library {
10112 name: "mybootclasspathlib",
10113 srcs: ["mybootclasspathlib.java"],
10114 apex_available: ["myapex"],
10115 compile_dex: true,
10116 unsafe_ignore_missing_latest_api: true,
10117 min_sdk_version: "31",
10118 static_libs: ["util"],
10119 }
10120
10121 java_library {
10122 name: "util",
10123 srcs: ["a.java"],
10124 apex_available: ["myapex"],
10125 min_sdk_version: "31",
10126 static_libs: ["another_util"],
10127 }
10128
10129 java_library {
10130 name: "another_util",
10131 srcs: ["a.java"],
10132 min_sdk_version: "31",
10133 apex_available: ["myapex"],
10134 }
10135 `)
10136 })
10137
10138 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10139 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10140 preparer.RunTestWithBp(t, `
10141 apex {
10142 name: "myapex",
10143 key: "myapex.key",
10144 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10145 min_sdk_version: "30",
10146 updatable: false,
10147 }
10148
10149 apex_key {
10150 name: "myapex.key",
10151 public_key: "testkey.avbpubkey",
10152 private_key: "testkey.pem",
10153 }
10154
10155 systemserverclasspath_fragment {
10156 name: "mysystemserverclasspathfragment",
10157 contents: ["mysystemserverclasspathlib"],
10158 apex_available: ["myapex"],
10159 }
10160
10161 java_sdk_library {
10162 name: "mysystemserverclasspathlib",
10163 srcs: ["mysystemserverclasspathlib.java"],
10164 apex_available: ["myapex"],
10165 compile_dex: true,
10166 min_sdk_version: "32",
10167 unsafe_ignore_missing_latest_api: true,
10168 static_libs: ["util"],
10169 }
10170
10171 java_library {
10172 name: "util",
10173 srcs: ["a.java"],
10174 apex_available: ["myapex"],
10175 min_sdk_version: "31",
10176 static_libs: ["another_util"],
10177 }
10178
10179 java_library {
10180 name: "another_util",
10181 srcs: ["a.java"],
10182 min_sdk_version: "31",
10183 apex_available: ["myapex"],
10184 }
10185 `)
10186 })
10187
10188 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10189 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10190 RunTestWithBp(t, `
10191 apex {
10192 name: "myapex",
10193 key: "myapex.key",
10194 bootclasspath_fragments: ["mybootclasspathfragment"],
10195 min_sdk_version: "30",
10196 updatable: false,
10197 }
10198
10199 apex_key {
10200 name: "myapex.key",
10201 public_key: "testkey.avbpubkey",
10202 private_key: "testkey.pem",
10203 }
10204
10205 bootclasspath_fragment {
10206 name: "mybootclasspathfragment",
10207 contents: ["mybootclasspathlib"],
10208 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010209 hidden_api: {
10210 split_packages: ["*"],
10211 },
satayev758968a2021-12-06 11:42:40 +000010212 }
10213
10214 java_sdk_library {
10215 name: "mybootclasspathlib",
10216 srcs: ["mybootclasspathlib.java"],
10217 apex_available: ["myapex"],
10218 compile_dex: true,
10219 unsafe_ignore_missing_latest_api: true,
10220 }
10221 `)
10222 })
10223
10224 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10225 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10226 RunTestWithBp(t, `
10227 apex {
10228 name: "myapex",
10229 key: "myapex.key",
10230 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10231 min_sdk_version: "30",
10232 updatable: false,
10233 }
10234
10235 apex_key {
10236 name: "myapex.key",
10237 public_key: "testkey.avbpubkey",
10238 private_key: "testkey.pem",
10239 }
10240
10241 systemserverclasspath_fragment {
10242 name: "mysystemserverclasspathfragment",
10243 contents: ["mysystemserverclasspathlib"],
10244 apex_available: ["myapex"],
10245 }
10246
10247 java_sdk_library {
10248 name: "mysystemserverclasspathlib",
10249 srcs: ["mysystemserverclasspathlib.java"],
10250 apex_available: ["myapex"],
10251 compile_dex: true,
10252 unsafe_ignore_missing_latest_api: true,
10253 }
10254 `)
10255 })
10256}
10257
Jiakai Zhang6decef92022-01-12 17:56:19 +000010258// Verifies that the APEX depends on all the Make modules in the list.
10259func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10260 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10261 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010262 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010263 }
10264}
10265
10266// Verifies that the APEX does not depend on any of the Make modules in the list.
10267func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10268 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10269 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010270 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010271 }
10272}
10273
Cole Faust1021ccd2023-02-26 21:15:25 -080010274// TODO(b/193460475): Re-enable this test
10275//func TestApexStrictUpdtabilityLint(t *testing.T) {
10276// bpTemplate := `
10277// apex {
10278// name: "myapex",
10279// key: "myapex.key",
10280// java_libs: ["myjavalib"],
10281// updatable: %v,
10282// min_sdk_version: "29",
10283// }
10284// apex_key {
10285// name: "myapex.key",
10286// }
10287// java_library {
10288// name: "myjavalib",
10289// srcs: ["MyClass.java"],
10290// apex_available: [ "myapex" ],
10291// lint: {
10292// strict_updatability_linting: %v,
10293// },
10294// sdk_version: "current",
10295// min_sdk_version: "29",
10296// }
10297// `
10298// fs := android.MockFS{
10299// "lint-baseline.xml": nil,
10300// }
10301//
10302// testCases := []struct {
10303// testCaseName string
10304// apexUpdatable bool
10305// javaStrictUpdtabilityLint bool
10306// lintFileExists bool
10307// disallowedFlagExpected bool
10308// }{
10309// {
10310// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10311// apexUpdatable: true,
10312// javaStrictUpdtabilityLint: true,
10313// lintFileExists: false,
10314// disallowedFlagExpected: false,
10315// },
10316// {
10317// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10318// apexUpdatable: false,
10319// javaStrictUpdtabilityLint: false,
10320// lintFileExists: true,
10321// disallowedFlagExpected: false,
10322// },
10323// {
10324// testCaseName: "non-updatable apex respects strict updatability of javalib",
10325// apexUpdatable: false,
10326// javaStrictUpdtabilityLint: true,
10327// lintFileExists: true,
10328// disallowedFlagExpected: true,
10329// },
10330// {
10331// testCaseName: "updatable apex sets strict updatability of javalib to true",
10332// apexUpdatable: true,
10333// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10334// lintFileExists: true,
10335// disallowedFlagExpected: true,
10336// },
10337// }
10338//
10339// for _, testCase := range testCases {
10340// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10341// fixtures := []android.FixturePreparer{}
10342// if testCase.lintFileExists {
10343// fixtures = append(fixtures, fs.AddToFixture())
10344// }
10345//
10346// result := testApex(t, bp, fixtures...)
10347// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10348// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10349// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10350//
10351// if disallowedFlagActual != testCase.disallowedFlagExpected {
10352// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10353// }
10354// }
10355//}
10356//
10357//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10358// bp := `
10359// apex {
10360// name: "myapex",
10361// key: "myapex.key",
10362// java_libs: ["myjavalib"],
10363// updatable: true,
10364// min_sdk_version: "29",
10365// }
10366// apex_key {
10367// name: "myapex.key",
10368// }
10369// java_library {
10370// name: "myjavalib",
10371// srcs: ["MyClass.java"],
10372// apex_available: [ "myapex" ],
10373// sdk_version: "current",
10374// min_sdk_version: "29",
10375// }
10376// `
10377//
10378// testCases := []struct {
10379// testCaseName string
10380// moduleDirectory string
10381// disallowedFlagExpected bool
10382// }{
10383// {
10384// testCaseName: "lintable module defined outside libcore",
10385// moduleDirectory: "",
10386// disallowedFlagExpected: true,
10387// },
10388// {
10389// testCaseName: "lintable module defined in libcore root directory",
10390// moduleDirectory: "libcore/",
10391// disallowedFlagExpected: false,
10392// },
10393// {
10394// testCaseName: "lintable module defined in libcore child directory",
10395// moduleDirectory: "libcore/childdir/",
10396// disallowedFlagExpected: true,
10397// },
10398// }
10399//
10400// for _, testCase := range testCases {
10401// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10402// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10403// result := testApex(t, "", lintFileCreator, bpFileCreator)
10404// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10405// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10406// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10407// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10408//
10409// if disallowedFlagActual != testCase.disallowedFlagExpected {
10410// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10411// }
10412// }
10413//}
10414//
10415//// checks transtive deps of an apex coming from bootclasspath_fragment
10416//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10417// bp := `
10418// apex {
10419// name: "myapex",
10420// key: "myapex.key",
10421// bootclasspath_fragments: ["mybootclasspathfragment"],
10422// updatable: true,
10423// min_sdk_version: "29",
10424// }
10425// apex_key {
10426// name: "myapex.key",
10427// }
10428// bootclasspath_fragment {
10429// name: "mybootclasspathfragment",
10430// contents: ["myjavalib"],
10431// apex_available: ["myapex"],
10432// hidden_api: {
10433// split_packages: ["*"],
10434// },
10435// }
10436// java_library {
10437// name: "myjavalib",
10438// srcs: ["MyClass.java"],
10439// apex_available: [ "myapex" ],
10440// sdk_version: "current",
10441// min_sdk_version: "29",
10442// compile_dex: true,
10443// }
10444// `
10445// fs := android.MockFS{
10446// "lint-baseline.xml": nil,
10447// }
10448//
10449// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10450// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10451// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10452// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10453// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10454// }
10455//}
Spandan Das66773252022-01-15 00:23:18 +000010456
Spandan Das42e89502022-05-06 22:12:55 +000010457// updatable apexes should propagate updatable=true to its apps
10458func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10459 bp := `
10460 apex {
10461 name: "myapex",
10462 key: "myapex.key",
10463 updatable: %v,
10464 apps: [
10465 "myapp",
10466 ],
10467 min_sdk_version: "30",
10468 }
10469 apex_key {
10470 name: "myapex.key",
10471 }
10472 android_app {
10473 name: "myapp",
10474 updatable: %v,
10475 apex_available: [
10476 "myapex",
10477 ],
10478 sdk_version: "current",
10479 min_sdk_version: "30",
10480 }
10481 `
10482 testCases := []struct {
10483 name string
10484 apex_is_updatable_bp bool
10485 app_is_updatable_bp bool
10486 app_is_updatable_expected bool
10487 }{
10488 {
10489 name: "Non-updatable apex respects updatable property of non-updatable app",
10490 apex_is_updatable_bp: false,
10491 app_is_updatable_bp: false,
10492 app_is_updatable_expected: false,
10493 },
10494 {
10495 name: "Non-updatable apex respects updatable property of updatable app",
10496 apex_is_updatable_bp: false,
10497 app_is_updatable_bp: true,
10498 app_is_updatable_expected: true,
10499 },
10500 {
10501 name: "Updatable apex respects updatable property of updatable app",
10502 apex_is_updatable_bp: true,
10503 app_is_updatable_bp: true,
10504 app_is_updatable_expected: true,
10505 },
10506 {
10507 name: "Updatable apex sets updatable=true on non-updatable app",
10508 apex_is_updatable_bp: true,
10509 app_is_updatable_bp: false,
10510 app_is_updatable_expected: true,
10511 },
10512 }
10513 for _, testCase := range testCases {
10514 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10515 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10516 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10517 }
10518}
10519
Kiyoung Kim487689e2022-07-26 09:48:22 +090010520func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10521 bp := `
10522 apex {
10523 name: "myapex",
10524 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010525 native_shared_libs: ["libbaz"],
10526 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010527 min_sdk_version: "29",
10528 }
10529 apex_key {
10530 name: "myapex.key",
10531 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010532 cc_binary {
10533 name: "binfoo",
10534 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010535 apex_available: ["myapex"],
10536 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010537 recovery_available: false,
10538 }
10539 cc_library {
10540 name: "libbar",
10541 srcs: ["libbar.cc"],
10542 stubs: {
10543 symbol_file: "libbar.map.txt",
10544 versions: [
10545 "29",
10546 ],
10547 },
10548 }
10549 cc_library {
10550 name: "libbaz",
10551 srcs: ["libbaz.cc"],
10552 apex_available: ["myapex"],
10553 min_sdk_version: "29",
10554 stubs: {
10555 symbol_file: "libbaz.map.txt",
10556 versions: [
10557 "29",
10558 ],
10559 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010560 }
10561 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010562 name: "libbar",
10563 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010564 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010565 variants: ["apex.29"],
10566 }
10567 cc_api_variant {
10568 name: "libbar",
10569 variant: "apex",
10570 version: "29",
10571 src: "libbar_apex_29.so",
10572 }
10573 cc_api_library {
10574 name: "libbaz",
10575 src: "libbaz_stub.so",
10576 min_sdk_version: "29",
10577 variants: ["apex.29"],
10578 }
10579 cc_api_variant {
10580 name: "libbaz",
10581 variant: "apex",
10582 version: "29",
10583 src: "libbaz_apex_29.so",
10584 }
10585 cc_api_library {
10586 name: "libqux",
10587 src: "libqux_stub.so",
10588 min_sdk_version: "29",
10589 variants: ["apex.29"],
10590 }
10591 cc_api_variant {
10592 name: "libqux",
10593 variant: "apex",
10594 version: "29",
10595 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010596 }
10597 api_imports {
10598 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010599 apex_shared_libs: [
10600 "libbar",
10601 "libbaz",
10602 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010603 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010604 }
10605 `
10606 result := testApex(t, bp)
10607
10608 hasDep := func(m android.Module, wantDep android.Module) bool {
10609 t.Helper()
10610 var found bool
10611 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10612 if dep == wantDep {
10613 found = true
10614 }
10615 })
10616 return found
10617 }
10618
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010619 // Library defines stubs and cc_api_library should be used with cc_api_library
10620 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10621 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10622 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010623
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010624 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10625 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010626
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010627 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10628 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10629 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10630 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10631
10632 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10633 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10634 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10635 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10636 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10637
10638 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10639 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10640 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10641
10642 // cc_api_library defined without original library should be linked with cc_api_library
10643 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10644 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10645 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10646}
10647
10648func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10649 bp := `
10650 apex {
10651 name: "myapex",
10652 key: "myapex.key",
10653 native_shared_libs: ["libbar"],
10654 min_sdk_version: "29",
10655 }
10656 apex_key {
10657 name: "myapex.key",
10658 }
10659 cc_binary {
10660 name: "binfoo",
10661 shared_libs: ["libbar"],
10662 recovery_available: false,
10663 }
10664 cc_library {
10665 name: "libbar",
10666 srcs: ["libbar.cc"],
10667 apex_available: ["myapex"],
10668 min_sdk_version: "29",
10669 stubs: {
10670 symbol_file: "libbar.map.txt",
10671 versions: [
10672 "29",
10673 ],
10674 },
10675 }
10676 cc_api_library {
10677 name: "libbar",
10678 src: "libbar_stub.so",
10679 variants: ["apex.29"],
10680 }
10681 cc_api_variant {
10682 name: "libbar",
10683 variant: "apex",
10684 version: "29",
10685 src: "libbar_apex_29.so",
10686 }
10687 api_imports {
10688 name: "api_imports",
10689 apex_shared_libs: [
10690 "libbar",
10691 ],
10692 }
10693 `
10694
10695 result := testApex(t, bp)
10696
10697 hasDep := func(m android.Module, wantDep android.Module) bool {
10698 t.Helper()
10699 var found bool
10700 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10701 if dep == wantDep {
10702 found = true
10703 }
10704 })
10705 return found
10706 }
10707
10708 // Library defines stubs and cc_api_library should be used with cc_api_library
10709 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10710 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10711 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10712
10713 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10714 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10715
10716 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10717 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10718 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10719 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010720}
Dennis Shend4f5d932023-01-31 20:27:21 +000010721
10722func TestTrimmedApex(t *testing.T) {
10723 bp := `
10724 apex {
10725 name: "myapex",
10726 key: "myapex.key",
10727 native_shared_libs: ["libfoo","libbaz"],
10728 min_sdk_version: "29",
10729 trim_against: "mydcla",
10730 }
10731 apex {
10732 name: "mydcla",
10733 key: "myapex.key",
10734 native_shared_libs: ["libfoo","libbar"],
10735 min_sdk_version: "29",
10736 file_contexts: ":myapex-file_contexts",
10737 dynamic_common_lib_apex: true,
10738 }
10739 apex_key {
10740 name: "myapex.key",
10741 }
10742 cc_library {
10743 name: "libfoo",
10744 shared_libs: ["libc"],
10745 apex_available: ["myapex","mydcla"],
10746 min_sdk_version: "29",
10747 }
10748 cc_library {
10749 name: "libbar",
10750 shared_libs: ["libc"],
10751 apex_available: ["myapex","mydcla"],
10752 min_sdk_version: "29",
10753 }
10754 cc_library {
10755 name: "libbaz",
10756 shared_libs: ["libc"],
10757 apex_available: ["myapex","mydcla"],
10758 min_sdk_version: "29",
10759 }
10760 cc_api_library {
10761 name: "libc",
10762 src: "libc.so",
10763 min_sdk_version: "29",
10764 recovery_available: true,
10765 }
10766 api_imports {
10767 name: "api_imports",
10768 shared_libs: [
10769 "libc",
10770 ],
10771 header_libs: [],
10772 }
10773 `
10774 ctx := testApex(t, bp)
10775 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10776 apexRule := module.MaybeRule("apexRule")
10777 if apexRule.Rule == nil {
10778 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10779 }
10780
10781 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10782 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10783 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10784 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10785 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10786 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10787}
Jingwen Chendea7a642023-03-28 11:30:50 +000010788
10789func TestCannedFsConfig(t *testing.T) {
10790 ctx := testApex(t, `
10791 apex {
10792 name: "myapex",
10793 key: "myapex.key",
10794 updatable: false,
10795 }
10796
10797 apex_key {
10798 name: "myapex.key",
10799 public_key: "testkey.avbpubkey",
10800 private_key: "testkey.pem",
10801 }`)
10802 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10803 generateFsRule := mod.Rule("generateFsConfig")
10804 cmd := generateFsRule.RuleParams.Command
10805
10806 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10807}
10808
10809func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10810 ctx := testApex(t, `
10811 apex {
10812 name: "myapex",
10813 key: "myapex.key",
10814 canned_fs_config: "my_config",
10815 updatable: false,
10816 }
10817
10818 apex_key {
10819 name: "myapex.key",
10820 public_key: "testkey.avbpubkey",
10821 private_key: "testkey.pem",
10822 }`)
10823 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10824 generateFsRule := mod.Rule("generateFsConfig")
10825 cmd := generateFsRule.RuleParams.Command
10826
10827 // Ensure that canned_fs_config has "cat my_config" at the end
10828 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10829}
Spandan Das20fce2d2023-04-12 17:21:39 +000010830
10831func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10832 testCases := []struct {
10833 desc string
10834 hasStubs bool
10835 apexAvailable string
10836 expectedError string
10837 }{
10838 {
10839 desc: "non-stub library can have multiple apex_available",
10840 hasStubs: false,
10841 apexAvailable: `["myapex", "otherapex"]`,
10842 },
10843 {
10844 desc: "stub library should not be available to anyapex",
10845 hasStubs: true,
10846 apexAvailable: `["//apex_available:anyapex"]`,
10847 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10848 },
10849 {
10850 desc: "stub library should not be available to multiple apexes",
10851 hasStubs: true,
10852 apexAvailable: `["myapex", "otherapex"]`,
10853 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10854 },
10855 {
10856 desc: "stub library can be available to a core apex and a test apex",
10857 hasStubs: true,
10858 apexAvailable: `["myapex", "test_myapex"]`,
10859 },
10860 }
10861 bpTemplate := `
10862 cc_library {
10863 name: "libfoo",
10864 %v
10865 apex_available: %v,
10866 }
10867 apex {
10868 name: "myapex",
10869 key: "apex.key",
10870 updatable: false,
10871 native_shared_libs: ["libfoo"],
10872 }
10873 apex {
10874 name: "otherapex",
10875 key: "apex.key",
10876 updatable: false,
10877 }
10878 apex_test {
10879 name: "test_myapex",
10880 key: "apex.key",
10881 updatable: false,
10882 native_shared_libs: ["libfoo"],
10883 }
10884 apex_key {
10885 name: "apex.key",
10886 }
10887 `
10888 for _, tc := range testCases {
10889 stubs := ""
10890 if tc.hasStubs {
10891 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10892 }
10893 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10894 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10895 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10896 })
10897 if tc.expectedError == "" {
10898 testApex(t, bp, mockFsFixturePreparer)
10899 } else {
10900 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10901 }
10902 }
10903}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010904
10905func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10906 context := android.GroupFixturePreparers(
10907 android.PrepareForIntegrationTestWithAndroid,
10908 cc.PrepareForIntegrationTestWithCc,
10909 PrepareForTestWithApexBuildComponents,
10910 prepareForTestWithMyapex,
10911 filesystem.PrepareForTestWithFilesystemBuildComponents,
10912 )
10913 result := context.RunTestWithBp(t, `
10914 android_system_image {
10915 name: "myfilesystem",
10916 deps: [
10917 "libfoo",
10918 ],
10919 linker_config_src: "linker.config.json",
10920 }
10921
10922 cc_library {
10923 name: "libfoo",
10924 shared_libs: [
10925 "libbar",
10926 ],
10927 stl: "none",
10928 }
10929
10930 cc_library {
10931 name: "libbar",
10932 stl: "none",
10933 apex_available: ["myapex"],
10934 }
10935
10936 apex {
10937 name: "myapex",
10938 native_shared_libs: ["libbar"],
10939 key: "myapex.key",
10940 updatable: false,
10941 }
10942
10943 apex_key {
10944 name: "myapex.key",
10945 public_key: "testkey.avbpubkey",
10946 private_key: "testkey.pem",
10947 }
10948 `)
10949
10950 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10951 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10952 inputs.Strings(),
10953 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10954}