blob: da059eb0a28c1ae73ef78f08af3e58a4562ed31e [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"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400393 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900394 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"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002797 binaries: ["mybin", "mybin.rust"],
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 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002832
2833 rust_binary {
2834 name: "mybin.rust",
2835 srcs: ["foo.rs"],
2836 relative_install_path: "rust_subdir",
2837 apex_available: [ "myapex" ],
2838 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002839 `)
2840
Sundong Ahnabb64432019-10-22 13:58:29 +09002841 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002842 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002843
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002844 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002845 ensureContains(t, cmd, "/etc ")
2846 ensureContains(t, cmd, "/etc/foo ")
2847 ensureContains(t, cmd, "/etc/foo/bar ")
2848 ensureContains(t, cmd, "/lib64 ")
2849 ensureContains(t, cmd, "/lib64/foo ")
2850 ensureContains(t, cmd, "/lib64/foo/bar ")
2851 ensureContains(t, cmd, "/lib ")
2852 ensureContains(t, cmd, "/lib/foo ")
2853 ensureContains(t, cmd, "/lib/foo/bar ")
2854 ensureContains(t, cmd, "/bin ")
2855 ensureContains(t, cmd, "/bin/foo ")
2856 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002857 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002858}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002859
Jooyung Han35155c42020-02-06 17:33:20 +09002860func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002861 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002862 apex {
2863 name: "myapex",
2864 key: "myapex.key",
2865 multilib: {
2866 both: {
2867 native_shared_libs: ["mylib"],
2868 binaries: ["mybin"],
2869 },
2870 },
2871 compile_multilib: "both",
2872 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002873 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002874 }
2875
2876 apex_key {
2877 name: "myapex.key",
2878 public_key: "testkey.avbpubkey",
2879 private_key: "testkey.pem",
2880 }
2881
2882 cc_library {
2883 name: "mylib",
2884 relative_install_path: "foo/bar",
2885 system_shared_libs: [],
2886 stl: "none",
2887 apex_available: [ "myapex" ],
2888 native_bridge_supported: true,
2889 }
2890
2891 cc_binary {
2892 name: "mybin",
2893 relative_install_path: "foo/bar",
2894 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002895 stl: "none",
2896 apex_available: [ "myapex" ],
2897 native_bridge_supported: true,
2898 compile_multilib: "both", // default is "first" for binary
2899 multilib: {
2900 lib64: {
2901 suffix: "64",
2902 },
2903 },
2904 }
2905 `, withNativeBridgeEnabled)
2906 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2907 "bin/foo/bar/mybin",
2908 "bin/foo/bar/mybin64",
2909 "bin/arm/foo/bar/mybin",
2910 "bin/arm64/foo/bar/mybin64",
2911 "lib/foo/bar/mylib.so",
2912 "lib/arm/foo/bar/mylib.so",
2913 "lib64/foo/bar/mylib.so",
2914 "lib64/arm64/foo/bar/mylib.so",
2915 })
2916}
2917
Jooyung Han85d61762020-06-24 23:50:26 +09002918func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002919 result := android.GroupFixturePreparers(
2920 prepareForApexTest,
2921 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2922 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002923 apex {
2924 name: "myapex",
2925 key: "myapex.key",
2926 binaries: ["mybin"],
2927 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002928 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002929 }
2930 apex_key {
2931 name: "myapex.key",
2932 public_key: "testkey.avbpubkey",
2933 private_key: "testkey.pem",
2934 }
2935 cc_binary {
2936 name: "mybin",
2937 vendor: true,
2938 shared_libs: ["libfoo"],
2939 }
2940 cc_library {
2941 name: "libfoo",
2942 proprietary: true,
2943 }
2944 `)
2945
Colin Crossc68db4b2021-11-11 18:59:15 -08002946 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002947 "bin/mybin",
2948 "lib64/libfoo.so",
2949 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2950 "lib64/libc++.so",
2951 })
2952
Colin Crossc68db4b2021-11-11 18:59:15 -08002953 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2954 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002955 name := apexBundle.BaseModuleName()
2956 prefix := "TARGET_"
2957 var builder strings.Builder
2958 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002959 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002960 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002961 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002962
Colin Crossc68db4b2021-11-11 18:59:15 -08002963 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002964 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2965 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002966}
2967
Jooyung Hanc5a96762022-02-04 11:54:50 +09002968func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2969 testApexError(t, `Trying to include a VNDK library`, `
2970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
2973 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2974 vendor: true,
2975 use_vndk_as_stable: true,
2976 updatable: false,
2977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }`)
2983}
2984
Jooyung Handf78e212020-07-22 15:54:47 +09002985func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002986 // myapex myapex2
2987 // | |
2988 // mybin ------. mybin2
2989 // \ \ / |
2990 // (stable) .---\--------` |
2991 // \ / \ |
2992 // \ / \ /
2993 // libvndk libvendor
2994 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002995 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002996 apex {
2997 name: "myapex",
2998 key: "myapex.key",
2999 binaries: ["mybin"],
3000 vendor: true,
3001 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003002 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09003003 }
3004 apex_key {
3005 name: "myapex.key",
3006 public_key: "testkey.avbpubkey",
3007 private_key: "testkey.pem",
3008 }
3009 cc_binary {
3010 name: "mybin",
3011 vendor: true,
3012 shared_libs: ["libvndk", "libvendor"],
3013 }
3014 cc_library {
3015 name: "libvndk",
3016 vndk: {
3017 enabled: true,
3018 },
3019 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003020 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003021 }
3022 cc_library {
3023 name: "libvendor",
3024 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003025 stl: "none",
3026 }
3027 apex {
3028 name: "myapex2",
3029 key: "myapex.key",
3030 binaries: ["mybin2"],
3031 vendor: true,
3032 use_vndk_as_stable: false,
3033 updatable: false,
3034 }
3035 cc_binary {
3036 name: "mybin2",
3037 vendor: true,
3038 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003039 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003040 `,
3041 android.FixtureModifyConfig(func(config android.Config) {
3042 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3043 }),
3044 )
Jooyung Handf78e212020-07-22 15:54:47 +09003045
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003046 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003047
Jooyung Han91f92032022-02-04 12:36:33 +09003048 for _, tc := range []struct {
3049 name string
3050 apexName string
3051 moduleName string
3052 moduleVariant string
3053 libs []string
3054 contents []string
3055 requireVndkNamespace bool
3056 }{
3057 {
3058 name: "use_vndk_as_stable",
3059 apexName: "myapex",
3060 moduleName: "mybin",
3061 moduleVariant: vendorVariant + "_apex10000",
3062 libs: []string{
3063 // should link with vendor variants of VNDK libs(libvndk/libc++)
3064 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3065 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3066 // unstable Vendor libs as APEX variant
3067 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3068 },
3069 contents: []string{
3070 "bin/mybin",
3071 "lib64/libvendor.so",
3072 // VNDK libs (libvndk/libc++) are not included
3073 },
3074 requireVndkNamespace: true,
3075 },
3076 {
3077 name: "!use_vndk_as_stable",
3078 apexName: "myapex2",
3079 moduleName: "mybin2",
3080 moduleVariant: vendorVariant + "_myapex2",
3081 libs: []string{
3082 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3083 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3084 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3085 // unstable vendor libs have "merged" APEX variants
3086 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3087 },
3088 contents: []string{
3089 "bin/mybin2",
3090 "lib64/libvendor.so",
3091 // VNDK libs are included as well
3092 "lib64/libvndk.so",
3093 "lib64/libc++.so",
3094 },
3095 requireVndkNamespace: false,
3096 },
3097 } {
3098 t.Run(tc.name, func(t *testing.T) {
3099 // Check linked libs
3100 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3101 libs := names(ldRule.Args["libFlags"])
3102 for _, lib := range tc.libs {
3103 ensureListContains(t, libs, lib)
3104 }
3105 // Check apex contents
3106 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003107
Jooyung Han91f92032022-02-04 12:36:33 +09003108 // Check "requireNativeLibs"
3109 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3110 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3111 if tc.requireVndkNamespace {
3112 ensureListContains(t, requireNativeLibs, ":vndk")
3113 } else {
3114 ensureListNotContains(t, requireNativeLibs, ":vndk")
3115 }
3116 })
3117 }
Jooyung Handf78e212020-07-22 15:54:47 +09003118}
3119
Justin Yun13decfb2021-03-08 19:25:55 +09003120func TestProductVariant(t *testing.T) {
3121 ctx := testApex(t, `
3122 apex {
3123 name: "myapex",
3124 key: "myapex.key",
3125 updatable: false,
3126 product_specific: true,
3127 binaries: ["foo"],
3128 }
3129
3130 apex_key {
3131 name: "myapex.key",
3132 public_key: "testkey.avbpubkey",
3133 private_key: "testkey.pem",
3134 }
3135
3136 cc_binary {
3137 name: "foo",
3138 product_available: true,
3139 apex_available: ["myapex"],
3140 srcs: ["foo.cpp"],
3141 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003142 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3143 variables.ProductVndkVersion = proptools.StringPtr("current")
3144 }),
3145 )
Justin Yun13decfb2021-03-08 19:25:55 +09003146
3147 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003148 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003149 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3150 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3151 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3152 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3153}
3154
Jooyung Han8e5685d2020-09-21 11:02:57 +09003155func TestApex_withPrebuiltFirmware(t *testing.T) {
3156 testCases := []struct {
3157 name string
3158 additionalProp string
3159 }{
3160 {"system apex with prebuilt_firmware", ""},
3161 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3162 }
3163 for _, tc := range testCases {
3164 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003165 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003166 apex {
3167 name: "myapex",
3168 key: "myapex.key",
3169 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003170 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003171 `+tc.additionalProp+`
3172 }
3173 apex_key {
3174 name: "myapex.key",
3175 public_key: "testkey.avbpubkey",
3176 private_key: "testkey.pem",
3177 }
3178 prebuilt_firmware {
3179 name: "myfirmware",
3180 src: "myfirmware.bin",
3181 filename_from_src: true,
3182 `+tc.additionalProp+`
3183 }
3184 `)
3185 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3186 "etc/firmware/myfirmware.bin",
3187 })
3188 })
3189 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003190}
3191
Jooyung Hanefb184e2020-06-25 17:14:25 +09003192func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003193 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003194 apex {
3195 name: "myapex",
3196 key: "myapex.key",
3197 vendor: true,
3198 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003199 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003200 }
3201
3202 apex_key {
3203 name: "myapex.key",
3204 public_key: "testkey.avbpubkey",
3205 private_key: "testkey.pem",
3206 }
3207
3208 cc_library {
3209 name: "mylib",
3210 vendor_available: true,
3211 }
3212 `)
3213
3214 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003215 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003216 name := apexBundle.BaseModuleName()
3217 prefix := "TARGET_"
3218 var builder strings.Builder
3219 data.Custom(&builder, name, prefix, "", data)
3220 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003221 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003222}
3223
Jooyung Han2ed99d02020-06-24 23:26:26 +09003224func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003225 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003226 apex {
3227 name: "myapex",
3228 key: "myapex.key",
3229 vintf_fragments: ["fragment.xml"],
3230 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003231 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003232 }
3233 apex_key {
3234 name: "myapex.key",
3235 public_key: "testkey.avbpubkey",
3236 private_key: "testkey.pem",
3237 }
3238 cc_binary {
3239 name: "mybin",
3240 }
3241 `)
3242
3243 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003244 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003245 name := apexBundle.BaseModuleName()
3246 prefix := "TARGET_"
3247 var builder strings.Builder
3248 data.Custom(&builder, name, prefix, "", data)
3249 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003250 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003251 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003252}
3253
Jiyong Park16e91a02018-12-20 18:18:08 +09003254func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003255 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003256 apex {
3257 name: "myapex",
3258 key: "myapex.key",
3259 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003260 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003261 }
3262
3263 apex_key {
3264 name: "myapex.key",
3265 public_key: "testkey.avbpubkey",
3266 private_key: "testkey.pem",
3267 }
3268
3269 cc_library {
3270 name: "mylib",
3271 srcs: ["mylib.cpp"],
3272 system_shared_libs: [],
3273 stl: "none",
3274 stubs: {
3275 versions: ["1", "2", "3"],
3276 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003277 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003278 }
3279
3280 cc_binary {
3281 name: "not_in_apex",
3282 srcs: ["mylib.cpp"],
3283 static_libs: ["mylib"],
3284 static_executable: true,
3285 system_shared_libs: [],
3286 stl: "none",
3287 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003288 `)
3289
Colin Cross7113d202019-11-20 16:39:12 -08003290 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003291
3292 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003293 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003294}
Jiyong Park9335a262018-12-24 11:31:58 +09003295
3296func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003297 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003298 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003299 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003300 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003301 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003302 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003303 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003305 }
3306
3307 cc_library {
3308 name: "mylib",
3309 srcs: ["mylib.cpp"],
3310 system_shared_libs: [],
3311 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003312 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003313 }
3314
3315 apex_key {
3316 name: "myapex.key",
3317 public_key: "testkey.avbpubkey",
3318 private_key: "testkey.pem",
3319 }
3320
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003321 android_app_certificate {
3322 name: "myapex.certificate",
3323 certificate: "testkey",
3324 }
3325
3326 android_app_certificate {
3327 name: "myapex.certificate.override",
3328 certificate: "testkey.override",
3329 }
3330
Jiyong Park9335a262018-12-24 11:31:58 +09003331 `)
3332
3333 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003334 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003335
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003336 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3337 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003338 "vendor/foo/devkeys/testkey.avbpubkey")
3339 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003340 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3341 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003342 "vendor/foo/devkeys/testkey.pem")
3343 }
3344
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003345 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003346 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003347 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003348 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003349 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003350 }
3351}
Jiyong Park58e364a2019-01-19 19:24:06 +09003352
Jooyung Hanf121a652019-12-17 14:30:11 +09003353func TestCertificate(t *testing.T) {
3354 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003355 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003356 apex {
3357 name: "myapex",
3358 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003359 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003360 }
3361 apex_key {
3362 name: "myapex.key",
3363 public_key: "testkey.avbpubkey",
3364 private_key: "testkey.pem",
3365 }`)
3366 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3367 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3368 if actual := rule.Args["certificates"]; actual != expected {
3369 t.Errorf("certificates should be %q, not %q", expected, actual)
3370 }
3371 })
3372 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003373 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 apex {
3375 name: "myapex_keytest",
3376 key: "myapex.key",
3377 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003378 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003379 }
3380 apex_key {
3381 name: "myapex.key",
3382 public_key: "testkey.avbpubkey",
3383 private_key: "testkey.pem",
3384 }
3385 android_app_certificate {
3386 name: "myapex.certificate.override",
3387 certificate: "testkey.override",
3388 }`)
3389 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3390 expected := "testkey.override.x509.pem testkey.override.pk8"
3391 if actual := rule.Args["certificates"]; actual != expected {
3392 t.Errorf("certificates should be %q, not %q", expected, actual)
3393 }
3394 })
3395 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003396 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 apex {
3398 name: "myapex",
3399 key: "myapex.key",
3400 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003401 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 }
3403 apex_key {
3404 name: "myapex.key",
3405 public_key: "testkey.avbpubkey",
3406 private_key: "testkey.pem",
3407 }
3408 android_app_certificate {
3409 name: "myapex.certificate",
3410 certificate: "testkey",
3411 }`)
3412 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3413 expected := "testkey.x509.pem testkey.pk8"
3414 if actual := rule.Args["certificates"]; actual != expected {
3415 t.Errorf("certificates should be %q, not %q", expected, actual)
3416 }
3417 })
3418 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003419 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003420 apex {
3421 name: "myapex_keytest",
3422 key: "myapex.key",
3423 file_contexts: ":myapex-file_contexts",
3424 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003425 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003426 }
3427 apex_key {
3428 name: "myapex.key",
3429 public_key: "testkey.avbpubkey",
3430 private_key: "testkey.pem",
3431 }
3432 android_app_certificate {
3433 name: "myapex.certificate.override",
3434 certificate: "testkey.override",
3435 }`)
3436 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3437 expected := "testkey.override.x509.pem testkey.override.pk8"
3438 if actual := rule.Args["certificates"]; actual != expected {
3439 t.Errorf("certificates should be %q, not %q", expected, actual)
3440 }
3441 })
3442 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003443 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003444 apex {
3445 name: "myapex",
3446 key: "myapex.key",
3447 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003448 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003449 }
3450 apex_key {
3451 name: "myapex.key",
3452 public_key: "testkey.avbpubkey",
3453 private_key: "testkey.pem",
3454 }`)
3455 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3456 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3457 if actual := rule.Args["certificates"]; actual != expected {
3458 t.Errorf("certificates should be %q, not %q", expected, actual)
3459 }
3460 })
3461 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003462 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003463 apex {
3464 name: "myapex_keytest",
3465 key: "myapex.key",
3466 file_contexts: ":myapex-file_contexts",
3467 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003468 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003469 }
3470 apex_key {
3471 name: "myapex.key",
3472 public_key: "testkey.avbpubkey",
3473 private_key: "testkey.pem",
3474 }
3475 android_app_certificate {
3476 name: "myapex.certificate.override",
3477 certificate: "testkey.override",
3478 }`)
3479 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3480 expected := "testkey.override.x509.pem testkey.override.pk8"
3481 if actual := rule.Args["certificates"]; actual != expected {
3482 t.Errorf("certificates should be %q, not %q", expected, actual)
3483 }
3484 })
3485}
3486
Jiyong Park58e364a2019-01-19 19:24:06 +09003487func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003488 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003489 apex {
3490 name: "myapex",
3491 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003492 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003493 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003494 }
3495
3496 apex {
3497 name: "otherapex",
3498 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003500 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003501 }
3502
3503 apex_key {
3504 name: "myapex.key",
3505 public_key: "testkey.avbpubkey",
3506 private_key: "testkey.pem",
3507 }
3508
3509 cc_library {
3510 name: "mylib",
3511 srcs: ["mylib.cpp"],
3512 system_shared_libs: [],
3513 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003514 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003515 "myapex",
3516 "otherapex",
3517 ],
Jooyung Han24282772020-03-21 23:20:55 +09003518 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003519 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003520 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003521 cc_library {
3522 name: "mylib2",
3523 srcs: ["mylib.cpp"],
3524 system_shared_libs: [],
3525 stl: "none",
3526 apex_available: [
3527 "myapex",
3528 "otherapex",
3529 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003530 static_libs: ["mylib3"],
3531 recovery_available: true,
3532 min_sdk_version: "29",
3533 }
3534 cc_library {
3535 name: "mylib3",
3536 srcs: ["mylib.cpp"],
3537 system_shared_libs: [],
3538 stl: "none",
3539 apex_available: [
3540 "myapex",
3541 "otherapex",
3542 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003543 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003544 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003545 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003546 `)
3547
Jooyung Hanc87a0592020-03-02 17:44:33 +09003548 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003549 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003550 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003551
Vinh Tranf9754732023-01-19 22:41:46 -05003552 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003553 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003554 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003555
Vinh Tranf9754732023-01-19 22:41:46 -05003556 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003557 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003558 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003559
Colin Crossaede88c2020-08-11 12:17:01 -07003560 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3561 // each variant defines additional macros to distinguish which apex variant it is built for
3562
3563 // non-APEX variant does not have __ANDROID_APEX__ defined
3564 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3565 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3566
Vinh Tranf9754732023-01-19 22:41:46 -05003567 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003568 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3569 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003570
Jooyung Hanc87a0592020-03-02 17:44:33 +09003571 // non-APEX variant does not have __ANDROID_APEX__ defined
3572 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3573 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3574
Vinh Tranf9754732023-01-19 22:41:46 -05003575 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003576 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003577 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003578}
Jiyong Park7e636d02019-01-28 16:16:54 +09003579
3580func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003581 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003582 apex {
3583 name: "myapex",
3584 key: "myapex.key",
3585 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003586 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003587 }
3588
3589 apex_key {
3590 name: "myapex.key",
3591 public_key: "testkey.avbpubkey",
3592 private_key: "testkey.pem",
3593 }
3594
3595 cc_library_headers {
3596 name: "mylib_headers",
3597 export_include_dirs: ["my_include"],
3598 system_shared_libs: [],
3599 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003600 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003601 }
3602
3603 cc_library {
3604 name: "mylib",
3605 srcs: ["mylib.cpp"],
3606 system_shared_libs: [],
3607 stl: "none",
3608 header_libs: ["mylib_headers"],
3609 export_header_lib_headers: ["mylib_headers"],
3610 stubs: {
3611 versions: ["1", "2", "3"],
3612 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003613 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003614 }
3615
3616 cc_library {
3617 name: "otherlib",
3618 srcs: ["mylib.cpp"],
3619 system_shared_libs: [],
3620 stl: "none",
3621 shared_libs: ["mylib"],
3622 }
3623 `)
3624
Colin Cross7113d202019-11-20 16:39:12 -08003625 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003626
3627 // Ensure that the include path of the header lib is exported to 'otherlib'
3628 ensureContains(t, cFlags, "-Imy_include")
3629}
Alex Light9670d332019-01-29 18:07:33 -08003630
Jiyong Park7cd10e32020-01-14 09:22:18 +09003631type fileInApex struct {
3632 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003633 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003634 isLink bool
3635}
3636
Jooyung Han1724d582022-12-21 10:17:44 +09003637func (f fileInApex) String() string {
3638 return f.src + ":" + f.path
3639}
3640
3641func (f fileInApex) match(expectation string) bool {
3642 parts := strings.Split(expectation, ":")
3643 if len(parts) == 1 {
3644 match, _ := path.Match(parts[0], f.path)
3645 return match
3646 }
3647 if len(parts) == 2 {
3648 matchSrc, _ := path.Match(parts[0], f.src)
3649 matchDst, _ := path.Match(parts[1], f.path)
3650 return matchSrc && matchDst
3651 }
3652 panic("invalid expected file specification: " + expectation)
3653}
3654
Jooyung Hana57af4a2020-01-23 05:36:59 +00003655func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003657 module := ctx.ModuleForTests(moduleName, variant)
3658 apexRule := module.MaybeRule("apexRule")
3659 apexDir := "/image.apex/"
3660 if apexRule.Rule == nil {
3661 apexRule = module.Rule("zipApexRule")
3662 apexDir = "/image.zipapex/"
3663 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003664 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 for _, cmd := range strings.Split(copyCmds, "&&") {
3667 cmd = strings.TrimSpace(cmd)
3668 if cmd == "" {
3669 continue
3670 }
3671 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003672 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003673 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 switch terms[0] {
3675 case "mkdir":
3676 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003677 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 t.Fatal("copyCmds contains invalid cp command", cmd)
3679 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003680 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003681 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003682 isLink = false
3683 case "ln":
3684 if len(terms) != 3 && len(terms) != 4 {
3685 // ln LINK TARGET or ln -s LINK TARGET
3686 t.Fatal("copyCmds contains invalid ln command", cmd)
3687 }
3688 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003689 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003690 isLink = true
3691 default:
3692 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3693 }
3694 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003695 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003696 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003697 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003698 }
Jooyung Han1724d582022-12-21 10:17:44 +09003699 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003700 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003701 }
3702 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003703 return ret
3704}
3705
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003706func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003707 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003708 var failed bool
3709 var surplus []string
3710 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003711 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003712 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003713 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003714 if file.match(expected) {
3715 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003716 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003717 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003718 }
3719 }
Jooyung Han1724d582022-12-21 10:17:44 +09003720 if !matchFound {
3721 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003722 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003723 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003724
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003726 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003727 t.Log("surplus files", surplus)
3728 failed = true
3729 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003730
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003731 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003732 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003733 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003734 if !filesMatched[expected] {
3735 missing = append(missing, expected)
3736 }
3737 }
3738 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 t.Log("missing files", missing)
3740 failed = true
3741 }
3742 if failed {
3743 t.Fail()
3744 }
3745}
3746
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003747func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3748 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3749}
3750
3751func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3752 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3753 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3754 if deapexer.Output != nil {
3755 outputs = append(outputs, deapexer.Output.String())
3756 }
3757 for _, output := range deapexer.ImplicitOutputs {
3758 outputs = append(outputs, output.String())
3759 }
3760 actualFiles := make([]fileInApex, 0, len(outputs))
3761 for _, output := range outputs {
3762 dir := "/deapexer/"
3763 pos := strings.LastIndex(output, dir)
3764 if pos == -1 {
3765 t.Fatal("Unknown deapexer output ", output)
3766 }
3767 path := output[pos+len(dir):]
3768 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3769 }
3770 assertFileListEquals(t, files, actualFiles)
3771}
3772
Jooyung Han344d5432019-08-23 11:17:39 +09003773func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003774 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003775 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003776 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003777 "etc/llndk.libraries.29.txt",
3778 "etc/vndkcore.libraries.29.txt",
3779 "etc/vndksp.libraries.29.txt",
3780 "etc/vndkprivate.libraries.29.txt",
3781 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003782 }
3783 testCases := []struct {
3784 vndkVersion string
3785 expectedFiles []string
3786 }{
3787 {
3788 vndkVersion: "current",
3789 expectedFiles: append(commonFiles,
3790 "lib/libvndk.so",
3791 "lib/libvndksp.so",
3792 "lib64/libvndk.so",
3793 "lib64/libvndksp.so"),
3794 },
3795 {
3796 vndkVersion: "",
3797 expectedFiles: append(commonFiles,
3798 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3799 "lib/libvndksp.so",
3800 "lib64/libvndksp.so"),
3801 },
3802 }
3803 for _, tc := range testCases {
3804 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3805 ctx := testApex(t, `
3806 apex_vndk {
3807 name: "com.android.vndk.current",
3808 key: "com.android.vndk.current.key",
3809 updatable: false,
3810 }
3811
3812 apex_key {
3813 name: "com.android.vndk.current.key",
3814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 cc_library {
3819 name: "libvndk",
3820 srcs: ["mylib.cpp"],
3821 vendor_available: true,
3822 product_available: true,
3823 vndk: {
3824 enabled: true,
3825 },
3826 system_shared_libs: [],
3827 stl: "none",
3828 apex_available: [ "com.android.vndk.current" ],
3829 }
3830
3831 cc_library {
3832 name: "libvndksp",
3833 srcs: ["mylib.cpp"],
3834 vendor_available: true,
3835 product_available: true,
3836 vndk: {
3837 enabled: true,
3838 support_system_process: true,
3839 },
3840 system_shared_libs: [],
3841 stl: "none",
3842 apex_available: [ "com.android.vndk.current" ],
3843 }
3844
3845 // VNDK-Ext should not cause any problems
3846
3847 cc_library {
3848 name: "libvndk.ext",
3849 srcs: ["mylib2.cpp"],
3850 vendor: true,
3851 vndk: {
3852 enabled: true,
3853 extends: "libvndk",
3854 },
3855 system_shared_libs: [],
3856 stl: "none",
3857 }
3858
3859 cc_library {
3860 name: "libvndksp.ext",
3861 srcs: ["mylib2.cpp"],
3862 vendor: true,
3863 vndk: {
3864 enabled: true,
3865 support_system_process: true,
3866 extends: "libvndksp",
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3872 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003873 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003874 }))
3875 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3876 })
3877 }
Jooyung Han344d5432019-08-23 11:17:39 +09003878}
3879
3880func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003881 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003882 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003883 name: "com.android.vndk.current",
3884 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003885 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003886 }
3887
3888 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003889 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003890 public_key: "testkey.avbpubkey",
3891 private_key: "testkey.pem",
3892 }
3893
3894 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003895 name: "libvndk",
3896 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003897 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003898 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003899 vndk: {
3900 enabled: true,
3901 },
3902 system_shared_libs: [],
3903 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003904 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003905 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003906
3907 cc_prebuilt_library_shared {
3908 name: "libvndk.arm",
3909 srcs: ["libvndk.arm.so"],
3910 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003911 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003912 vndk: {
3913 enabled: true,
3914 },
3915 enabled: false,
3916 arch: {
3917 arm: {
3918 enabled: true,
3919 },
3920 },
3921 system_shared_libs: [],
3922 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003923 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003925 `+vndkLibrariesTxtFiles("current"),
3926 withFiles(map[string][]byte{
3927 "libvndk.so": nil,
3928 "libvndk.arm.so": nil,
3929 }))
Colin Cross2807f002021-03-02 10:15:29 -08003930 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003931 "lib/libvndk.so",
3932 "lib/libvndk.arm.so",
3933 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003934 "lib/libc++.so",
3935 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003936 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003937 })
Jooyung Han344d5432019-08-23 11:17:39 +09003938}
3939
Jooyung Han39edb6c2019-11-06 16:53:07 +09003940func vndkLibrariesTxtFiles(vers ...string) (result string) {
3941 for _, v := range vers {
3942 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003943 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003944 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003945 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003946 name: "` + txt + `.libraries.txt",
3947 }
3948 `
3949 }
3950 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003951 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003952 result += `
3953 prebuilt_etc {
3954 name: "` + txt + `.libraries.` + v + `.txt",
3955 src: "dummy.txt",
3956 }
3957 `
3958 }
3959 }
3960 }
3961 return
3962}
3963
Jooyung Han344d5432019-08-23 11:17:39 +09003964func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003965 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003966 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003967 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003968 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003969 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003970 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003971 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003972 }
3973
3974 apex_key {
3975 name: "myapex.key",
3976 public_key: "testkey.avbpubkey",
3977 private_key: "testkey.pem",
3978 }
3979
Jooyung Han31c470b2019-10-18 16:26:59 +09003980 vndk_prebuilt_shared {
3981 name: "libvndk27",
3982 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003983 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003984 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003985 vndk: {
3986 enabled: true,
3987 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 target_arch: "arm64",
3989 arch: {
3990 arm: {
3991 srcs: ["libvndk27_arm.so"],
3992 },
3993 arm64: {
3994 srcs: ["libvndk27_arm64.so"],
3995 },
3996 },
Colin Cross2807f002021-03-02 10:15:29 -08003997 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003998 }
3999
4000 vndk_prebuilt_shared {
4001 name: "libvndk27",
4002 version: "27",
4003 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004004 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004005 vndk: {
4006 enabled: true,
4007 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004008 target_arch: "x86_64",
4009 arch: {
4010 x86: {
4011 srcs: ["libvndk27_x86.so"],
4012 },
4013 x86_64: {
4014 srcs: ["libvndk27_x86_64.so"],
4015 },
4016 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004017 }
4018 `+vndkLibrariesTxtFiles("27"),
4019 withFiles(map[string][]byte{
4020 "libvndk27_arm.so": nil,
4021 "libvndk27_arm64.so": nil,
4022 "libvndk27_x86.so": nil,
4023 "libvndk27_x86_64.so": nil,
4024 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004025
Colin Cross2807f002021-03-02 10:15:29 -08004026 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004027 "lib/libvndk27_arm.so",
4028 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004029 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004030 })
Jooyung Han344d5432019-08-23 11:17:39 +09004031}
4032
Jooyung Han90eee022019-10-01 20:02:42 +09004033func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004034 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004035 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004036 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004037 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004038 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004039 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004040 }
4041 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004042 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004043 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004044 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004045 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004046 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004047 }
4048 apex_key {
4049 name: "myapex.key",
4050 public_key: "testkey.avbpubkey",
4051 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004052 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004053
4054 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004055 module := ctx.ModuleForTests(moduleName, "android_common_image")
4056 apexManifestRule := module.Rule("apexManifestRule")
4057 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004058 }
4059
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004060 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004061 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004062}
4063
Jooyung Han344d5432019-08-23 11:17:39 +09004064func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004065 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004066 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004067 name: "com.android.vndk.current",
4068 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004069 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004070 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004071 }
4072
4073 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004074 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004075 public_key: "testkey.avbpubkey",
4076 private_key: "testkey.pem",
4077 }
4078
4079 cc_library {
4080 name: "libvndk",
4081 srcs: ["mylib.cpp"],
4082 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004083 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004084 native_bridge_supported: true,
4085 host_supported: true,
4086 vndk: {
4087 enabled: true,
4088 },
4089 system_shared_libs: [],
4090 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004091 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004092 }
Colin Cross2807f002021-03-02 10:15:29 -08004093 `+vndkLibrariesTxtFiles("current"),
4094 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004095
Colin Cross2807f002021-03-02 10:15:29 -08004096 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 "lib/libvndk.so",
4098 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004099 "lib/libc++.so",
4100 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004101 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 })
Jooyung Han344d5432019-08-23 11:17:39 +09004103}
4104
4105func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004106 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004107 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004108 name: "com.android.vndk.current",
4109 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004111 native_bridge_supported: true,
4112 }
4113
4114 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004115 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004116 public_key: "testkey.avbpubkey",
4117 private_key: "testkey.pem",
4118 }
4119
4120 cc_library {
4121 name: "libvndk",
4122 srcs: ["mylib.cpp"],
4123 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004124 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004125 native_bridge_supported: true,
4126 host_supported: true,
4127 vndk: {
4128 enabled: true,
4129 },
4130 system_shared_libs: [],
4131 stl: "none",
4132 }
4133 `)
4134}
4135
Jooyung Han31c470b2019-10-18 16:26:59 +09004136func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004137 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004138 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004139 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004140 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004142 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004143 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }
4145
4146 apex_key {
4147 name: "myapex.key",
4148 public_key: "testkey.avbpubkey",
4149 private_key: "testkey.pem",
4150 }
4151
4152 vndk_prebuilt_shared {
4153 name: "libvndk27",
4154 version: "27",
4155 target_arch: "arm",
4156 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004157 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004158 vndk: {
4159 enabled: true,
4160 },
4161 arch: {
4162 arm: {
4163 srcs: ["libvndk27.so"],
4164 }
4165 },
4166 }
4167
4168 vndk_prebuilt_shared {
4169 name: "libvndk27",
4170 version: "27",
4171 target_arch: "arm",
4172 binder32bit: true,
4173 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004174 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004175 vndk: {
4176 enabled: true,
4177 },
4178 arch: {
4179 arm: {
4180 srcs: ["libvndk27binder32.so"],
4181 }
4182 },
Colin Cross2807f002021-03-02 10:15:29 -08004183 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004184 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004185 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004186 withFiles(map[string][]byte{
4187 "libvndk27.so": nil,
4188 "libvndk27binder32.so": nil,
4189 }),
4190 withBinder32bit,
4191 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004192 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004193 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4194 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004195 },
4196 }),
4197 )
4198
Colin Cross2807f002021-03-02 10:15:29 -08004199 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004200 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004201 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004202 })
4203}
4204
Jooyung Han45a96772020-06-15 14:59:42 +09004205func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004206 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004207 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004208 name: "com.android.vndk.current",
4209 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004210 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004211 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004212 }
4213
4214 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004215 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004216 public_key: "testkey.avbpubkey",
4217 private_key: "testkey.pem",
4218 }
4219
4220 cc_library {
4221 name: "libz",
4222 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004223 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004224 vndk: {
4225 enabled: true,
4226 },
4227 stubs: {
4228 symbol_file: "libz.map.txt",
4229 versions: ["30"],
4230 }
4231 }
4232 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4233 "libz.map.txt": nil,
4234 }))
4235
Colin Cross2807f002021-03-02 10:15:29 -08004236 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004237 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4238 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004239 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4240 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4241 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4242 "*/*",
4243 })
Jooyung Han45a96772020-06-15 14:59:42 +09004244}
4245
Jooyung Hane3f02812023-05-08 13:54:50 +09004246func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4247 ctx := testApex(t, "",
4248 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4249 variables.DeviceVndkVersion = proptools.StringPtr("27")
4250 }),
4251 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4252 cc.RegisterVendorSnapshotModules(ctx)
4253 }),
4254 withFiles(map[string][]byte{
4255 "vendor/foo/Android.bp": []byte(`
4256 apex {
4257 name: "myapex",
4258 binaries: ["foo"],
4259 key: "myapex.key",
4260 min_sdk_version: "27",
4261 vendor: true,
4262 }
4263
4264 cc_binary {
4265 name: "foo",
4266 vendor: true,
4267 srcs: ["abc.cpp"],
4268 shared_libs: [
4269 "libllndk",
4270 "libvndk",
4271 ],
4272 nocrt: true,
4273 system_shared_libs: [],
4274 min_sdk_version: "27",
4275 }
4276
4277 apex_key {
4278 name: "myapex.key",
4279 public_key: "testkey.avbpubkey",
4280 private_key: "testkey.pem",
4281 }
4282 `),
4283 // Simulate VNDK prebuilts with vendor_snapshot
4284 "prebuilts/vndk/Android.bp": []byte(`
4285 vndk_prebuilt_shared {
4286 name: "libllndk",
4287 version: "27",
4288 vendor_available: true,
4289 product_available: true,
4290 target_arch: "arm64",
4291 arch: {
4292 arm64: {
4293 srcs: ["libllndk.so"],
4294 },
4295 },
4296 }
4297
4298 vndk_prebuilt_shared {
4299 name: "libvndk",
4300 version: "27",
4301 vendor_available: true,
4302 product_available: true,
4303 target_arch: "arm64",
4304 arch: {
4305 arm64: {
4306 srcs: ["libvndk.so"],
4307 },
4308 },
4309 vndk: {
4310 enabled: true,
4311 },
4312 min_sdk_version: "27",
4313 }
4314
4315 vndk_prebuilt_shared {
4316 name: "libc++",
4317 version: "27",
4318 target_arch: "arm64",
4319 vendor_available: true,
4320 product_available: true,
4321 vndk: {
4322 enabled: true,
4323 support_system_process: true,
4324 },
4325 arch: {
4326 arm64: {
4327 srcs: ["libc++.so"],
4328 },
4329 },
4330 min_sdk_version: "apex_inherit",
4331 }
4332
4333 vendor_snapshot {
4334 name: "vendor_snapshot",
4335 version: "27",
4336 arch: {
4337 arm64: {
4338 vndk_libs: [
4339 "libc++",
4340 "libllndk",
4341 "libvndk",
4342 ],
4343 static_libs: [
4344 "libc++demangle",
4345 "libclang_rt.builtins",
4346 "libunwind",
4347 ],
4348 },
4349 }
4350 }
4351
4352 vendor_snapshot_static {
4353 name: "libclang_rt.builtins",
4354 version: "27",
4355 target_arch: "arm64",
4356 vendor: true,
4357 arch: {
4358 arm64: {
4359 src: "libclang_rt.builtins-aarch64-android.a",
4360 },
4361 },
4362 }
4363
4364 vendor_snapshot_static {
4365 name: "libc++demangle",
4366 version: "27",
4367 target_arch: "arm64",
4368 compile_multilib: "64",
4369 vendor: true,
4370 arch: {
4371 arm64: {
4372 src: "libc++demangle.a",
4373 },
4374 },
4375 min_sdk_version: "apex_inherit",
4376 }
4377
4378 vendor_snapshot_static {
4379 name: "libunwind",
4380 version: "27",
4381 target_arch: "arm64",
4382 compile_multilib: "64",
4383 vendor: true,
4384 arch: {
4385 arm64: {
4386 src: "libunwind.a",
4387 },
4388 },
4389 min_sdk_version: "apex_inherit",
4390 }
4391 `),
4392 }))
4393
4394 // Should embed the prebuilt VNDK libraries in the apex
4395 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4396 "bin/foo",
4397 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4398 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4399 })
4400
4401 // Should link foo with prebuilt libraries (shared/static)
4402 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4403 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4404 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4405 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4406 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4407
4408 // Should declare the LLNDK library as a "required" external dependency
4409 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4410 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4411 ensureListContains(t, requireNativeLibs, "libllndk.so")
4412}
4413
Jooyung Hane1633032019-08-01 17:41:43 +09004414func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004415 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004416 apex {
4417 name: "myapex_nodep",
4418 key: "myapex.key",
4419 native_shared_libs: ["lib_nodep"],
4420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex {
4426 name: "myapex_dep",
4427 key: "myapex.key",
4428 native_shared_libs: ["lib_dep"],
4429 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004430 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004431 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 apex {
4435 name: "myapex_provider",
4436 key: "myapex.key",
4437 native_shared_libs: ["libfoo"],
4438 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004439 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004440 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004441 }
4442
4443 apex {
4444 name: "myapex_selfcontained",
4445 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004446 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004447 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004448 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004449 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004450 }
4451
4452 apex_key {
4453 name: "myapex.key",
4454 public_key: "testkey.avbpubkey",
4455 private_key: "testkey.pem",
4456 }
4457
4458 cc_library {
4459 name: "lib_nodep",
4460 srcs: ["mylib.cpp"],
4461 system_shared_libs: [],
4462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004463 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004464 }
4465
4466 cc_library {
4467 name: "lib_dep",
4468 srcs: ["mylib.cpp"],
4469 shared_libs: ["libfoo"],
4470 system_shared_libs: [],
4471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004472 apex_available: [
4473 "myapex_dep",
4474 "myapex_provider",
4475 "myapex_selfcontained",
4476 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004477 }
4478
4479 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004480 name: "lib_dep_on_bar",
4481 srcs: ["mylib.cpp"],
4482 shared_libs: ["libbar"],
4483 system_shared_libs: [],
4484 stl: "none",
4485 apex_available: [
4486 "myapex_selfcontained",
4487 ],
4488 }
4489
4490
4491 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004492 name: "libfoo",
4493 srcs: ["mytest.cpp"],
4494 stubs: {
4495 versions: ["1"],
4496 },
4497 system_shared_libs: [],
4498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004499 apex_available: [
4500 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004501 ],
4502 }
4503
4504 cc_library {
4505 name: "libbar",
4506 srcs: ["mytest.cpp"],
4507 stubs: {
4508 versions: ["1"],
4509 },
4510 system_shared_libs: [],
4511 stl: "none",
4512 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004513 "myapex_selfcontained",
4514 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004515 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004516
Jooyung Hane1633032019-08-01 17:41:43 +09004517 `)
4518
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004519 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004520 var provideNativeLibs, requireNativeLibs []string
4521
Sundong Ahnabb64432019-10-22 13:58:29 +09004522 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004523 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4524 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004525 ensureListEmpty(t, provideNativeLibs)
4526 ensureListEmpty(t, requireNativeLibs)
4527
Sundong Ahnabb64432019-10-22 13:58:29 +09004528 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004529 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4530 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004531 ensureListEmpty(t, provideNativeLibs)
4532 ensureListContains(t, requireNativeLibs, "libfoo.so")
4533
Sundong Ahnabb64432019-10-22 13:58:29 +09004534 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004535 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4536 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004537 ensureListContains(t, provideNativeLibs, "libfoo.so")
4538 ensureListEmpty(t, requireNativeLibs)
4539
Sundong Ahnabb64432019-10-22 13:58:29 +09004540 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004541 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4542 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004543 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004544 ensureListEmpty(t, requireNativeLibs)
4545}
4546
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004547func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4548 ctx := testApex(t, `
4549 apex {
4550 name: "myapex",
4551 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004552 native_shared_libs: ["mylib"],
4553 updatable: false,
4554 }
4555
4556 apex_key {
4557 name: "myapex.key",
4558 public_key: "testkey.avbpubkey",
4559 private_key: "testkey.pem",
4560 }
4561
4562 cc_library {
4563 name: "mylib",
4564 srcs: ["mylib.cpp"],
4565 system_shared_libs: [],
4566 stl: "none",
4567 apex_available: [
4568 "//apex_available:platform",
4569 "myapex",
4570 ],
4571 }
4572 `, android.FixtureMergeEnv(map[string]string{
4573 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4574 }))
4575
Jooyung Han63dff462023-02-09 00:11:27 +00004576 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004577 apexManifestRule := module.Rule("apexManifestRule")
4578 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4579}
4580
Vinh Tran8f5310f2022-10-07 18:16:47 -04004581func TestCompileMultilibProp(t *testing.T) {
4582 testCases := []struct {
4583 compileMultiLibProp string
4584 containedLibs []string
4585 notContainedLibs []string
4586 }{
4587 {
4588 containedLibs: []string{
4589 "image.apex/lib64/mylib.so",
4590 "image.apex/lib/mylib.so",
4591 },
4592 compileMultiLibProp: `compile_multilib: "both",`,
4593 },
4594 {
4595 containedLibs: []string{"image.apex/lib64/mylib.so"},
4596 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4597 compileMultiLibProp: `compile_multilib: "first",`,
4598 },
4599 {
4600 containedLibs: []string{"image.apex/lib64/mylib.so"},
4601 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4602 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4603 },
4604 {
4605 containedLibs: []string{"image.apex/lib64/mylib.so"},
4606 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4607 compileMultiLibProp: `compile_multilib: "64",`,
4608 },
4609 {
4610 containedLibs: []string{"image.apex/lib/mylib.so"},
4611 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4612 compileMultiLibProp: `compile_multilib: "32",`,
4613 },
4614 }
4615 for _, testCase := range testCases {
4616 ctx := testApex(t, fmt.Sprintf(`
4617 apex {
4618 name: "myapex",
4619 key: "myapex.key",
4620 %s
4621 native_shared_libs: ["mylib"],
4622 updatable: false,
4623 }
4624 apex_key {
4625 name: "myapex.key",
4626 public_key: "testkey.avbpubkey",
4627 private_key: "testkey.pem",
4628 }
4629 cc_library {
4630 name: "mylib",
4631 srcs: ["mylib.cpp"],
4632 apex_available: [
4633 "//apex_available:platform",
4634 "myapex",
4635 ],
4636 }
4637 `, testCase.compileMultiLibProp),
4638 )
4639 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4640 apexRule := module.Rule("apexRule")
4641 copyCmds := apexRule.Args["copy_commands"]
4642 for _, containedLib := range testCase.containedLibs {
4643 ensureContains(t, copyCmds, containedLib)
4644 }
4645 for _, notContainedLib := range testCase.notContainedLibs {
4646 ensureNotContains(t, copyCmds, notContainedLib)
4647 }
4648 }
4649}
4650
Alex Light0851b882019-02-07 13:20:53 -08004651func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004652 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004653 apex {
4654 name: "myapex",
4655 key: "myapex.key",
4656 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004657 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 cc_library {
4667 name: "mylib_common",
4668 srcs: ["mylib.cpp"],
4669 system_shared_libs: [],
4670 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004671 apex_available: [
4672 "//apex_available:platform",
4673 "myapex",
4674 ],
Alex Light0851b882019-02-07 13:20:53 -08004675 }
4676 `)
4677
Sundong Ahnabb64432019-10-22 13:58:29 +09004678 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004679 apexRule := module.Rule("apexRule")
4680 copyCmds := apexRule.Args["copy_commands"]
4681
4682 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4683 t.Log("Apex was a test apex!")
4684 t.Fail()
4685 }
4686 // Ensure that main rule creates an output
4687 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4688
4689 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004690 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004691
4692 // Ensure that both direct and indirect deps are copied into apex
4693 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4694
Colin Cross7113d202019-11-20 16:39:12 -08004695 // Ensure that the platform variant ends with _shared
4696 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004697
Colin Cross56a83212020-09-15 18:30:11 -07004698 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004699 t.Log("Found mylib_common not in any apex!")
4700 t.Fail()
4701 }
4702}
4703
4704func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004705 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004706 apex_test {
4707 name: "myapex",
4708 key: "myapex.key",
4709 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004710 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004711 }
4712
4713 apex_key {
4714 name: "myapex.key",
4715 public_key: "testkey.avbpubkey",
4716 private_key: "testkey.pem",
4717 }
4718
4719 cc_library {
4720 name: "mylib_common_test",
4721 srcs: ["mylib.cpp"],
4722 system_shared_libs: [],
4723 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004724 // TODO: remove //apex_available:platform
4725 apex_available: [
4726 "//apex_available:platform",
4727 "myapex",
4728 ],
Alex Light0851b882019-02-07 13:20:53 -08004729 }
4730 `)
4731
Sundong Ahnabb64432019-10-22 13:58:29 +09004732 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004733 apexRule := module.Rule("apexRule")
4734 copyCmds := apexRule.Args["copy_commands"]
4735
4736 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4737 t.Log("Apex was not a test apex!")
4738 t.Fail()
4739 }
4740 // Ensure that main rule creates an output
4741 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4742
4743 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004744 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004745
4746 // Ensure that both direct and indirect deps are copied into apex
4747 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4748
Colin Cross7113d202019-11-20 16:39:12 -08004749 // Ensure that the platform variant ends with _shared
4750 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004751}
4752
Alex Light9670d332019-01-29 18:07:33 -08004753func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004754 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004755 apex {
4756 name: "myapex",
4757 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004758 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004759 multilib: {
4760 first: {
4761 native_shared_libs: ["mylib_common"],
4762 }
4763 },
4764 target: {
4765 android: {
4766 multilib: {
4767 first: {
4768 native_shared_libs: ["mylib"],
4769 }
4770 }
4771 },
4772 host: {
4773 multilib: {
4774 first: {
4775 native_shared_libs: ["mylib2"],
4776 }
4777 }
4778 }
4779 }
4780 }
4781
4782 apex_key {
4783 name: "myapex.key",
4784 public_key: "testkey.avbpubkey",
4785 private_key: "testkey.pem",
4786 }
4787
4788 cc_library {
4789 name: "mylib",
4790 srcs: ["mylib.cpp"],
4791 system_shared_libs: [],
4792 stl: "none",
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: "mylib_common",
4802 srcs: ["mylib.cpp"],
4803 system_shared_libs: [],
4804 stl: "none",
4805 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004806 // TODO: remove //apex_available:platform
4807 apex_available: [
4808 "//apex_available:platform",
4809 "myapex",
4810 ],
Alex Light9670d332019-01-29 18:07:33 -08004811 }
4812
4813 cc_library {
4814 name: "mylib2",
4815 srcs: ["mylib.cpp"],
4816 system_shared_libs: [],
4817 stl: "none",
4818 compile_multilib: "first",
4819 }
4820 `)
4821
Sundong Ahnabb64432019-10-22 13:58:29 +09004822 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004823 copyCmds := apexRule.Args["copy_commands"]
4824
4825 // Ensure that main rule creates an output
4826 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4827
4828 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4831 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004832
4833 // Ensure that both direct and indirect deps are copied into apex
4834 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4835 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4836 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4837
Colin Cross7113d202019-11-20 16:39:12 -08004838 // Ensure that the platform variant ends with _shared
4839 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4840 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4841 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004842}
Jiyong Park04480cf2019-02-06 00:16:29 +09004843
Jiyong Park59140302020-12-14 18:44:04 +09004844func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004845 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004849 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004850 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004851 arch: {
4852 arm64: {
4853 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004854 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004855 },
4856 x86_64: {
4857 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004858 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004859 },
4860 }
4861 }
4862
4863 apex_key {
4864 name: "myapex.key",
4865 public_key: "testkey.avbpubkey",
4866 private_key: "testkey.pem",
4867 }
4868
4869 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004870 name: "mylib.generic",
4871 srcs: ["mylib.cpp"],
4872 system_shared_libs: [],
4873 stl: "none",
4874 // TODO: remove //apex_available:platform
4875 apex_available: [
4876 "//apex_available:platform",
4877 "myapex",
4878 ],
4879 }
4880
4881 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004882 name: "mylib.arm64",
4883 srcs: ["mylib.cpp"],
4884 system_shared_libs: [],
4885 stl: "none",
4886 // TODO: remove //apex_available:platform
4887 apex_available: [
4888 "//apex_available:platform",
4889 "myapex",
4890 ],
4891 }
4892
4893 cc_library {
4894 name: "mylib.x64",
4895 srcs: ["mylib.cpp"],
4896 system_shared_libs: [],
4897 stl: "none",
4898 // TODO: remove //apex_available:platform
4899 apex_available: [
4900 "//apex_available:platform",
4901 "myapex",
4902 ],
4903 }
4904 `)
4905
4906 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4907 copyCmds := apexRule.Args["copy_commands"]
4908
4909 // Ensure that apex variant is created for the direct dep
4910 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004911 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004912 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4913
4914 // Ensure that both direct and indirect deps are copied into apex
4915 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4916 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4917}
4918
Jiyong Park04480cf2019-02-06 00:16:29 +09004919func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004920 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004921 apex {
4922 name: "myapex",
4923 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004924 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004925 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004926 }
4927
4928 apex_key {
4929 name: "myapex.key",
4930 public_key: "testkey.avbpubkey",
4931 private_key: "testkey.pem",
4932 }
4933
4934 sh_binary {
4935 name: "myscript",
4936 src: "mylib.cpp",
4937 filename: "myscript.sh",
4938 sub_dir: "script",
4939 }
4940 `)
4941
Sundong Ahnabb64432019-10-22 13:58:29 +09004942 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004943 copyCmds := apexRule.Args["copy_commands"]
4944
4945 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4946}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004947
Jooyung Han91df2082019-11-20 01:49:42 +09004948func TestApexInVariousPartition(t *testing.T) {
4949 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004950 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004951 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004952 {"", "system"},
4953 {"product_specific: true", "product"},
4954 {"soc_specific: true", "vendor"},
4955 {"proprietary: true", "vendor"},
4956 {"vendor: true", "vendor"},
4957 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004958 }
4959 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004960 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004961 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004962 apex {
4963 name: "myapex",
4964 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004965 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004966 `+tc.propName+`
4967 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004968
Jooyung Han91df2082019-11-20 01:49:42 +09004969 apex_key {
4970 name: "myapex.key",
4971 public_key: "testkey.avbpubkey",
4972 private_key: "testkey.pem",
4973 }
4974 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004975
Jooyung Han91df2082019-11-20 01:49:42 +09004976 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004977 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004978 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004979 if actual != expected {
4980 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4981 }
Jooyung Han91df2082019-11-20 01:49:42 +09004982 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004983 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004984}
Jiyong Park67882562019-03-21 01:11:21 +09004985
Jooyung Han580eb4f2020-06-24 19:33:06 +09004986func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004987 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004988 apex {
4989 name: "myapex",
4990 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004991 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004993
Jooyung Han580eb4f2020-06-24 19:33:06 +09004994 apex_key {
4995 name: "myapex.key",
4996 public_key: "testkey.avbpubkey",
4997 private_key: "testkey.pem",
4998 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004999 `)
5000 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 rule := module.Output("file_contexts")
5002 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5003}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005004
Jooyung Han580eb4f2020-06-24 19:33:06 +09005005func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005006 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005007 apex {
5008 name: "myapex",
5009 key: "myapex.key",
5010 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005011 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005012 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005013
Jooyung Han580eb4f2020-06-24 19:33:06 +09005014 apex_key {
5015 name: "myapex.key",
5016 public_key: "testkey.avbpubkey",
5017 private_key: "testkey.pem",
5018 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005019 `, withFiles(map[string][]byte{
5020 "my_own_file_contexts": nil,
5021 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005022}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005023
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026 apex {
5027 name: "myapex",
5028 key: "myapex.key",
5029 product_specific: true,
5030 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005031 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005032 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005033
Jooyung Han580eb4f2020-06-24 19:33:06 +09005034 apex_key {
5035 name: "myapex.key",
5036 public_key: "testkey.avbpubkey",
5037 private_key: "testkey.pem",
5038 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005039 `)
5040
Colin Cross1c460562021-02-16 17:55:47 -08005041 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005042 apex {
5043 name: "myapex",
5044 key: "myapex.key",
5045 product_specific: true,
5046 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005047 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005048 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005049
Jooyung Han580eb4f2020-06-24 19:33:06 +09005050 apex_key {
5051 name: "myapex.key",
5052 public_key: "testkey.avbpubkey",
5053 private_key: "testkey.pem",
5054 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005055 `, withFiles(map[string][]byte{
5056 "product_specific_file_contexts": nil,
5057 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005058 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5059 rule := module.Output("file_contexts")
5060 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5061}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005062
Jooyung Han580eb4f2020-06-24 19:33:06 +09005063func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005064 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005065 apex {
5066 name: "myapex",
5067 key: "myapex.key",
5068 product_specific: true,
5069 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005070 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005072
Jooyung Han580eb4f2020-06-24 19:33:06 +09005073 apex_key {
5074 name: "myapex.key",
5075 public_key: "testkey.avbpubkey",
5076 private_key: "testkey.pem",
5077 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079 filegroup {
5080 name: "my-file-contexts",
5081 srcs: ["product_specific_file_contexts"],
5082 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005083 `, withFiles(map[string][]byte{
5084 "product_specific_file_contexts": nil,
5085 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005086 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5087 rule := module.Output("file_contexts")
5088 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005089}
5090
Jiyong Park67882562019-03-21 01:11:21 +09005091func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005092 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005093 apex_key {
5094 name: "myapex.key",
5095 public_key: ":my.avbpubkey",
5096 private_key: ":my.pem",
5097 product_specific: true,
5098 }
5099
5100 filegroup {
5101 name: "my.avbpubkey",
5102 srcs: ["testkey2.avbpubkey"],
5103 }
5104
5105 filegroup {
5106 name: "my.pem",
5107 srcs: ["testkey2.pem"],
5108 }
5109 `)
5110
5111 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5112 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005113 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005114 if actual_pubkey != expected_pubkey {
5115 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5116 }
5117 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005118 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005119 if actual_privkey != expected_privkey {
5120 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5121 }
5122}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005123
5124func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005125 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005126 prebuilt_apex {
5127 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005128 arch: {
5129 arm64: {
5130 src: "myapex-arm64.apex",
5131 },
5132 arm: {
5133 src: "myapex-arm.apex",
5134 },
5135 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005136 }
5137 `)
5138
Wei Li340ee8e2022-03-18 17:33:24 -07005139 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5140 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005141
Jiyong Parkc95714e2019-03-29 14:23:10 +09005142 expectedInput := "myapex-arm64.apex"
5143 if prebuilt.inputApex.String() != expectedInput {
5144 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5145 }
Wei Li340ee8e2022-03-18 17:33:24 -07005146 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5147 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5148 rule := testingModule.Rule("genProvenanceMetaData")
5149 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5150 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5151 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5152 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005153
5154 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5155 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005156}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005157
Paul Duffinc0609c62021-03-01 17:27:16 +00005158func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005159 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005160 prebuilt_apex {
5161 name: "myapex",
5162 }
5163 `)
5164}
5165
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005166func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005167 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005168 prebuilt_apex {
5169 name: "myapex",
5170 src: "myapex-arm.apex",
5171 filename: "notmyapex.apex",
5172 }
5173 `)
5174
Wei Li340ee8e2022-03-18 17:33:24 -07005175 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5176 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005177
5178 expected := "notmyapex.apex"
5179 if p.installFilename != expected {
5180 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5181 }
Wei Li340ee8e2022-03-18 17:33:24 -07005182 rule := testingModule.Rule("genProvenanceMetaData")
5183 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5184 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5185 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5186 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005187}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005188
Samiul Islam7c02e262021-09-08 17:48:28 +01005189func TestApexSetFilenameOverride(t *testing.T) {
5190 testApex(t, `
5191 apex_set {
5192 name: "com.company.android.myapex",
5193 apex_name: "com.android.myapex",
5194 set: "company-myapex.apks",
5195 filename: "com.company.android.myapex.apex"
5196 }
5197 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5198
5199 testApex(t, `
5200 apex_set {
5201 name: "com.company.android.myapex",
5202 apex_name: "com.android.myapex",
5203 set: "company-myapex.apks",
5204 filename: "com.company.android.myapex.capex"
5205 }
5206 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5207
5208 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5209 apex_set {
5210 name: "com.company.android.myapex",
5211 apex_name: "com.android.myapex",
5212 set: "company-myapex.apks",
5213 filename: "some-random-suffix"
5214 }
5215 `)
5216}
5217
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005218func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005219 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005220 prebuilt_apex {
5221 name: "myapex.prebuilt",
5222 src: "myapex-arm.apex",
5223 overrides: [
5224 "myapex",
5225 ],
5226 }
5227 `)
5228
Wei Li340ee8e2022-03-18 17:33:24 -07005229 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5230 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005231
5232 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005233 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005234 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005235 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005236 }
Wei Li340ee8e2022-03-18 17:33:24 -07005237 rule := testingModule.Rule("genProvenanceMetaData")
5238 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5239 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5240 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5241 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005242}
5243
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005244func TestPrebuiltApexName(t *testing.T) {
5245 testApex(t, `
5246 prebuilt_apex {
5247 name: "com.company.android.myapex",
5248 apex_name: "com.android.myapex",
5249 src: "company-myapex-arm.apex",
5250 }
5251 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5252
5253 testApex(t, `
5254 apex_set {
5255 name: "com.company.android.myapex",
5256 apex_name: "com.android.myapex",
5257 set: "company-myapex.apks",
5258 }
5259 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5260}
5261
5262func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5263 _ = android.GroupFixturePreparers(
5264 java.PrepareForTestWithJavaDefaultModules,
5265 PrepareForTestWithApexBuildComponents,
5266 android.FixtureWithRootAndroidBp(`
5267 platform_bootclasspath {
5268 name: "platform-bootclasspath",
5269 fragments: [
5270 {
5271 apex: "com.android.art",
5272 module: "art-bootclasspath-fragment",
5273 },
5274 ],
5275 }
5276
5277 prebuilt_apex {
5278 name: "com.company.android.art",
5279 apex_name: "com.android.art",
5280 src: "com.company.android.art-arm.apex",
5281 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5282 }
5283
5284 prebuilt_bootclasspath_fragment {
5285 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005286 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005287 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005288 hidden_api: {
5289 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5290 metadata: "my-bootclasspath-fragment/metadata.csv",
5291 index: "my-bootclasspath-fragment/index.csv",
5292 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5293 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5294 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005295 }
5296
5297 java_import {
5298 name: "core-oj",
5299 jars: ["prebuilt.jar"],
5300 }
5301 `),
5302 ).RunTest(t)
5303}
5304
Paul Duffin092153d2021-01-26 11:42:39 +00005305// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5306// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005307func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005308 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005309
Paul Duffin89886cb2021-02-05 16:44:03 +00005310 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005311 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005312 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005313 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005314 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005315 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005316 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5317 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5318 android.NormalizePathForTesting(dexJarBuildPath))
5319 }
5320
5321 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005322 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005323 // Make sure the import has been given the correct path to the dex jar.
5324 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5325 dexJarBuildPath := p.DexJarInstallPath()
5326 stem := android.RemoveOptionalPrebuiltPrefix(name)
5327 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5328 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5329 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005330 }
5331
Paul Duffin39853512021-02-26 11:09:39 +00005332 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005333 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005334 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005335 android.AssertArrayString(t, "Check if there is no source variant",
5336 []string{"android_common"},
5337 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005338 }
5339
5340 t.Run("prebuilt only", func(t *testing.T) {
5341 bp := `
5342 prebuilt_apex {
5343 name: "myapex",
5344 arch: {
5345 arm64: {
5346 src: "myapex-arm64.apex",
5347 },
5348 arm: {
5349 src: "myapex-arm.apex",
5350 },
5351 },
Paul Duffin39853512021-02-26 11:09:39 +00005352 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005353 }
5354
5355 java_import {
5356 name: "libfoo",
5357 jars: ["libfoo.jar"],
5358 }
Paul Duffin39853512021-02-26 11:09:39 +00005359
5360 java_sdk_library_import {
5361 name: "libbar",
5362 public: {
5363 jars: ["libbar.jar"],
5364 },
5365 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005366 `
5367
5368 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5369 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5370
Martin Stjernholm44825602021-09-17 01:44:12 +01005371 deapexerName := deapexerModuleName("myapex")
5372 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5373
Paul Duffinf6932af2021-02-26 18:21:56 +00005374 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005375 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005376 rule := deapexer.Rule("deapexer")
5377 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5378 t.Errorf("expected: %q, found: %q", expected, actual)
5379 }
5380
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005381 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005382 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005383 rule = prebuiltApex.Rule("android/soong/android.Cp")
5384 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5385 t.Errorf("expected: %q, found: %q", expected, actual)
5386 }
5387
Paul Duffin89886cb2021-02-05 16:44:03 +00005388 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005389 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005390
5391 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005392 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005393 })
5394
5395 t.Run("prebuilt with source preferred", func(t *testing.T) {
5396
5397 bp := `
5398 prebuilt_apex {
5399 name: "myapex",
5400 arch: {
5401 arm64: {
5402 src: "myapex-arm64.apex",
5403 },
5404 arm: {
5405 src: "myapex-arm.apex",
5406 },
5407 },
Paul Duffin39853512021-02-26 11:09:39 +00005408 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005409 }
5410
5411 java_import {
5412 name: "libfoo",
5413 jars: ["libfoo.jar"],
5414 }
5415
5416 java_library {
5417 name: "libfoo",
5418 }
Paul Duffin39853512021-02-26 11:09:39 +00005419
5420 java_sdk_library_import {
5421 name: "libbar",
5422 public: {
5423 jars: ["libbar.jar"],
5424 },
5425 }
5426
5427 java_sdk_library {
5428 name: "libbar",
5429 srcs: ["foo/bar/MyClass.java"],
5430 unsafe_ignore_missing_latest_api: true,
5431 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005432 `
5433
5434 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5435 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5436
Paul Duffin89886cb2021-02-05 16:44:03 +00005437 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005438 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005439 ensureNoSourceVariant(t, ctx, "libfoo")
5440
5441 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005442 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005443 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005444 })
5445
5446 t.Run("prebuilt preferred with source", func(t *testing.T) {
5447 bp := `
5448 prebuilt_apex {
5449 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005450 arch: {
5451 arm64: {
5452 src: "myapex-arm64.apex",
5453 },
5454 arm: {
5455 src: "myapex-arm.apex",
5456 },
5457 },
Paul Duffin39853512021-02-26 11:09:39 +00005458 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005459 }
5460
5461 java_import {
5462 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005463 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005464 jars: ["libfoo.jar"],
5465 }
5466
5467 java_library {
5468 name: "libfoo",
5469 }
Paul Duffin39853512021-02-26 11:09:39 +00005470
5471 java_sdk_library_import {
5472 name: "libbar",
5473 prefer: true,
5474 public: {
5475 jars: ["libbar.jar"],
5476 },
5477 }
5478
5479 java_sdk_library {
5480 name: "libbar",
5481 srcs: ["foo/bar/MyClass.java"],
5482 unsafe_ignore_missing_latest_api: true,
5483 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005484 `
5485
5486 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5487 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5488
Paul Duffin89886cb2021-02-05 16:44:03 +00005489 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005490 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005491 ensureNoSourceVariant(t, ctx, "libfoo")
5492
5493 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005494 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005495 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005496 })
5497}
5498
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005500 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005501 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005502 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5503 // is disabled.
5504 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5505 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005506
Paul Duffin37856732021-02-26 14:24:15 +00005507 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5508 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005509 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005510 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005511 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005512 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005513 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005514 foundLibfooJar = true
5515 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005516 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005517 }
5518 }
5519 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005520 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 +00005521 }
5522 }
5523
Paul Duffin40a3f652021-07-19 13:11:24 +01005524 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005525 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005526 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005527 var rule android.TestingBuildParams
5528
5529 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5530 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005531 }
5532
Paul Duffin40a3f652021-07-19 13:11:24 +01005533 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5534 t.Helper()
5535 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5536 var rule android.TestingBuildParams
5537
5538 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5539 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5540 }
5541
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 fragment := java.ApexVariantReference{
5543 Apex: proptools.StringPtr("myapex"),
5544 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5545 }
5546
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 t.Run("prebuilt only", func(t *testing.T) {
5548 bp := `
5549 prebuilt_apex {
5550 name: "myapex",
5551 arch: {
5552 arm64: {
5553 src: "myapex-arm64.apex",
5554 },
5555 arm: {
5556 src: "myapex-arm.apex",
5557 },
5558 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005559 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5560 }
5561
5562 prebuilt_bootclasspath_fragment {
5563 name: "my-bootclasspath-fragment",
5564 contents: ["libfoo", "libbar"],
5565 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005566 hidden_api: {
5567 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5568 metadata: "my-bootclasspath-fragment/metadata.csv",
5569 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005570 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5571 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5572 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005573 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575
5576 java_import {
5577 name: "libfoo",
5578 jars: ["libfoo.jar"],
5579 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005580 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
Paul Duffin37856732021-02-26 14:24:15 +00005582
5583 java_sdk_library_import {
5584 name: "libbar",
5585 public: {
5586 jars: ["libbar.jar"],
5587 },
5588 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005589 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005590 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005591 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005592 `
5593
Paul Duffin89f570a2021-06-16 01:42:33 +01005594 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005595 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5596 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005597
Paul Duffin537ea3d2021-05-14 10:38:00 +01005598 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005599 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005600 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005601 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005602 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005603 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005604 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005605 })
5606
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005607 t.Run("apex_set only", func(t *testing.T) {
5608 bp := `
5609 apex_set {
5610 name: "myapex",
5611 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005612 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005613 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005614 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5615 }
5616
5617 java_import {
5618 name: "myjavalib",
5619 jars: ["myjavalib.jar"],
5620 apex_available: ["myapex"],
5621 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005622 }
5623
5624 prebuilt_bootclasspath_fragment {
5625 name: "my-bootclasspath-fragment",
5626 contents: ["libfoo", "libbar"],
5627 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005628 hidden_api: {
5629 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5630 metadata: "my-bootclasspath-fragment/metadata.csv",
5631 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005632 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5633 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5634 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005635 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005636 }
5637
Liz Kammer2dc72442023-04-20 10:10:48 -04005638 prebuilt_systemserverclasspath_fragment {
5639 name: "my-systemserverclasspath-fragment",
5640 contents: ["libbaz"],
5641 apex_available: ["myapex"],
5642 }
5643
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005644 java_import {
5645 name: "libfoo",
5646 jars: ["libfoo.jar"],
5647 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005648 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005649 }
5650
5651 java_sdk_library_import {
5652 name: "libbar",
5653 public: {
5654 jars: ["libbar.jar"],
5655 },
5656 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005657 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005658 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005659 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005660
5661 java_sdk_library_import {
5662 name: "libbaz",
5663 public: {
5664 jars: ["libbaz.jar"],
5665 },
5666 apex_available: ["myapex"],
5667 shared_library: false,
5668 permitted_packages: ["baz"],
5669 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005670 `
5671
Paul Duffin89f570a2021-06-16 01:42:33 +01005672 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005673 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5674 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5675
Paul Duffin537ea3d2021-05-14 10:38:00 +01005676 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005677 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005678 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005679 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005680 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005681 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005682 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005683
5684 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5685
5686 overrideNames := []string{
5687 "",
5688 "myjavalib.myapex",
5689 "libfoo.myapex",
5690 "libbar.myapex",
5691 "libbaz.myapex",
5692 }
5693 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5694 for i, e := range mkEntries {
5695 g := e.OverrideName
5696 if w := overrideNames[i]; w != g {
5697 t.Errorf("Expected override name %q, got %q", w, g)
5698 }
5699 }
5700
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005701 })
5702
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005703 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5704 bp := `
5705 prebuilt_apex {
5706 name: "myapex",
5707 arch: {
5708 arm64: {
5709 src: "myapex-arm64.apex",
5710 },
5711 arm: {
5712 src: "myapex-arm.apex",
5713 },
5714 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005715 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5716 }
5717
5718 prebuilt_bootclasspath_fragment {
5719 name: "my-bootclasspath-fragment",
5720 contents: ["libfoo", "libbar"],
5721 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005722 hidden_api: {
5723 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5724 metadata: "my-bootclasspath-fragment/metadata.csv",
5725 index: "my-bootclasspath-fragment/index.csv",
5726 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5727 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5728 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005729 }
5730
5731 java_import {
5732 name: "libfoo",
5733 jars: ["libfoo.jar"],
5734 apex_available: ["myapex"],
5735 }
5736
5737 java_library {
5738 name: "libfoo",
5739 srcs: ["foo/bar/MyClass.java"],
5740 apex_available: ["myapex"],
5741 }
Paul Duffin37856732021-02-26 14:24:15 +00005742
5743 java_sdk_library_import {
5744 name: "libbar",
5745 public: {
5746 jars: ["libbar.jar"],
5747 },
5748 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005749 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005750 }
5751
5752 java_sdk_library {
5753 name: "libbar",
5754 srcs: ["foo/bar/MyClass.java"],
5755 unsafe_ignore_missing_latest_api: true,
5756 apex_available: ["myapex"],
5757 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005758 `
5759
5760 // In this test the source (java_library) libfoo is active since the
5761 // prebuilt (java_import) defaults to prefer:false. However the
5762 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5763 // find the dex boot jar in it. We either need to disable the source libfoo
5764 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005765 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005766 // dexbootjar check is skipped if AllowMissingDependencies is true
5767 preparerAllowMissingDeps := android.GroupFixturePreparers(
5768 preparer,
5769 android.PrepareForTestWithAllowMissingDependencies,
5770 )
5771 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005772 })
5773
5774 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5775 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005776 apex {
5777 name: "myapex",
5778 key: "myapex.key",
5779 updatable: false,
5780 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5781 }
5782
5783 apex_key {
5784 name: "myapex.key",
5785 public_key: "testkey.avbpubkey",
5786 private_key: "testkey.pem",
5787 }
5788
5789 bootclasspath_fragment {
5790 name: "my-bootclasspath-fragment",
5791 contents: ["libfoo", "libbar"],
5792 apex_available: ["myapex"],
5793 hidden_api: {
5794 split_packages: ["*"],
5795 },
5796 }
5797
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005798 prebuilt_apex {
5799 name: "myapex",
5800 arch: {
5801 arm64: {
5802 src: "myapex-arm64.apex",
5803 },
5804 arm: {
5805 src: "myapex-arm.apex",
5806 },
5807 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005808 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5809 }
5810
5811 prebuilt_bootclasspath_fragment {
5812 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005813 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005814 contents: ["libfoo", "libbar"],
5815 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005816 hidden_api: {
5817 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5818 metadata: "my-bootclasspath-fragment/metadata.csv",
5819 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005820 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5821 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5822 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005823 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005824 }
5825
5826 java_import {
5827 name: "libfoo",
5828 prefer: true,
5829 jars: ["libfoo.jar"],
5830 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005831 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005832 }
5833
5834 java_library {
5835 name: "libfoo",
5836 srcs: ["foo/bar/MyClass.java"],
5837 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005838 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005839 }
Paul Duffin37856732021-02-26 14:24:15 +00005840
5841 java_sdk_library_import {
5842 name: "libbar",
5843 prefer: true,
5844 public: {
5845 jars: ["libbar.jar"],
5846 },
5847 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005848 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005849 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005850 }
5851
5852 java_sdk_library {
5853 name: "libbar",
5854 srcs: ["foo/bar/MyClass.java"],
5855 unsafe_ignore_missing_latest_api: true,
5856 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005857 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005858 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005859 `
5860
Paul Duffin89f570a2021-06-16 01:42:33 +01005861 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005862 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5863 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005864
Paul Duffin537ea3d2021-05-14 10:38:00 +01005865 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005866 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005867 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005868 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005869 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005870 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005871 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005872 })
5873
5874 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5875 bp := `
5876 apex {
5877 name: "myapex",
5878 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005879 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005880 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005881 }
5882
5883 apex_key {
5884 name: "myapex.key",
5885 public_key: "testkey.avbpubkey",
5886 private_key: "testkey.pem",
5887 }
5888
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005889 bootclasspath_fragment {
5890 name: "my-bootclasspath-fragment",
5891 contents: ["libfoo", "libbar"],
5892 apex_available: ["myapex"],
5893 hidden_api: {
5894 split_packages: ["*"],
5895 },
5896 }
5897
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005898 prebuilt_apex {
5899 name: "myapex",
5900 arch: {
5901 arm64: {
5902 src: "myapex-arm64.apex",
5903 },
5904 arm: {
5905 src: "myapex-arm.apex",
5906 },
5907 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005908 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5909 }
5910
5911 prebuilt_bootclasspath_fragment {
5912 name: "my-bootclasspath-fragment",
5913 contents: ["libfoo", "libbar"],
5914 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005915 hidden_api: {
5916 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5917 metadata: "my-bootclasspath-fragment/metadata.csv",
5918 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005919 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5920 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5921 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005922 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005923 }
5924
5925 java_import {
5926 name: "libfoo",
5927 jars: ["libfoo.jar"],
5928 apex_available: ["myapex"],
5929 }
5930
5931 java_library {
5932 name: "libfoo",
5933 srcs: ["foo/bar/MyClass.java"],
5934 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005935 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005936 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005937 }
Paul Duffin37856732021-02-26 14:24:15 +00005938
5939 java_sdk_library_import {
5940 name: "libbar",
5941 public: {
5942 jars: ["libbar.jar"],
5943 },
5944 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005945 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005946 }
5947
5948 java_sdk_library {
5949 name: "libbar",
5950 srcs: ["foo/bar/MyClass.java"],
5951 unsafe_ignore_missing_latest_api: true,
5952 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005953 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005954 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005955 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005956 `
5957
Paul Duffin89f570a2021-06-16 01:42:33 +01005958 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005959 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5960 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005961
Paul Duffin537ea3d2021-05-14 10:38:00 +01005962 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005963 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005964 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5965 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005966 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5967 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005968 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005969 })
5970
5971 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5972 bp := `
5973 apex {
5974 name: "myapex",
5975 enabled: false,
5976 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005977 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 }
5979
5980 apex_key {
5981 name: "myapex.key",
5982 public_key: "testkey.avbpubkey",
5983 private_key: "testkey.pem",
5984 }
5985
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005986 bootclasspath_fragment {
5987 name: "my-bootclasspath-fragment",
5988 enabled: false,
5989 contents: ["libfoo", "libbar"],
5990 apex_available: ["myapex"],
5991 hidden_api: {
5992 split_packages: ["*"],
5993 },
5994 }
5995
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005996 prebuilt_apex {
5997 name: "myapex",
5998 arch: {
5999 arm64: {
6000 src: "myapex-arm64.apex",
6001 },
6002 arm: {
6003 src: "myapex-arm.apex",
6004 },
6005 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006006 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6007 }
6008
6009 prebuilt_bootclasspath_fragment {
6010 name: "my-bootclasspath-fragment",
6011 contents: ["libfoo", "libbar"],
6012 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006013 hidden_api: {
6014 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6015 metadata: "my-bootclasspath-fragment/metadata.csv",
6016 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006017 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6018 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6019 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006020 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006021 }
6022
6023 java_import {
6024 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006025 jars: ["libfoo.jar"],
6026 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006027 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006028 }
6029
6030 java_library {
6031 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006032 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006033 srcs: ["foo/bar/MyClass.java"],
6034 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006035 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006036 }
Paul Duffin37856732021-02-26 14:24:15 +00006037
6038 java_sdk_library_import {
6039 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006040 public: {
6041 jars: ["libbar.jar"],
6042 },
6043 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006044 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006045 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006046 }
6047
6048 java_sdk_library {
6049 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006050 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006051 srcs: ["foo/bar/MyClass.java"],
6052 unsafe_ignore_missing_latest_api: true,
6053 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006054 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006055 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006056 `
6057
Paul Duffin89f570a2021-06-16 01:42:33 +01006058 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006059 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6060 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006061
Paul Duffin537ea3d2021-05-14 10:38:00 +01006062 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006063 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006064 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006065 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006066 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006067 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006068 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006069 })
6070}
6071
Roland Levillain630846d2019-06-26 12:48:34 +01006072func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006073 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006074 apex_test {
6075 name: "myapex",
6076 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006077 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006078 tests: [
6079 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006080 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006081 ],
6082 }
6083
6084 apex_key {
6085 name: "myapex.key",
6086 public_key: "testkey.avbpubkey",
6087 private_key: "testkey.pem",
6088 }
6089
Liz Kammer1c14a212020-05-12 15:26:55 -07006090 filegroup {
6091 name: "fg",
6092 srcs: [
6093 "baz",
6094 "bar/baz"
6095 ],
6096 }
6097
Roland Levillain630846d2019-06-26 12:48:34 +01006098 cc_test {
6099 name: "mytest",
6100 gtest: false,
6101 srcs: ["mytest.cpp"],
6102 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006103 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006104 system_shared_libs: [],
6105 static_executable: true,
6106 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006107 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006108 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006109
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006110 cc_library {
6111 name: "mylib",
6112 srcs: ["mylib.cpp"],
6113 system_shared_libs: [],
6114 stl: "none",
6115 }
6116
Liz Kammer5bd365f2020-05-27 15:15:11 -07006117 filegroup {
6118 name: "fg2",
6119 srcs: [
6120 "testdata/baz"
6121 ],
6122 }
6123
Roland Levillain9b5fde92019-06-28 15:41:19 +01006124 cc_test {
6125 name: "mytests",
6126 gtest: false,
6127 srcs: [
6128 "mytest1.cpp",
6129 "mytest2.cpp",
6130 "mytest3.cpp",
6131 ],
6132 test_per_src: true,
6133 relative_install_path: "test",
6134 system_shared_libs: [],
6135 static_executable: true,
6136 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006137 data: [
6138 ":fg",
6139 ":fg2",
6140 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006141 }
Roland Levillain630846d2019-06-26 12:48:34 +01006142 `)
6143
Sundong Ahnabb64432019-10-22 13:58:29 +09006144 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006145 copyCmds := apexRule.Args["copy_commands"]
6146
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006147 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006148 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006149 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006150
Liz Kammer1c14a212020-05-12 15:26:55 -07006151 //Ensure that test data are copied into apex.
6152 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6153 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6154
Roland Levillain9b5fde92019-06-28 15:41:19 +01006155 // Ensure that test deps built with `test_per_src` are copied into apex.
6156 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6157 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6158 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006159
6160 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006161 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006162 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006163 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006164 prefix := "TARGET_"
6165 var builder strings.Builder
6166 data.Custom(&builder, name, prefix, "", data)
6167 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006168 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6169 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6170 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6171 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006172 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006173}
6174
Jooyung Hand48f3c32019-08-23 11:18:57 +09006175func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6176 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6177 apex {
6178 name: "myapex",
6179 key: "myapex.key",
6180 native_shared_libs: ["libfoo"],
6181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 cc_library {
6190 name: "libfoo",
6191 stl: "none",
6192 system_shared_libs: [],
6193 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006194 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006195 }
6196 `)
6197 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 java_libs: ["myjar"],
6202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 java_library {
6211 name: "myjar",
6212 srcs: ["foo/bar/MyClass.java"],
6213 sdk_version: "none",
6214 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006215 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006216 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006217 }
6218 `)
6219}
6220
Bill Peckhama41a6962021-01-11 10:58:54 -08006221func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006222 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006223 apex {
6224 name: "myapex",
6225 key: "myapex.key",
6226 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006227 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006228 }
6229
6230 apex_key {
6231 name: "myapex.key",
6232 public_key: "testkey.avbpubkey",
6233 private_key: "testkey.pem",
6234 }
6235
6236 java_import {
6237 name: "myjavaimport",
6238 apex_available: ["myapex"],
6239 jars: ["my.jar"],
6240 compile_dex: true,
6241 }
6242 `)
6243
6244 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6245 apexRule := module.Rule("apexRule")
6246 copyCmds := apexRule.Args["copy_commands"]
6247 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6248}
6249
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006250func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006251 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006252 apex {
6253 name: "myapex",
6254 key: "myapex.key",
6255 apps: [
6256 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006257 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006258 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006259 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006260 }
6261
6262 apex_key {
6263 name: "myapex.key",
6264 public_key: "testkey.avbpubkey",
6265 private_key: "testkey.pem",
6266 }
6267
6268 android_app {
6269 name: "AppFoo",
6270 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006271 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006272 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006273 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006274 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006275 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006276 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006277
6278 android_app {
6279 name: "AppFooPriv",
6280 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006281 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006282 system_modules: "none",
6283 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006284 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006285 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006286 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006287 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006288
6289 cc_library_shared {
6290 name: "libjni",
6291 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006292 shared_libs: ["libfoo"],
6293 stl: "none",
6294 system_shared_libs: [],
6295 apex_available: [ "myapex" ],
6296 sdk_version: "current",
6297 }
6298
6299 cc_library_shared {
6300 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006301 stl: "none",
6302 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006303 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006304 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006305 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006306 `)
6307
Sundong Ahnabb64432019-10-22 13:58:29 +09006308 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006309 apexRule := module.Rule("apexRule")
6310 copyCmds := apexRule.Args["copy_commands"]
6311
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006312 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6313 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006314 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006315
Colin Crossaede88c2020-08-11 12:17:01 -07006316 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006317 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006318 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006319 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006320 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006321 // JNI libraries including transitive deps are
6322 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006323 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006324 // ... embedded inside APK (jnilibs.zip)
6325 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6326 // ... and not directly inside the APEX
6327 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6328 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006329
6330 apexBundle := module.Module().(*apexBundle)
6331 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6332 var builder strings.Builder
6333 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6334 androidMk := builder.String()
6335 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6336 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6337 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6338 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6339 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6340 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 +01006341}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006342
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006343func TestApexWithAppImportBuildId(t *testing.T) {
6344 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6345 for _, id := range invalidBuildIds {
6346 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6347 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6348 variables.BuildId = proptools.StringPtr(id)
6349 })
6350 testApexError(t, message, `apex {
6351 name: "myapex",
6352 key: "myapex.key",
6353 apps: ["AppFooPrebuilt"],
6354 updatable: false,
6355 }
6356
6357 apex_key {
6358 name: "myapex.key",
6359 public_key: "testkey.avbpubkey",
6360 private_key: "testkey.pem",
6361 }
6362
6363 android_app_import {
6364 name: "AppFooPrebuilt",
6365 apk: "PrebuiltAppFoo.apk",
6366 presigned: true,
6367 apex_available: ["myapex"],
6368 }
6369 `, fixture)
6370 }
6371}
6372
Dario Frenicde2a032019-10-27 00:29:22 +01006373func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006374 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006375 apex {
6376 name: "myapex",
6377 key: "myapex.key",
6378 apps: [
6379 "AppFooPrebuilt",
6380 "AppFooPrivPrebuilt",
6381 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006382 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006383 }
6384
6385 apex_key {
6386 name: "myapex.key",
6387 public_key: "testkey.avbpubkey",
6388 private_key: "testkey.pem",
6389 }
6390
6391 android_app_import {
6392 name: "AppFooPrebuilt",
6393 apk: "PrebuiltAppFoo.apk",
6394 presigned: true,
6395 dex_preopt: {
6396 enabled: false,
6397 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006398 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006399 }
6400
6401 android_app_import {
6402 name: "AppFooPrivPrebuilt",
6403 apk: "PrebuiltAppFooPriv.apk",
6404 privileged: true,
6405 presigned: true,
6406 dex_preopt: {
6407 enabled: false,
6408 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006409 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006410 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006411 }
6412 `)
6413
Sundong Ahnabb64432019-10-22 13:58:29 +09006414 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006415 apexRule := module.Rule("apexRule")
6416 copyCmds := apexRule.Args["copy_commands"]
6417
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006418 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6419 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006420}
6421
6422func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006423 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006424 apex {
6425 name: "myapex",
6426 key: "myapex.key",
6427 apps: [
6428 "AppFoo",
6429 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006430 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006431 }
6432
6433 apex_key {
6434 name: "myapex.key",
6435 public_key: "testkey.avbpubkey",
6436 private_key: "testkey.pem",
6437 }
6438
6439 android_app {
6440 name: "AppFoo",
6441 srcs: ["foo/bar/MyClass.java"],
6442 sdk_version: "none",
6443 system_modules: "none",
6444 apex_available: [ "myapex" ],
6445 }
6446
6447 android_app_import {
6448 name: "AppFoo",
6449 apk: "AppFooPrebuilt.apk",
6450 filename: "AppFooPrebuilt.apk",
6451 presigned: true,
6452 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006453 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006454 }
6455 `, withFiles(map[string][]byte{
6456 "AppFooPrebuilt.apk": nil,
6457 }))
6458
6459 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006460 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006461 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006462}
6463
Dario Freni6f3937c2019-12-20 22:58:03 +00006464func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006465 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006466 apex {
6467 name: "myapex",
6468 key: "myapex.key",
6469 apps: [
6470 "TesterHelpAppFoo",
6471 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006472 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006473 }
6474
6475 apex_key {
6476 name: "myapex.key",
6477 public_key: "testkey.avbpubkey",
6478 private_key: "testkey.pem",
6479 }
6480
6481 android_test_helper_app {
6482 name: "TesterHelpAppFoo",
6483 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006484 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006485 }
6486
6487 `)
6488
6489 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6490 apexRule := module.Rule("apexRule")
6491 copyCmds := apexRule.Args["copy_commands"]
6492
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006493 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006494}
6495
Jooyung Han18020ea2019-11-13 10:50:48 +09006496func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6497 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006498 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006499 apex {
6500 name: "myapex",
6501 key: "myapex.key",
6502 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006503 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006504 }
6505
6506 apex_key {
6507 name: "myapex.key",
6508 public_key: "testkey.avbpubkey",
6509 private_key: "testkey.pem",
6510 }
6511
6512 apex {
6513 name: "otherapex",
6514 key: "myapex.key",
6515 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006516 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006517 }
6518
6519 cc_defaults {
6520 name: "libfoo-defaults",
6521 apex_available: ["otherapex"],
6522 }
6523
6524 cc_library {
6525 name: "libfoo",
6526 defaults: ["libfoo-defaults"],
6527 stl: "none",
6528 system_shared_libs: [],
6529 }`)
6530}
6531
Paul Duffine52e66f2020-03-30 17:54:29 +01006532func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006533 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006534 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006535 apex {
6536 name: "myapex",
6537 key: "myapex.key",
6538 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006539 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006540 }
6541
6542 apex_key {
6543 name: "myapex.key",
6544 public_key: "testkey.avbpubkey",
6545 private_key: "testkey.pem",
6546 }
6547
6548 apex {
6549 name: "otherapex",
6550 key: "otherapex.key",
6551 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006552 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006553 }
6554
6555 apex_key {
6556 name: "otherapex.key",
6557 public_key: "testkey.avbpubkey",
6558 private_key: "testkey.pem",
6559 }
6560
6561 cc_library {
6562 name: "libfoo",
6563 stl: "none",
6564 system_shared_libs: [],
6565 apex_available: ["otherapex"],
6566 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006567}
Jiyong Park127b40b2019-09-30 16:04:35 +09006568
Paul Duffine52e66f2020-03-30 17:54:29 +01006569func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006570 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006571 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006572.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006573.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006574.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006575.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006576.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006577.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006578 apex {
6579 name: "myapex",
6580 key: "myapex.key",
6581 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006582 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006583 }
6584
6585 apex_key {
6586 name: "myapex.key",
6587 public_key: "testkey.avbpubkey",
6588 private_key: "testkey.pem",
6589 }
6590
Jiyong Park127b40b2019-09-30 16:04:35 +09006591 cc_library {
6592 name: "libfoo",
6593 stl: "none",
6594 shared_libs: ["libbar"],
6595 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006596 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006597 }
6598
6599 cc_library {
6600 name: "libbar",
6601 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006602 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006603 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006604 apex_available: ["myapex"],
6605 }
6606
6607 cc_library {
6608 name: "libbaz",
6609 stl: "none",
6610 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006611 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006612}
Jiyong Park127b40b2019-09-30 16:04:35 +09006613
Liz Kammer5f108fa2023-05-11 14:33:17 -04006614func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6615 testApex(t, `
6616 apex {
6617 name: "myapex",
6618 key: "myapex.key",
6619 native_shared_libs: ["libfoo"],
6620 updatable: false,
6621 }
6622
6623 apex_key {
6624 name: "myapex.key",
6625 public_key: "testkey.avbpubkey",
6626 private_key: "testkey.pem",
6627 }
6628
6629 cc_library {
6630 name: "libfoo",
6631 stl: "none",
6632 static_libs: ["libbar"],
6633 system_shared_libs: [],
6634 apex_available: ["myapex"],
6635 }
6636
6637 cc_library {
6638 name: "libbar",
6639 stl: "none",
6640 shared_libs: ["libbaz"],
6641 system_shared_libs: [],
6642 apex_available: ["myapex"],
6643 }
6644
6645 cc_library {
6646 name: "libbaz",
6647 stl: "none",
6648 system_shared_libs: [],
6649 }`)
6650
6651 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6652 apex {
6653 name: "myapex",
6654 key: "myapex.key",
6655 native_shared_libs: ["libfoo"],
6656 updatable: false,
6657 }
6658
6659 apex_key {
6660 name: "myapex.key",
6661 public_key: "testkey.avbpubkey",
6662 private_key: "testkey.pem",
6663 }
6664
6665 cc_library {
6666 name: "libfoo",
6667 stl: "none",
6668 static_libs: ["libbar"],
6669 system_shared_libs: [],
6670 apex_available: ["myapex"],
6671 }
6672
6673 cc_library {
6674 name: "libbar",
6675 stl: "none",
6676 system_shared_libs: [],
6677 }`)
6678}
6679
Paul Duffine52e66f2020-03-30 17:54:29 +01006680func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006681 testApexError(t, "\"otherapex\" is not a valid module name", `
6682 apex {
6683 name: "myapex",
6684 key: "myapex.key",
6685 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006686 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006687 }
6688
6689 apex_key {
6690 name: "myapex.key",
6691 public_key: "testkey.avbpubkey",
6692 private_key: "testkey.pem",
6693 }
6694
6695 cc_library {
6696 name: "libfoo",
6697 stl: "none",
6698 system_shared_libs: [],
6699 apex_available: ["otherapex"],
6700 }`)
6701
Paul Duffine52e66f2020-03-30 17:54:29 +01006702 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006703 apex {
6704 name: "myapex",
6705 key: "myapex.key",
6706 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006707 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006708 }
6709
6710 apex_key {
6711 name: "myapex.key",
6712 public_key: "testkey.avbpubkey",
6713 private_key: "testkey.pem",
6714 }
6715
6716 cc_library {
6717 name: "libfoo",
6718 stl: "none",
6719 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006720 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006721 apex_available: ["myapex"],
6722 }
6723
6724 cc_library {
6725 name: "libbar",
6726 stl: "none",
6727 system_shared_libs: [],
6728 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006729 }
6730
6731 cc_library {
6732 name: "libbaz",
6733 stl: "none",
6734 system_shared_libs: [],
6735 stubs: {
6736 versions: ["10", "20", "30"],
6737 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006738 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006739}
Jiyong Park127b40b2019-09-30 16:04:35 +09006740
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006741func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6742 t.Run("negative variant_version produces error", func(t *testing.T) {
6743 testApexError(t, "expected an integer between 0-9; got -1", `
6744 apex {
6745 name: "myapex",
6746 key: "myapex.key",
6747 apex_available_name: "com.android.foo",
6748 variant_version: "-1",
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
6759 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6760 testApexError(t, "expected an integer between 0-9; got 10", `
6761 apex {
6762 name: "myapex",
6763 key: "myapex.key",
6764 apex_available_name: "com.android.foo",
6765 variant_version: "10",
6766 updatable: false,
6767 }
6768 apex_key {
6769 name: "myapex.key",
6770 public_key: "testkey.avbpubkey",
6771 private_key: "testkey.pem",
6772 }
6773 `)
6774 })
6775}
6776
6777func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6778 context := android.GroupFixturePreparers(
6779 android.PrepareForIntegrationTestWithAndroid,
6780 PrepareForTestWithApexBuildComponents,
6781 android.FixtureMergeMockFs(android.MockFS{
6782 "system/sepolicy/apex/foo-file_contexts": nil,
6783 "system/sepolicy/apex/bar-file_contexts": nil,
6784 }),
6785 )
6786 result := context.RunTestWithBp(t, `
6787 apex {
6788 name: "foo",
6789 key: "myapex.key",
6790 apex_available_name: "com.android.foo",
6791 variant_version: "0",
6792 updatable: false,
6793 }
6794 apex {
6795 name: "bar",
6796 key: "myapex.key",
6797 apex_available_name: "com.android.foo",
6798 variant_version: "3",
6799 updatable: false,
6800 }
6801 apex_key {
6802 name: "myapex.key",
6803 public_key: "testkey.avbpubkey",
6804 private_key: "testkey.pem",
6805 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006806 override_apex {
6807 name: "myoverrideapex",
6808 base: "bar",
6809 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006810 `)
6811
6812 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6813 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6814 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6815 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6816 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6817 }
6818
6819 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6820 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6821 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6822 barActualDefaultVersion := barManifestRule.Args["default_version"]
6823 if barActualDefaultVersion != barExpectedDefaultVersion {
6824 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6825 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006826
6827 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar_image").Rule("apexManifestRule")
6828 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6829 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6830 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6831 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006832}
6833
Sam Delmericoca816532023-06-02 14:09:50 -04006834func TestApexAvailable_ApexAvailableName(t *testing.T) {
6835 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6836 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6837 apex {
6838 name: "myapex_sminus",
6839 key: "myapex.key",
6840 apps: ["AppFoo"],
6841 apex_available_name: "myapex",
6842 updatable: false,
6843 }
6844 apex {
6845 name: "myapex",
6846 key: "myapex.key",
6847 apps: ["AppFoo"],
6848 updatable: false,
6849 }
6850 apex_key {
6851 name: "myapex.key",
6852 public_key: "testkey.avbpubkey",
6853 private_key: "testkey.pem",
6854 }
6855 android_app {
6856 name: "AppFoo",
6857 srcs: ["foo/bar/MyClass.java"],
6858 sdk_version: "none",
6859 system_modules: "none",
6860 apex_available: [ "myapex_sminus" ],
6861 }`,
6862 android.FixtureMergeMockFs(android.MockFS{
6863 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6864 }),
6865 )
6866 })
6867
6868 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6869 testApex(t, `
6870 apex {
6871 name: "myapex_sminus",
6872 key: "myapex.key",
6873 apps: ["AppFoo"],
6874 apex_available_name: "myapex",
6875 updatable: false,
6876 }
6877 apex {
6878 name: "myapex",
6879 key: "myapex.key",
6880 apps: ["AppFoo"],
6881 updatable: false,
6882 }
6883 apex_key {
6884 name: "myapex.key",
6885 public_key: "testkey.avbpubkey",
6886 private_key: "testkey.pem",
6887 }
6888 android_app {
6889 name: "AppFoo",
6890 srcs: ["foo/bar/MyClass.java"],
6891 sdk_version: "none",
6892 system_modules: "none",
6893 apex_available: [ "myapex" ],
6894 }`,
6895 android.FixtureMergeMockFs(android.MockFS{
6896 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6897 }),
6898 )
6899 })
6900
6901 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6902 testApex(t, `
6903 override_apex {
6904 name: "myoverrideapex_sminus",
6905 base: "myapex_sminus",
6906 key: "myapex.key",
6907 apps: ["AppFooOverride"],
6908 }
6909 override_apex {
6910 name: "myoverrideapex",
6911 base: "myapex",
6912 key: "myapex.key",
6913 apps: ["AppFooOverride"],
6914 }
6915 apex {
6916 name: "myapex_sminus",
6917 key: "myapex.key",
6918 apps: ["AppFoo"],
6919 apex_available_name: "myapex",
6920 updatable: false,
6921 }
6922 apex {
6923 name: "myapex",
6924 key: "myapex.key",
6925 apps: ["AppFoo"],
6926 updatable: false,
6927 }
6928 apex_key {
6929 name: "myapex.key",
6930 public_key: "testkey.avbpubkey",
6931 private_key: "testkey.pem",
6932 }
6933 android_app {
6934 name: "AppFooOverride",
6935 srcs: ["foo/bar/MyClass.java"],
6936 sdk_version: "none",
6937 system_modules: "none",
6938 apex_available: [ "myapex" ],
6939 }
6940 android_app {
6941 name: "AppFoo",
6942 srcs: ["foo/bar/MyClass.java"],
6943 sdk_version: "none",
6944 system_modules: "none",
6945 apex_available: [ "myapex" ],
6946 }`,
6947 android.FixtureMergeMockFs(android.MockFS{
6948 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6949 }),
6950 )
6951 })
6952}
6953
6954func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6955 context := android.GroupFixturePreparers(
6956 android.PrepareForIntegrationTestWithAndroid,
6957 PrepareForTestWithApexBuildComponents,
6958 java.PrepareForTestWithDexpreopt,
6959 android.FixtureMergeMockFs(android.MockFS{
6960 "system/sepolicy/apex/myapex-file_contexts": nil,
6961 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6962 }),
6963 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6964 variables.BuildId = proptools.StringPtr("buildid")
6965 }),
6966 )
6967 context.RunTestWithBp(t, `
6968 override_apex {
6969 name: "myoverrideapex_sminus",
6970 base: "myapex_sminus",
6971 }
6972 override_apex {
6973 name: "myoverrideapex",
6974 base: "myapex",
6975 }
6976 apex {
6977 name: "myapex",
6978 key: "myapex.key",
6979 apps: ["AppFoo"],
6980 updatable: false,
6981 }
6982 apex {
6983 name: "myapex_sminus",
6984 apex_available_name: "myapex",
6985 key: "myapex.key",
6986 apps: ["AppFoo_sminus"],
6987 updatable: false,
6988 }
6989 apex_key {
6990 name: "myapex.key",
6991 public_key: "testkey.avbpubkey",
6992 private_key: "testkey.pem",
6993 }
6994 android_app {
6995 name: "AppFoo",
6996 srcs: ["foo/bar/MyClass.java"],
6997 sdk_version: "none",
6998 system_modules: "none",
6999 apex_available: [ "myapex" ],
7000 }
7001 android_app {
7002 name: "AppFoo_sminus",
7003 srcs: ["foo/bar/MyClass.java"],
7004 sdk_version: "none",
7005 min_sdk_version: "29",
7006 system_modules: "none",
7007 apex_available: [ "myapex" ],
7008 }`)
7009}
7010
Jiyong Park89e850a2020-04-07 16:37:39 +09007011func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007012 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007013 apex {
7014 name: "myapex",
7015 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007016 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007017 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007018 }
7019
7020 apex_key {
7021 name: "myapex.key",
7022 public_key: "testkey.avbpubkey",
7023 private_key: "testkey.pem",
7024 }
7025
7026 cc_library {
7027 name: "libfoo",
7028 stl: "none",
7029 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007030 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007031 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007032 }
7033
7034 cc_library {
7035 name: "libfoo2",
7036 stl: "none",
7037 system_shared_libs: [],
7038 shared_libs: ["libbaz"],
7039 apex_available: ["//apex_available:platform"],
7040 }
7041
7042 cc_library {
7043 name: "libbar",
7044 stl: "none",
7045 system_shared_libs: [],
7046 apex_available: ["myapex"],
7047 }
7048
7049 cc_library {
7050 name: "libbaz",
7051 stl: "none",
7052 system_shared_libs: [],
7053 apex_available: ["myapex"],
7054 stubs: {
7055 versions: ["1"],
7056 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007057 }`)
7058
Jiyong Park89e850a2020-04-07 16:37:39 +09007059 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7060 // because it depends on libbar which isn't available to platform
7061 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7062 if libfoo.NotAvailableForPlatform() != true {
7063 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7064 }
7065
7066 // libfoo2 however can be available to platform because it depends on libbaz which provides
7067 // stubs
7068 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7069 if libfoo2.NotAvailableForPlatform() == true {
7070 t.Errorf("%q should be available to platform", libfoo2.String())
7071 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007072}
Jiyong Parka90ca002019-10-07 15:47:24 +09007073
Paul Duffine52e66f2020-03-30 17:54:29 +01007074func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007075 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007076 apex {
7077 name: "myapex",
7078 key: "myapex.key",
7079 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007080 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007081 }
7082
7083 apex_key {
7084 name: "myapex.key",
7085 public_key: "testkey.avbpubkey",
7086 private_key: "testkey.pem",
7087 }
7088
7089 cc_library {
7090 name: "libfoo",
7091 stl: "none",
7092 system_shared_libs: [],
7093 apex_available: ["myapex"],
7094 static: {
7095 apex_available: ["//apex_available:platform"],
7096 },
7097 }`)
7098
Jiyong Park89e850a2020-04-07 16:37:39 +09007099 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7100 if libfooShared.NotAvailableForPlatform() != true {
7101 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7102 }
7103 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7104 if libfooStatic.NotAvailableForPlatform() != false {
7105 t.Errorf("%q should be available to platform", libfooStatic.String())
7106 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007107}
7108
Jiyong Park5d790c32019-11-15 18:40:32 +09007109func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007110 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007111 apex {
7112 name: "myapex",
7113 key: "myapex.key",
7114 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007115 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007116 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007117 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007118 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007119 }
7120
7121 override_apex {
7122 name: "override_myapex",
7123 base: "myapex",
7124 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007125 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007126 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007127 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007128 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007129 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007130 key: "mynewapex.key",
7131 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007132 }
7133
7134 apex_key {
7135 name: "myapex.key",
7136 public_key: "testkey.avbpubkey",
7137 private_key: "testkey.pem",
7138 }
7139
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007140 apex_key {
7141 name: "mynewapex.key",
7142 public_key: "testkey2.avbpubkey",
7143 private_key: "testkey2.pem",
7144 }
7145
7146 android_app_certificate {
7147 name: "myapex.certificate",
7148 certificate: "testkey",
7149 }
7150
Jiyong Park5d790c32019-11-15 18:40:32 +09007151 android_app {
7152 name: "app",
7153 srcs: ["foo/bar/MyClass.java"],
7154 package_name: "foo",
7155 sdk_version: "none",
7156 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007157 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007158 }
7159
7160 override_android_app {
7161 name: "override_app",
7162 base: "app",
7163 package_name: "bar",
7164 }
markchien7c803b82021-08-26 22:10:06 +08007165
7166 bpf {
7167 name: "bpf",
7168 srcs: ["bpf.c"],
7169 }
7170
7171 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007172 name: "overrideBpf",
7173 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007174 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007175
7176 prebuilt_etc {
7177 name: "myetc",
7178 src: "myprebuilt",
7179 }
7180
7181 prebuilt_etc {
7182 name: "override_myetc",
7183 src: "override_myprebuilt",
7184 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007185 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007186
Jiyong Park317645e2019-12-05 13:20:58 +09007187 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7188 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7189 if originalVariant.GetOverriddenBy() != "" {
7190 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7191 }
7192 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7193 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7194 }
7195
Jiyong Park5d790c32019-11-15 18:40:32 +09007196 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7197 apexRule := module.Rule("apexRule")
7198 copyCmds := apexRule.Args["copy_commands"]
7199
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007200 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7201 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007202
markchien7c803b82021-08-26 22:10:06 +08007203 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007204 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007205
Daniel Norman5a3ce132021-08-26 15:44:43 -07007206 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7207 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7208
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007209 apexBundle := module.Module().(*apexBundle)
7210 name := apexBundle.Name()
7211 if name != "override_myapex" {
7212 t.Errorf("name should be \"override_myapex\", but was %q", name)
7213 }
7214
Baligh Uddin004d7172020-02-19 21:29:28 -08007215 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7216 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7217 }
7218
Jiyong Park20bacab2020-03-03 11:45:41 +09007219 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007220 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007221 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7222
7223 signApkRule := module.Rule("signapk")
7224 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007225
Colin Crossaa255532020-07-03 13:18:24 -07007226 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007227 var builder strings.Builder
7228 data.Custom(&builder, name, "TARGET_", "", data)
7229 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007230 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7231 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007232 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007233 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007234 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007235 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007236 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007237 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007238}
7239
Albert Martineefabcf2022-03-21 20:11:16 +00007240func TestMinSdkVersionOverride(t *testing.T) {
7241 // Override from 29 to 31
7242 minSdkOverride31 := "31"
7243 ctx := testApex(t, `
7244 apex {
7245 name: "myapex",
7246 key: "myapex.key",
7247 native_shared_libs: ["mylib"],
7248 updatable: true,
7249 min_sdk_version: "29"
7250 }
7251
7252 override_apex {
7253 name: "override_myapex",
7254 base: "myapex",
7255 logging_parent: "com.foo.bar",
7256 package_name: "test.overridden.package"
7257 }
7258
7259 apex_key {
7260 name: "myapex.key",
7261 public_key: "testkey.avbpubkey",
7262 private_key: "testkey.pem",
7263 }
7264
7265 cc_library {
7266 name: "mylib",
7267 srcs: ["mylib.cpp"],
7268 runtime_libs: ["libbar"],
7269 system_shared_libs: [],
7270 stl: "none",
7271 apex_available: [ "myapex" ],
7272 min_sdk_version: "apex_inherit"
7273 }
7274
7275 cc_library {
7276 name: "libbar",
7277 srcs: ["mylib.cpp"],
7278 system_shared_libs: [],
7279 stl: "none",
7280 apex_available: [ "myapex" ],
7281 min_sdk_version: "apex_inherit"
7282 }
7283
7284 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7285
7286 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7287 copyCmds := apexRule.Args["copy_commands"]
7288
7289 // Ensure that direct non-stubs dep is always included
7290 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7291
7292 // Ensure that runtime_libs dep in included
7293 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7294
7295 // Ensure libraries target overridden min_sdk_version value
7296 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7297}
7298
7299func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7300 // Attempt to override from 31 to 29, should be a NOOP
7301 minSdkOverride29 := "29"
7302 ctx := testApex(t, `
7303 apex {
7304 name: "myapex",
7305 key: "myapex.key",
7306 native_shared_libs: ["mylib"],
7307 updatable: true,
7308 min_sdk_version: "31"
7309 }
7310
7311 override_apex {
7312 name: "override_myapex",
7313 base: "myapex",
7314 logging_parent: "com.foo.bar",
7315 package_name: "test.overridden.package"
7316 }
7317
7318 apex_key {
7319 name: "myapex.key",
7320 public_key: "testkey.avbpubkey",
7321 private_key: "testkey.pem",
7322 }
7323
7324 cc_library {
7325 name: "mylib",
7326 srcs: ["mylib.cpp"],
7327 runtime_libs: ["libbar"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 min_sdk_version: "apex_inherit"
7332 }
7333
7334 cc_library {
7335 name: "libbar",
7336 srcs: ["mylib.cpp"],
7337 system_shared_libs: [],
7338 stl: "none",
7339 apex_available: [ "myapex" ],
7340 min_sdk_version: "apex_inherit"
7341 }
7342
7343 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7344
7345 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7346 copyCmds := apexRule.Args["copy_commands"]
7347
7348 // Ensure that direct non-stubs dep is always included
7349 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7350
7351 // Ensure that runtime_libs dep in included
7352 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7353
7354 // Ensure libraries target the original min_sdk_version value rather than the overridden
7355 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7356}
7357
Jooyung Han214bf372019-11-12 13:03:50 +09007358func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007359 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007360 apex {
7361 name: "myapex",
7362 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007363 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007364 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007365 }
7366
7367 apex_key {
7368 name: "myapex.key",
7369 public_key: "testkey.avbpubkey",
7370 private_key: "testkey.pem",
7371 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007372
7373 cc_library {
7374 name: "mylib",
7375 srcs: ["mylib.cpp"],
7376 stl: "libc++",
7377 system_shared_libs: [],
7378 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007379 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007380 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007381 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007382
7383 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7384 args := module.Rule("apexRule").Args
7385 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007386 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007387
7388 // The copies of the libraries in the apex should have one more dependency than
7389 // the ones outside the apex, namely the unwinder. Ideally we should check
7390 // the dependency names directly here but for some reason the names are blank in
7391 // this test.
7392 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007393 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007394 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7395 if len(apexImplicits) != len(nonApexImplicits)+1 {
7396 t.Errorf("%q missing unwinder dep", lib)
7397 }
7398 }
Jooyung Han214bf372019-11-12 13:03:50 +09007399}
7400
Paul Duffine05480a2021-03-08 15:07:14 +00007401var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007402 "api/current.txt": nil,
7403 "api/removed.txt": nil,
7404 "api/system-current.txt": nil,
7405 "api/system-removed.txt": nil,
7406 "api/test-current.txt": nil,
7407 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007408
Anton Hanssondff2c782020-12-21 17:10:01 +00007409 "100/public/api/foo.txt": nil,
7410 "100/public/api/foo-removed.txt": nil,
7411 "100/system/api/foo.txt": nil,
7412 "100/system/api/foo-removed.txt": nil,
7413
Paul Duffineedc5d52020-06-12 17:46:39 +01007414 // For java_sdk_library_import
7415 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007416}
7417
Jooyung Han58f26ab2019-12-18 15:34:32 +09007418func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007419 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007420 apex {
7421 name: "myapex",
7422 key: "myapex.key",
7423 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007424 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007425 }
7426
7427 apex_key {
7428 name: "myapex.key",
7429 public_key: "testkey.avbpubkey",
7430 private_key: "testkey.pem",
7431 }
7432
7433 java_sdk_library {
7434 name: "foo",
7435 srcs: ["a.java"],
7436 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007437 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007438 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007439
7440 prebuilt_apis {
7441 name: "sdk",
7442 api_dirs: ["100"],
7443 }
Paul Duffin9b879592020-05-26 13:21:35 +01007444 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007445
7446 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007447 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007448 "javalib/foo.jar",
7449 "etc/permissions/foo.xml",
7450 })
7451 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007452 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007453 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 +09007454}
7455
Paul Duffin9b879592020-05-26 13:21:35 +01007456func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007457 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007458 apex {
7459 name: "myapex",
7460 key: "myapex.key",
7461 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007462 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007463 }
7464
7465 apex_key {
7466 name: "myapex.key",
7467 public_key: "testkey.avbpubkey",
7468 private_key: "testkey.pem",
7469 }
7470
7471 java_sdk_library {
7472 name: "foo",
7473 srcs: ["a.java"],
7474 api_packages: ["foo"],
7475 apex_available: ["myapex"],
7476 sdk_version: "none",
7477 system_modules: "none",
7478 }
7479
7480 java_library {
7481 name: "bar",
7482 srcs: ["a.java"],
7483 libs: ["foo"],
7484 apex_available: ["myapex"],
7485 sdk_version: "none",
7486 system_modules: "none",
7487 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007488
7489 prebuilt_apis {
7490 name: "sdk",
7491 api_dirs: ["100"],
7492 }
Paul Duffin9b879592020-05-26 13:21:35 +01007493 `, withFiles(filesForSdkLibrary))
7494
7495 // java_sdk_library installs both impl jar and permission XML
7496 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7497 "javalib/bar.jar",
7498 "javalib/foo.jar",
7499 "etc/permissions/foo.xml",
7500 })
7501
7502 // The bar library should depend on the implementation jar.
7503 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007504 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007505 t.Errorf("expected %q, found %#q", expected, actual)
7506 }
7507}
7508
7509func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007510 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007511 apex {
7512 name: "myapex",
7513 key: "myapex.key",
7514 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007515 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007516 }
7517
7518 apex_key {
7519 name: "myapex.key",
7520 public_key: "testkey.avbpubkey",
7521 private_key: "testkey.pem",
7522 }
7523
7524 java_sdk_library {
7525 name: "foo",
7526 srcs: ["a.java"],
7527 api_packages: ["foo"],
7528 apex_available: ["myapex"],
7529 sdk_version: "none",
7530 system_modules: "none",
7531 }
7532
7533 java_library {
7534 name: "bar",
7535 srcs: ["a.java"],
7536 libs: ["foo"],
7537 sdk_version: "none",
7538 system_modules: "none",
7539 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007540
7541 prebuilt_apis {
7542 name: "sdk",
7543 api_dirs: ["100"],
7544 }
Paul Duffin9b879592020-05-26 13:21:35 +01007545 `, withFiles(filesForSdkLibrary))
7546
7547 // java_sdk_library installs both impl jar and permission XML
7548 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7549 "javalib/foo.jar",
7550 "etc/permissions/foo.xml",
7551 })
7552
7553 // The bar library should depend on the stubs jar.
7554 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007555 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007556 t.Errorf("expected %q, found %#q", expected, actual)
7557 }
7558}
7559
Paul Duffineedc5d52020-06-12 17:46:39 +01007560func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007561 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007562 prebuilt_apis {
7563 name: "sdk",
7564 api_dirs: ["100"],
7565 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007566 withFiles(map[string][]byte{
7567 "apex/a.java": nil,
7568 "apex/apex_manifest.json": nil,
7569 "apex/Android.bp": []byte(`
7570 package {
7571 default_visibility: ["//visibility:private"],
7572 }
7573
7574 apex {
7575 name: "myapex",
7576 key: "myapex.key",
7577 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007578 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007579 }
7580
7581 apex_key {
7582 name: "myapex.key",
7583 public_key: "testkey.avbpubkey",
7584 private_key: "testkey.pem",
7585 }
7586
7587 java_library {
7588 name: "bar",
7589 srcs: ["a.java"],
7590 libs: ["foo"],
7591 apex_available: ["myapex"],
7592 sdk_version: "none",
7593 system_modules: "none",
7594 }
7595`),
7596 "source/a.java": nil,
7597 "source/api/current.txt": nil,
7598 "source/api/removed.txt": nil,
7599 "source/Android.bp": []byte(`
7600 package {
7601 default_visibility: ["//visibility:private"],
7602 }
7603
7604 java_sdk_library {
7605 name: "foo",
7606 visibility: ["//apex"],
7607 srcs: ["a.java"],
7608 api_packages: ["foo"],
7609 apex_available: ["myapex"],
7610 sdk_version: "none",
7611 system_modules: "none",
7612 public: {
7613 enabled: true,
7614 },
7615 }
7616`),
7617 "prebuilt/a.jar": nil,
7618 "prebuilt/Android.bp": []byte(`
7619 package {
7620 default_visibility: ["//visibility:private"],
7621 }
7622
7623 java_sdk_library_import {
7624 name: "foo",
7625 visibility: ["//apex", "//source"],
7626 apex_available: ["myapex"],
7627 prefer: true,
7628 public: {
7629 jars: ["a.jar"],
7630 },
7631 }
7632`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007633 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007634 )
7635
7636 // java_sdk_library installs both impl jar and permission XML
7637 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7638 "javalib/bar.jar",
7639 "javalib/foo.jar",
7640 "etc/permissions/foo.xml",
7641 })
7642
7643 // The bar library should depend on the implementation jar.
7644 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007645 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007646 t.Errorf("expected %q, found %#q", expected, actual)
7647 }
7648}
7649
7650func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7651 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7652 apex {
7653 name: "myapex",
7654 key: "myapex.key",
7655 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007656 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007657 }
7658
7659 apex_key {
7660 name: "myapex.key",
7661 public_key: "testkey.avbpubkey",
7662 private_key: "testkey.pem",
7663 }
7664
7665 java_sdk_library_import {
7666 name: "foo",
7667 apex_available: ["myapex"],
7668 prefer: true,
7669 public: {
7670 jars: ["a.jar"],
7671 },
7672 }
7673
7674 `, withFiles(filesForSdkLibrary))
7675}
7676
atrost6e126252020-01-27 17:01:16 +00007677func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007678 result := android.GroupFixturePreparers(
7679 prepareForApexTest,
7680 java.PrepareForTestWithPlatformCompatConfig,
7681 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007682 apex {
7683 name: "myapex",
7684 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007685 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007686 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007687 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007688 }
7689
7690 apex_key {
7691 name: "myapex.key",
7692 public_key: "testkey.avbpubkey",
7693 private_key: "testkey.pem",
7694 }
7695
7696 platform_compat_config {
7697 name: "myjar-platform-compat-config",
7698 src: ":myjar",
7699 }
7700
7701 java_library {
7702 name: "myjar",
7703 srcs: ["foo/bar/MyClass.java"],
7704 sdk_version: "none",
7705 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007706 apex_available: [ "myapex" ],
7707 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007708
7709 // Make sure that a preferred prebuilt does not affect the apex contents.
7710 prebuilt_platform_compat_config {
7711 name: "myjar-platform-compat-config",
7712 metadata: "compat-config/metadata.xml",
7713 prefer: true,
7714 }
atrost6e126252020-01-27 17:01:16 +00007715 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007716 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007717 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7718 "etc/compatconfig/myjar-platform-compat-config.xml",
7719 "javalib/myjar.jar",
7720 })
7721}
7722
Jooyung Han862c0d62022-12-21 10:15:37 +09007723func TestNoDupeApexFiles(t *testing.T) {
7724 android.GroupFixturePreparers(
7725 android.PrepareForTestWithAndroidBuildComponents,
7726 PrepareForTestWithApexBuildComponents,
7727 prepareForTestWithMyapex,
7728 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7729 ).
7730 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7731 RunTestWithBp(t, `
7732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 prebuilts: ["foo", "bar"],
7736 updatable: false,
7737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 prebuilt_etc {
7746 name: "foo",
7747 src: "myprebuilt",
7748 filename_from_src: true,
7749 }
7750
7751 prebuilt_etc {
7752 name: "bar",
7753 src: "myprebuilt",
7754 filename_from_src: true,
7755 }
7756 `)
7757}
7758
Jiyong Park479321d2019-12-16 11:47:12 +09007759func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7760 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7761 apex {
7762 name: "myapex",
7763 key: "myapex.key",
7764 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007765 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007766 }
7767
7768 apex_key {
7769 name: "myapex.key",
7770 public_key: "testkey.avbpubkey",
7771 private_key: "testkey.pem",
7772 }
7773
7774 java_library {
7775 name: "myjar",
7776 srcs: ["foo/bar/MyClass.java"],
7777 sdk_version: "none",
7778 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007779 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007780 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007781 }
7782 `)
7783}
7784
Jiyong Park7afd1072019-12-30 16:56:33 +09007785func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007786 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007791 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 cc_library {
7801 name: "mylib",
7802 srcs: ["mylib.cpp"],
7803 system_shared_libs: [],
7804 stl: "none",
7805 required: ["a", "b"],
7806 host_required: ["c", "d"],
7807 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007808 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007809 }
7810 `)
7811
7812 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007813 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007814 name := apexBundle.BaseModuleName()
7815 prefix := "TARGET_"
7816 var builder strings.Builder
7817 data.Custom(&builder, name, prefix, "", data)
7818 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007819 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007820 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7821 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007822}
7823
Jiyong Park7cd10e32020-01-14 09:22:18 +09007824func TestSymlinksFromApexToSystem(t *testing.T) {
7825 bp := `
7826 apex {
7827 name: "myapex",
7828 key: "myapex.key",
7829 native_shared_libs: ["mylib"],
7830 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007831 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007832 }
7833
Jiyong Park9d677202020-02-19 16:29:35 +09007834 apex {
7835 name: "myapex.updatable",
7836 key: "myapex.key",
7837 native_shared_libs: ["mylib"],
7838 java_libs: ["myjar"],
7839 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007840 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007841 }
7842
Jiyong Park7cd10e32020-01-14 09:22:18 +09007843 apex_key {
7844 name: "myapex.key",
7845 public_key: "testkey.avbpubkey",
7846 private_key: "testkey.pem",
7847 }
7848
7849 cc_library {
7850 name: "mylib",
7851 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007852 shared_libs: [
7853 "myotherlib",
7854 "myotherlib_ext",
7855 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007856 system_shared_libs: [],
7857 stl: "none",
7858 apex_available: [
7859 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007860 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007861 "//apex_available:platform",
7862 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007863 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007864 }
7865
7866 cc_library {
7867 name: "myotherlib",
7868 srcs: ["mylib.cpp"],
7869 system_shared_libs: [],
7870 stl: "none",
7871 apex_available: [
7872 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007873 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007874 "//apex_available:platform",
7875 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007876 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007877 }
7878
Jiyong Parkce243632023-02-17 18:22:25 +09007879 cc_library {
7880 name: "myotherlib_ext",
7881 srcs: ["mylib.cpp"],
7882 system_shared_libs: [],
7883 system_ext_specific: true,
7884 stl: "none",
7885 apex_available: [
7886 "myapex",
7887 "myapex.updatable",
7888 "//apex_available:platform",
7889 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007890 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007891 }
7892
Jiyong Park7cd10e32020-01-14 09:22:18 +09007893 java_library {
7894 name: "myjar",
7895 srcs: ["foo/bar/MyClass.java"],
7896 sdk_version: "none",
7897 system_modules: "none",
7898 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007899 apex_available: [
7900 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007901 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007902 "//apex_available:platform",
7903 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007904 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007905 }
7906
7907 java_library {
7908 name: "myotherjar",
7909 srcs: ["foo/bar/MyClass.java"],
7910 sdk_version: "none",
7911 system_modules: "none",
7912 apex_available: [
7913 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007914 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007915 "//apex_available:platform",
7916 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007917 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918 }
7919 `
7920
7921 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7922 for _, f := range files {
7923 if f.path == file {
7924 if f.isLink {
7925 t.Errorf("%q is not a real file", file)
7926 }
7927 return
7928 }
7929 }
7930 t.Errorf("%q is not found", file)
7931 }
7932
Jiyong Parkce243632023-02-17 18:22:25 +09007933 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007934 for _, f := range files {
7935 if f.path == file {
7936 if !f.isLink {
7937 t.Errorf("%q is not a symlink", file)
7938 }
Jiyong Parkce243632023-02-17 18:22:25 +09007939 if f.src != target {
7940 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7941 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007942 return
7943 }
7944 }
7945 t.Errorf("%q is not found", file)
7946 }
7947
Jiyong Park9d677202020-02-19 16:29:35 +09007948 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7949 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007950 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007951 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007952 ensureRealfileExists(t, files, "javalib/myjar.jar")
7953 ensureRealfileExists(t, files, "lib64/mylib.so")
7954 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007955 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007956
Jiyong Park9d677202020-02-19 16:29:35 +09007957 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7958 ensureRealfileExists(t, files, "javalib/myjar.jar")
7959 ensureRealfileExists(t, files, "lib64/mylib.so")
7960 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007961 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007962
7963 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007964 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007965 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007966 ensureRealfileExists(t, files, "javalib/myjar.jar")
7967 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007968 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7969 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007970
7971 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7972 ensureRealfileExists(t, files, "javalib/myjar.jar")
7973 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007974 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7975 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007976}
7977
Yo Chiange8128052020-07-23 20:09:18 +08007978func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007979 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007980 apex {
7981 name: "myapex",
7982 key: "myapex.key",
7983 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007984 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007985 }
7986
7987 apex_key {
7988 name: "myapex.key",
7989 public_key: "testkey.avbpubkey",
7990 private_key: "testkey.pem",
7991 }
7992
7993 cc_library_shared {
7994 name: "mylib",
7995 srcs: ["mylib.cpp"],
7996 shared_libs: ["myotherlib"],
7997 system_shared_libs: [],
7998 stl: "none",
7999 apex_available: [
8000 "myapex",
8001 "//apex_available:platform",
8002 ],
8003 }
8004
8005 cc_prebuilt_library_shared {
8006 name: "myotherlib",
8007 srcs: ["prebuilt.so"],
8008 system_shared_libs: [],
8009 stl: "none",
8010 apex_available: [
8011 "myapex",
8012 "//apex_available:platform",
8013 ],
8014 }
8015 `)
8016
Prerana Patilb1896c82022-11-09 18:14:34 +00008017 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008018 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008019 var builder strings.Builder
8020 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8021 androidMk := builder.String()
8022 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008023 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008024 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8025 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8026 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008027 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008028}
8029
Jooyung Han643adc42020-02-27 13:50:06 +09008030func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008031 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008032 apex {
8033 name: "myapex",
8034 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09008035 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008036 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008037 }
8038
8039 apex_key {
8040 name: "myapex.key",
8041 public_key: "testkey.avbpubkey",
8042 private_key: "testkey.pem",
8043 }
8044
8045 cc_library {
8046 name: "mylib",
8047 srcs: ["mylib.cpp"],
8048 shared_libs: ["mylib2"],
8049 system_shared_libs: [],
8050 stl: "none",
8051 apex_available: [ "myapex" ],
8052 }
8053
8054 cc_library {
8055 name: "mylib2",
8056 srcs: ["mylib.cpp"],
8057 system_shared_libs: [],
8058 stl: "none",
8059 apex_available: [ "myapex" ],
8060 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008061
8062 rust_ffi_shared {
8063 name: "libfoo.rust",
8064 crate_name: "foo",
8065 srcs: ["foo.rs"],
8066 shared_libs: ["libfoo.shared_from_rust"],
8067 prefer_rlib: true,
8068 apex_available: ["myapex"],
8069 }
8070
8071 cc_library_shared {
8072 name: "libfoo.shared_from_rust",
8073 srcs: ["mylib.cpp"],
8074 system_shared_libs: [],
8075 stl: "none",
8076 stubs: {
8077 versions: ["10", "11", "12"],
8078 },
8079 }
8080
Jooyung Han643adc42020-02-27 13:50:06 +09008081 `)
8082
8083 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8084 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008085 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008086 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8087 "lib64/mylib.so",
8088 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008089 "lib64/libfoo.rust.so",
8090 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8091 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008092 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008093
8094 // b/220397949
8095 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008096}
8097
Jooyung Han49f67012020-04-17 13:43:10 +09008098func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008099 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008100 apex {
8101 name: "myapex",
8102 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008103 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008104 }
8105 apex_key {
8106 name: "myapex.key",
8107 public_key: "testkey.avbpubkey",
8108 private_key: "testkey.pem",
8109 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008110 `,
8111 android.FixtureModifyConfig(func(config android.Config) {
8112 delete(config.Targets, android.Android)
8113 config.AndroidCommonTarget = android.Target{}
8114 }),
8115 )
Jooyung Han49f67012020-04-17 13:43:10 +09008116
8117 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8118 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8119 }
8120}
8121
Jiyong Parkbd159612020-02-28 15:22:21 +09008122func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008123 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008124 apex {
8125 name: "myapex",
8126 key: "myapex.key",
8127 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008128 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008129 }
8130
8131 apex_key {
8132 name: "myapex.key",
8133 public_key: "testkey.avbpubkey",
8134 private_key: "testkey.pem",
8135 }
8136
8137 android_app {
8138 name: "AppFoo",
8139 srcs: ["foo/bar/MyClass.java"],
8140 sdk_version: "none",
8141 system_modules: "none",
8142 apex_available: [ "myapex" ],
8143 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008144 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008145
Colin Crosscf371cc2020-11-13 11:48:42 -08008146 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008147 content := bundleConfigRule.Args["content"]
8148
8149 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008150 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 +09008151}
8152
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008153func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008154 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008155 apex {
8156 name: "myapex",
8157 key: "myapex.key",
8158 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008159 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008160 }
8161
8162 apex_key {
8163 name: "myapex.key",
8164 public_key: "testkey.avbpubkey",
8165 private_key: "testkey.pem",
8166 }
8167
8168 android_app_set {
8169 name: "AppSet",
8170 set: "AppSet.apks",
8171 }`)
8172 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008173 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008174 content := bundleConfigRule.Args["content"]
8175 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8176 s := mod.Rule("apexRule").Args["copy_commands"]
8177 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008178 if len(copyCmds) != 4 {
8179 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008180 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008181 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8182 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008183 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8184 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008185
8186 // Ensure that canned_fs_config has an entry for the app set zip file
8187 generateFsRule := mod.Rule("generateFsConfig")
8188 cmd := generateFsRule.RuleParams.Command
8189 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008190}
8191
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008192func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008193 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008194 apex_set {
8195 name: "myapex",
8196 filename: "foo_v2.apex",
8197 sanitized: {
8198 none: { set: "myapex.apks", },
8199 hwaddress: { set: "myapex.hwasan.apks", },
8200 },
Paul Duffin24704672021-04-06 16:09:30 +01008201 }
8202 `
8203 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008204
Paul Duffin24704672021-04-06 16:09:30 +01008205 // Check that the extractor produces the correct output file from the correct input file.
8206 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008207
Paul Duffin24704672021-04-06 16:09:30 +01008208 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8209 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008210
Paul Duffin24704672021-04-06 16:09:30 +01008211 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8212
8213 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008214 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8215 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008216
8217 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008218}
8219
Pranav Guptaeba03b02022-09-27 00:27:08 +00008220func TestApexSetApksModuleAssignment(t *testing.T) {
8221 ctx := testApex(t, `
8222 apex_set {
8223 name: "myapex",
8224 set: ":myapex_apks_file",
8225 }
8226
8227 filegroup {
8228 name: "myapex_apks_file",
8229 srcs: ["myapex.apks"],
8230 }
8231 `)
8232
8233 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8234
8235 // Check that the extractor produces the correct apks file from the input module
8236 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8237 extractedApex := m.Output(extractorOutput)
8238
8239 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8240}
8241
Paul Duffin89f570a2021-06-16 01:42:33 +01008242func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008243 t.Helper()
8244
Paul Duffin55607122021-03-30 23:32:51 +01008245 fs := android.MockFS{
8246 "a.java": nil,
8247 "a.jar": nil,
8248 "apex_manifest.json": nil,
8249 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008250 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008251 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8252 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8253 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008254 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008255 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008256
Paul Duffin55607122021-03-30 23:32:51 +01008257 errorHandler := android.FixtureExpectsNoErrors
8258 if errmsg != "" {
8259 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008260 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008261
Paul Duffin55607122021-03-30 23:32:51 +01008262 result := android.GroupFixturePreparers(
8263 cc.PrepareForTestWithCcDefaultModules,
8264 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008265 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008266 java.PrepareForTestWithJavaSdkLibraryFiles,
8267 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008268 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008269 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008270 android.FixtureModifyMockFS(func(fs android.MockFS) {
8271 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8272 insert := ""
8273 for _, fragment := range fragments {
8274 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8275 }
8276 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8277 platform_bootclasspath {
8278 name: "platform-bootclasspath",
8279 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008280 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008281 %s
8282 ],
8283 }
8284 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008285 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008286 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008287 // Dexpreopt for boot jars requires the ART boot image profile.
8288 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8289 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008290 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008291 ).
8292 ExtendWithErrorHandler(errorHandler).
8293 RunTestWithBp(t, bp)
8294
8295 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008296}
8297
Paul Duffin5556c5f2022-06-09 17:32:21 +00008298func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008299 preparers := android.GroupFixturePreparers(
8300 java.PrepareForTestWithJavaDefaultModules,
8301 PrepareForTestWithApexBuildComponents,
8302 ).
8303 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8304 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8305
8306 bpBase := `
8307 apex_set {
8308 name: "com.android.myapex",
8309 installable: true,
8310 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8311 set: "myapex.apks",
8312 }
8313
8314 apex_set {
8315 name: "com.mycompany.android.myapex",
8316 apex_name: "com.android.myapex",
8317 installable: true,
8318 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8319 set: "company-myapex.apks",
8320 }
8321
8322 prebuilt_bootclasspath_fragment {
8323 name: "my-bootclasspath-fragment",
8324 apex_available: ["com.android.myapex"],
8325 %s
8326 }
8327 `
8328
8329 t.Run("java_import", func(t *testing.T) {
8330 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8331 java_import {
8332 name: "libfoo",
8333 jars: ["libfoo.jar"],
8334 apex_available: ["com.android.myapex"],
8335 }
8336 `)
8337 })
8338
8339 t.Run("java_sdk_library_import", func(t *testing.T) {
8340 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8341 java_sdk_library_import {
8342 name: "libfoo",
8343 public: {
8344 jars: ["libbar.jar"],
8345 },
8346 apex_available: ["com.android.myapex"],
8347 }
8348 `)
8349 })
8350
8351 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8352 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8353 image_name: "art",
8354 contents: ["libfoo"],
8355 `)+`
8356 java_sdk_library_import {
8357 name: "libfoo",
8358 public: {
8359 jars: ["libbar.jar"],
8360 },
8361 apex_available: ["com.android.myapex"],
8362 }
8363 `)
8364 })
8365}
8366
Paul Duffin5556c5f2022-06-09 17:32:21 +00008367func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8368 preparers := android.GroupFixturePreparers(
8369 java.PrepareForTestWithJavaDefaultModules,
8370 PrepareForTestWithApexBuildComponents,
8371 )
8372
8373 bpBase := `
8374 apex_set {
8375 name: "com.android.myapex",
8376 installable: true,
8377 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8378 set: "myapex.apks",
8379 }
8380
8381 apex_set {
8382 name: "com.android.myapex_compressed",
8383 apex_name: "com.android.myapex",
8384 installable: true,
8385 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8386 set: "myapex_compressed.apks",
8387 }
8388
8389 prebuilt_bootclasspath_fragment {
8390 name: "my-bootclasspath-fragment",
8391 apex_available: [
8392 "com.android.myapex",
8393 "com.android.myapex_compressed",
8394 ],
8395 hidden_api: {
8396 annotation_flags: "annotation-flags.csv",
8397 metadata: "metadata.csv",
8398 index: "index.csv",
8399 signature_patterns: "signature_patterns.csv",
8400 },
8401 %s
8402 }
8403 `
8404
8405 t.Run("java_import", func(t *testing.T) {
8406 result := preparers.RunTestWithBp(t,
8407 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8408 java_import {
8409 name: "libfoo",
8410 jars: ["libfoo.jar"],
8411 apex_available: [
8412 "com.android.myapex",
8413 "com.android.myapex_compressed",
8414 ],
8415 }
8416 `)
8417
8418 module := result.Module("libfoo", "android_common_com.android.myapex")
8419 usesLibraryDep := module.(java.UsesLibraryDependency)
8420 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8421 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8422 usesLibraryDep.DexJarBuildPath().Path())
8423 })
8424
8425 t.Run("java_sdk_library_import", func(t *testing.T) {
8426 result := preparers.RunTestWithBp(t,
8427 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8428 java_sdk_library_import {
8429 name: "libfoo",
8430 public: {
8431 jars: ["libbar.jar"],
8432 },
8433 apex_available: [
8434 "com.android.myapex",
8435 "com.android.myapex_compressed",
8436 ],
8437 compile_dex: true,
8438 }
8439 `)
8440
8441 module := result.Module("libfoo", "android_common_com.android.myapex")
8442 usesLibraryDep := module.(java.UsesLibraryDependency)
8443 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8444 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8445 usesLibraryDep.DexJarBuildPath().Path())
8446 })
8447
8448 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8449 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8450 image_name: "art",
8451 contents: ["libfoo"],
8452 `)+`
8453 java_sdk_library_import {
8454 name: "libfoo",
8455 public: {
8456 jars: ["libbar.jar"],
8457 },
8458 apex_available: [
8459 "com.android.myapex",
8460 "com.android.myapex_compressed",
8461 ],
8462 compile_dex: true,
8463 }
8464 `)
8465 })
8466}
8467
Jooyung Han548640b2020-04-27 12:10:30 +09008468func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8469 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8470 apex {
8471 name: "myapex",
8472 key: "myapex.key",
8473 updatable: true,
8474 }
8475
8476 apex_key {
8477 name: "myapex.key",
8478 public_key: "testkey.avbpubkey",
8479 private_key: "testkey.pem",
8480 }
8481 `)
8482}
8483
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008484func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8485 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8486 apex {
8487 name: "myapex",
8488 key: "myapex.key",
8489 }
8490
8491 apex_key {
8492 name: "myapex.key",
8493 public_key: "testkey.avbpubkey",
8494 private_key: "testkey.pem",
8495 }
8496 `)
8497}
8498
Jooyung Handfc864c2023-03-20 18:19:07 +09008499func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8500 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008501 apex {
8502 name: "myapex",
8503 key: "myapex.key",
8504 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008505 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008506 soc_specific: true,
8507 }
8508
8509 apex_key {
8510 name: "myapex.key",
8511 public_key: "testkey.avbpubkey",
8512 private_key: "testkey.pem",
8513 }
8514 `)
8515}
8516
Jooyung Han02873da2023-03-22 17:41:03 +09008517func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8518 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8519 apex {
8520 name: "myapex",
8521 key: "myapex.key",
8522 updatable: false,
8523 min_sdk_version: "29",
8524 use_vndk_as_stable: true,
8525 vendor: true,
8526 }
8527
8528 apex_key {
8529 name: "myapex.key",
8530 public_key: "testkey.avbpubkey",
8531 private_key: "testkey.pem",
8532 }
8533 `)
8534}
8535
Jooyung Handfc864c2023-03-20 18:19:07 +09008536func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8537 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8538 apex {
8539 name: "myapex",
8540 key: "myapex.key",
8541 updatable: false,
8542 use_vndk_as_stable: true,
8543 }
8544
8545 apex_key {
8546 name: "myapex.key",
8547 public_key: "testkey.avbpubkey",
8548 private_key: "testkey.pem",
8549 }
8550 `)
8551}
8552
satayevb98371c2021-06-15 16:49:50 +01008553func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8554 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8555 apex {
8556 name: "myapex",
8557 key: "myapex.key",
8558 systemserverclasspath_fragments: [
8559 "mysystemserverclasspathfragment",
8560 ],
8561 min_sdk_version: "29",
8562 updatable: true,
8563 }
8564
8565 apex_key {
8566 name: "myapex.key",
8567 public_key: "testkey.avbpubkey",
8568 private_key: "testkey.pem",
8569 }
8570
8571 java_library {
8572 name: "foo",
8573 srcs: ["b.java"],
8574 min_sdk_version: "29",
8575 installable: true,
8576 apex_available: [
8577 "myapex",
8578 ],
8579 }
8580
8581 systemserverclasspath_fragment {
8582 name: "mysystemserverclasspathfragment",
8583 generate_classpaths_proto: false,
8584 contents: [
8585 "foo",
8586 ],
8587 apex_available: [
8588 "myapex",
8589 ],
8590 }
satayevabcd5972021-08-06 17:49:46 +01008591 `,
8592 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8593 )
satayevb98371c2021-06-15 16:49:50 +01008594}
8595
Paul Duffin064b70c2020-11-02 17:32:38 +00008596func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008597 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008598 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008599 fragment := java.ApexVariantReference{
8600 Apex: proptools.StringPtr("myapex"),
8601 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8602 }
8603
Paul Duffin064b70c2020-11-02 17:32:38 +00008604 testDexpreoptWithApexes(t, `
8605 prebuilt_apex {
8606 name: "myapex" ,
8607 arch: {
8608 arm64: {
8609 src: "myapex-arm64.apex",
8610 },
8611 arm: {
8612 src: "myapex-arm.apex",
8613 },
8614 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008615 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8616 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008617
Paul Duffin89f570a2021-06-16 01:42:33 +01008618 prebuilt_bootclasspath_fragment {
8619 name: "my-bootclasspath-fragment",
8620 contents: ["libfoo"],
8621 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008622 hidden_api: {
8623 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8624 metadata: "my-bootclasspath-fragment/metadata.csv",
8625 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008626 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8627 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8628 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008629 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008630 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008631
Paul Duffin89f570a2021-06-16 01:42:33 +01008632 java_import {
8633 name: "libfoo",
8634 jars: ["libfoo.jar"],
8635 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008636 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008637 }
8638 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008639 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008640}
8641
Spandan Dasf14e2542021-11-12 00:01:37 +00008642func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008643 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008644 bp += `
8645 apex_key {
8646 name: "myapex.key",
8647 public_key: "testkey.avbpubkey",
8648 private_key: "testkey.pem",
8649 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008650 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008651 "lib1/src/A.java": nil,
8652 "lib2/src/B.java": nil,
8653 "system/sepolicy/apex/myapex-file_contexts": nil,
8654 }
8655
Paul Duffin45338f02021-03-30 23:07:52 +01008656 errorHandler := android.FixtureExpectsNoErrors
8657 if errmsg != "" {
8658 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008659 }
Colin Crossae8600b2020-10-29 17:09:13 -07008660
Paul Duffin45338f02021-03-30 23:07:52 +01008661 android.GroupFixturePreparers(
8662 android.PrepareForTestWithAndroidBuildComponents,
8663 java.PrepareForTestWithJavaBuildComponents,
8664 PrepareForTestWithApexBuildComponents,
8665 android.PrepareForTestWithNeverallowRules(rules),
8666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008667 apexBootJars := make([]string, 0, len(bootJars))
8668 for _, apexBootJar := range bootJars {
8669 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008670 }
satayevd604b212021-07-21 14:23:52 +01008671 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008672 }),
8673 fs.AddToFixture(),
8674 ).
8675 ExtendWithErrorHandler(errorHandler).
8676 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008677}
8678
8679func TestApexPermittedPackagesRules(t *testing.T) {
8680 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008681 name string
8682 expectedError string
8683 bp string
8684 bootJars []string
8685 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008686 }{
8687
8688 {
8689 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8690 expectedError: "",
8691 bp: `
8692 java_library {
8693 name: "bcp_lib1",
8694 srcs: ["lib1/src/*.java"],
8695 permitted_packages: ["foo.bar"],
8696 apex_available: ["myapex"],
8697 sdk_version: "none",
8698 system_modules: "none",
8699 }
8700 java_library {
8701 name: "nonbcp_lib2",
8702 srcs: ["lib2/src/*.java"],
8703 apex_available: ["myapex"],
8704 permitted_packages: ["a.b"],
8705 sdk_version: "none",
8706 system_modules: "none",
8707 }
8708 apex {
8709 name: "myapex",
8710 key: "myapex.key",
8711 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008712 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008713 }`,
8714 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008715 bcpPermittedPackages: map[string][]string{
8716 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008717 "foo.bar",
8718 },
8719 },
8720 },
8721 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008722 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008723 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 +01008724 bp: `
8725 java_library {
8726 name: "bcp_lib1",
8727 srcs: ["lib1/src/*.java"],
8728 apex_available: ["myapex"],
8729 permitted_packages: ["foo.bar"],
8730 sdk_version: "none",
8731 system_modules: "none",
8732 }
8733 java_library {
8734 name: "bcp_lib2",
8735 srcs: ["lib2/src/*.java"],
8736 apex_available: ["myapex"],
8737 permitted_packages: ["foo.bar", "bar.baz"],
8738 sdk_version: "none",
8739 system_modules: "none",
8740 }
8741 apex {
8742 name: "myapex",
8743 key: "myapex.key",
8744 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008745 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008746 }
8747 `,
8748 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008749 bcpPermittedPackages: map[string][]string{
8750 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008751 "foo.bar",
8752 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008753 "bcp_lib2": []string{
8754 "foo.bar",
8755 },
8756 },
8757 },
8758 {
8759 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8760 expectedError: "",
8761 bp: `
8762 java_library {
8763 name: "bcp_lib_restricted",
8764 srcs: ["lib1/src/*.java"],
8765 apex_available: ["myapex"],
8766 permitted_packages: ["foo.bar"],
8767 sdk_version: "none",
8768 min_sdk_version: "29",
8769 system_modules: "none",
8770 }
8771 java_library {
8772 name: "bcp_lib_unrestricted",
8773 srcs: ["lib2/src/*.java"],
8774 apex_available: ["myapex"],
8775 permitted_packages: ["foo.bar", "bar.baz"],
8776 sdk_version: "none",
8777 min_sdk_version: "29",
8778 system_modules: "none",
8779 }
8780 apex {
8781 name: "myapex",
8782 key: "myapex.key",
8783 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8784 updatable: true,
8785 min_sdk_version: "29",
8786 }
8787 `,
8788 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8789 bcpPermittedPackages: map[string][]string{
8790 "bcp_lib1_non_updateable": []string{
8791 "foo.bar",
8792 },
8793 // 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 +01008794 },
8795 },
8796 }
8797 for _, tc := range testcases {
8798 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008799 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8800 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008801 })
8802 }
8803}
8804
Jiyong Park62304bb2020-04-13 16:19:48 +09008805func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008806 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008807 apex {
8808 name: "myapex",
8809 key: "myapex.key",
8810 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008811 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008812 }
8813
8814 apex_key {
8815 name: "myapex.key",
8816 public_key: "testkey.avbpubkey",
8817 private_key: "testkey.pem",
8818 }
8819
8820 cc_library {
8821 name: "mylib",
8822 srcs: ["mylib.cpp"],
8823 system_shared_libs: [],
8824 stl: "none",
8825 stubs: {
8826 versions: ["1"],
8827 },
8828 apex_available: ["myapex"],
8829 }
8830
8831 cc_library {
8832 name: "myprivlib",
8833 srcs: ["mylib.cpp"],
8834 system_shared_libs: [],
8835 stl: "none",
8836 apex_available: ["myapex"],
8837 }
8838
8839
8840 cc_test {
8841 name: "mytest",
8842 gtest: false,
8843 srcs: ["mylib.cpp"],
8844 system_shared_libs: [],
8845 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008846 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008847 test_for: ["myapex"]
8848 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008849
8850 cc_library {
8851 name: "mytestlib",
8852 srcs: ["mylib.cpp"],
8853 system_shared_libs: [],
8854 shared_libs: ["mylib", "myprivlib"],
8855 stl: "none",
8856 test_for: ["myapex"],
8857 }
8858
8859 cc_benchmark {
8860 name: "mybench",
8861 srcs: ["mylib.cpp"],
8862 system_shared_libs: [],
8863 shared_libs: ["mylib", "myprivlib"],
8864 stl: "none",
8865 test_for: ["myapex"],
8866 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008867 `)
8868
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008869 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008870 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008871 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8872 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8873 }
8874
8875 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008876 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008877 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8878 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8879 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8880}
Jiyong Park46a512f2020-12-04 18:02:13 +09008881
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008882func TestIndirectTestFor(t *testing.T) {
8883 ctx := testApex(t, `
8884 apex {
8885 name: "myapex",
8886 key: "myapex.key",
8887 native_shared_libs: ["mylib", "myprivlib"],
8888 updatable: false,
8889 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008890
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008891 apex_key {
8892 name: "myapex.key",
8893 public_key: "testkey.avbpubkey",
8894 private_key: "testkey.pem",
8895 }
8896
8897 cc_library {
8898 name: "mylib",
8899 srcs: ["mylib.cpp"],
8900 system_shared_libs: [],
8901 stl: "none",
8902 stubs: {
8903 versions: ["1"],
8904 },
8905 apex_available: ["myapex"],
8906 }
8907
8908 cc_library {
8909 name: "myprivlib",
8910 srcs: ["mylib.cpp"],
8911 system_shared_libs: [],
8912 stl: "none",
8913 shared_libs: ["mylib"],
8914 apex_available: ["myapex"],
8915 }
8916
8917 cc_library {
8918 name: "mytestlib",
8919 srcs: ["mylib.cpp"],
8920 system_shared_libs: [],
8921 shared_libs: ["myprivlib"],
8922 stl: "none",
8923 test_for: ["myapex"],
8924 }
8925 `)
8926
8927 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008928 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008929 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8930 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8931 }
8932
8933 // The platform variant of mytestlib links to the platform variant of the
8934 // internal myprivlib.
8935 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8936
8937 // The platform variant of myprivlib links to the platform variant of mylib
8938 // and bypasses its stubs.
8939 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 +09008940}
8941
Martin Stjernholmec009002021-03-27 15:18:31 +00008942func TestTestForForLibInOtherApex(t *testing.T) {
8943 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8944 _ = testApex(t, `
8945 apex {
8946 name: "com.android.art",
8947 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008948 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008949 updatable: false,
8950 }
8951
8952 apex {
8953 name: "com.android.art.debug",
8954 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008955 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008956 updatable: false,
8957 }
8958
8959 apex_key {
8960 name: "myapex.key",
8961 public_key: "testkey.avbpubkey",
8962 private_key: "testkey.pem",
8963 }
8964
8965 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008966 name: "libnativebridge",
8967 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008968 system_shared_libs: [],
8969 stl: "none",
8970 stubs: {
8971 versions: ["1"],
8972 },
8973 apex_available: ["com.android.art", "com.android.art.debug"],
8974 }
8975
8976 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008977 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008978 srcs: ["mylib.cpp"],
8979 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008980 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008981 stl: "none",
8982 apex_available: ["com.android.art.debug"],
8983 test_for: ["com.android.art"],
8984 }
8985 `,
8986 android.MockFS{
8987 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8988 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8989 }.AddToFixture())
8990}
8991
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008992// TODO(jungjw): Move this to proptools
8993func intPtr(i int) *int {
8994 return &i
8995}
8996
8997func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008998 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008999 apex_set {
9000 name: "myapex",
9001 set: "myapex.apks",
9002 filename: "foo_v2.apex",
9003 overrides: ["foo"],
9004 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009005 `,
9006 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9007 variables.Platform_sdk_version = intPtr(30)
9008 }),
9009 android.FixtureModifyConfig(func(config android.Config) {
9010 config.Targets[android.Android] = []android.Target{
9011 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9012 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9013 }
9014 }),
9015 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009016
Paul Duffin24704672021-04-06 16:09:30 +01009017 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009018
9019 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009020 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009021 actual := extractedApex.Args["abis"]
9022 expected := "ARMEABI_V7A,ARM64_V8A"
9023 if actual != expected {
9024 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9025 }
9026 actual = extractedApex.Args["sdk-version"]
9027 expected = "30"
9028 if actual != expected {
9029 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9030 }
9031
Paul Duffin6717d882021-06-15 19:09:41 +01009032 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033 a := m.Module().(*ApexSet)
9034 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009035 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009036 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9037 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9038 }
9039}
9040
Anton Hansson805e0a52022-11-25 14:06:46 +00009041func TestApexSet_NativeBridge(t *testing.T) {
9042 ctx := testApex(t, `
9043 apex_set {
9044 name: "myapex",
9045 set: "myapex.apks",
9046 filename: "foo_v2.apex",
9047 overrides: ["foo"],
9048 }
9049 `,
9050 android.FixtureModifyConfig(func(config android.Config) {
9051 config.Targets[android.Android] = []android.Target{
9052 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9053 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9054 }
9055 }),
9056 )
9057
9058 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9059
9060 // Check extract_apks tool parameters. No native bridge arch expected
9061 extractedApex := m.Output("extracted/myapex.apks")
9062 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9063}
9064
Jiyong Park7d95a512020-05-10 15:16:24 +09009065func TestNoStaticLinkingToStubsLib(t *testing.T) {
9066 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9067 apex {
9068 name: "myapex",
9069 key: "myapex.key",
9070 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009071 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009072 }
9073
9074 apex_key {
9075 name: "myapex.key",
9076 public_key: "testkey.avbpubkey",
9077 private_key: "testkey.pem",
9078 }
9079
9080 cc_library {
9081 name: "mylib",
9082 srcs: ["mylib.cpp"],
9083 static_libs: ["otherlib"],
9084 system_shared_libs: [],
9085 stl: "none",
9086 apex_available: [ "myapex" ],
9087 }
9088
9089 cc_library {
9090 name: "otherlib",
9091 srcs: ["mylib.cpp"],
9092 system_shared_libs: [],
9093 stl: "none",
9094 stubs: {
9095 versions: ["1", "2", "3"],
9096 },
9097 apex_available: [ "myapex" ],
9098 }
9099 `)
9100}
9101
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009102func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009103 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009104 apex {
9105 name: "myapex",
9106 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009107 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009108 custom_sign_tool: "sign_myapex",
9109 }
9110
9111 apex_key {
9112 name: "myapex.key",
9113 public_key: "testkey.avbpubkey",
9114 private_key: "testkey.pem",
9115 }
9116 `)
9117
9118 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9119 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009120 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" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009121}
9122
9123func TestApexKeysTxtOverrides(t *testing.T) {
9124 ctx := testApex(t, `
9125 apex {
9126 name: "myapex",
9127 key: "myapex.key",
9128 updatable: false,
9129 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009130 }
9131
9132 apex_key {
9133 name: "myapex.key",
9134 public_key: "testkey.avbpubkey",
9135 private_key: "testkey.pem",
9136 }
9137
9138 prebuilt_apex {
9139 name: "myapex",
9140 prefer: true,
9141 arch: {
9142 arm64: {
9143 src: "myapex-arm64.apex",
9144 },
9145 arm: {
9146 src: "myapex-arm.apex",
9147 },
9148 },
9149 }
9150
9151 apex_set {
9152 name: "myapex_set",
9153 set: "myapex.apks",
9154 filename: "myapex_set.apex",
9155 overrides: ["myapex"],
9156 }
9157 `)
9158
9159 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9160 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9161 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 +09009162 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 +09009163}
9164
Jooyung Han938b5932020-06-20 12:47:47 +09009165func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009166 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009167 apex {
9168 name: "myapex",
9169 key: "myapex.key",
9170 apps: ["app"],
9171 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009172 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009173 }
9174
9175 apex_key {
9176 name: "myapex.key",
9177 public_key: "testkey.avbpubkey",
9178 private_key: "testkey.pem",
9179 }
9180
9181 android_app {
9182 name: "app",
9183 srcs: ["foo/bar/MyClass.java"],
9184 package_name: "foo",
9185 sdk_version: "none",
9186 system_modules: "none",
9187 apex_available: [ "myapex" ],
9188 }
9189 `, withFiles(map[string][]byte{
9190 "sub/Android.bp": []byte(`
9191 override_apex {
9192 name: "override_myapex",
9193 base: "myapex",
9194 apps: ["override_app"],
9195 allowed_files: ":allowed",
9196 }
9197 // Overridable "path" property should be referenced indirectly
9198 filegroup {
9199 name: "allowed",
9200 srcs: ["allowed.txt"],
9201 }
9202 override_android_app {
9203 name: "override_app",
9204 base: "app",
9205 package_name: "bar",
9206 }
9207 `),
9208 }))
9209
9210 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9211 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9212 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9213 }
9214
9215 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9216 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9217 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9218 }
9219}
9220
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009221func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009222 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009223 apex {
9224 name: "myapex",
9225 key: "myapex.key",
9226 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009227 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009228 }
9229
9230 apex_key {
9231 name: "myapex.key",
9232 public_key: "testkey.avbpubkey",
9233 private_key: "testkey.pem",
9234 }
9235
9236 cc_library {
9237 name: "mylib",
9238 srcs: ["mylib.cpp"],
9239 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009240 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009241 },
9242 apex_available: ["myapex"],
9243 }
9244
9245 cc_prebuilt_library_shared {
9246 name: "mylib",
9247 prefer: false,
9248 srcs: ["prebuilt.so"],
9249 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009250 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009251 },
9252 apex_available: ["myapex"],
9253 }
9254 `)
9255}
9256
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009257func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009258 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009259 apex {
9260 name: "myapex",
9261 key: "myapex.key",
9262 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009263 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009264 }
9265 apex_key {
9266 name: "myapex.key",
9267 public_key: "testkey.avbpubkey",
9268 private_key: "testkey.pem",
9269 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009270 `,
9271 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9272 variables.CompressedApex = proptools.BoolPtr(true)
9273 }),
9274 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009275
9276 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9277 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9278
9279 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9280 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9281
9282 // Make sure output of bundle is .capex
9283 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9284 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9285
9286 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009287 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009288 var builder strings.Builder
9289 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9290 androidMk := builder.String()
9291 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9292}
9293
Martin Stjernholm2856c662020-12-02 15:03:42 +00009294func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009295 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009296 apex {
9297 name: "myapex",
9298 key: "myapex.key",
9299 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009300 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009301 }
9302
9303 apex_key {
9304 name: "myapex.key",
9305 public_key: "testkey.avbpubkey",
9306 private_key: "testkey.pem",
9307 }
9308
9309 cc_library {
9310 name: "mylib",
9311 srcs: ["mylib.cpp"],
9312 apex_available: ["myapex"],
9313 shared_libs: ["otherlib"],
9314 system_shared_libs: [],
9315 }
9316
9317 cc_library {
9318 name: "otherlib",
9319 srcs: ["mylib.cpp"],
9320 stubs: {
9321 versions: ["current"],
9322 },
9323 }
9324
9325 cc_prebuilt_library_shared {
9326 name: "otherlib",
9327 prefer: true,
9328 srcs: ["prebuilt.so"],
9329 stubs: {
9330 versions: ["current"],
9331 },
9332 }
9333 `)
9334
9335 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009336 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009337 var builder strings.Builder
9338 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9339 androidMk := builder.String()
9340
9341 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9342 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009343 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009344}
9345
Jiyong Parke3867542020-12-03 17:28:25 +09009346func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009347 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009348 apex {
9349 name: "myapex",
9350 key: "myapex.key",
9351 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009352 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009353 }
9354
9355 apex_key {
9356 name: "myapex.key",
9357 public_key: "testkey.avbpubkey",
9358 private_key: "testkey.pem",
9359 }
9360
9361 cc_library {
9362 name: "mylib",
9363 srcs: ["mylib.cpp"],
9364 system_shared_libs: [],
9365 stl: "none",
9366 apex_available: ["myapex"],
9367 shared_libs: ["mylib2"],
9368 target: {
9369 apex: {
9370 exclude_shared_libs: ["mylib2"],
9371 },
9372 },
9373 }
9374
9375 cc_library {
9376 name: "mylib2",
9377 srcs: ["mylib.cpp"],
9378 system_shared_libs: [],
9379 stl: "none",
9380 }
9381 `)
9382
9383 // Check if mylib is linked to mylib2 for the non-apex target
9384 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9385 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9386
9387 // Make sure that the link doesn't occur for the apex target
9388 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9389 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9390
9391 // It shouldn't appear in the copy cmd as well.
9392 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9393 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9394}
9395
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009396func TestPrebuiltStubLibDep(t *testing.T) {
9397 bpBase := `
9398 apex {
9399 name: "myapex",
9400 key: "myapex.key",
9401 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009402 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009403 }
9404 apex_key {
9405 name: "myapex.key",
9406 public_key: "testkey.avbpubkey",
9407 private_key: "testkey.pem",
9408 }
9409 cc_library {
9410 name: "mylib",
9411 srcs: ["mylib.cpp"],
9412 apex_available: ["myapex"],
9413 shared_libs: ["stublib"],
9414 system_shared_libs: [],
9415 }
9416 apex {
9417 name: "otherapex",
9418 enabled: %s,
9419 key: "myapex.key",
9420 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009421 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009422 }
9423 `
9424
9425 stublibSourceBp := `
9426 cc_library {
9427 name: "stublib",
9428 srcs: ["mylib.cpp"],
9429 apex_available: ["otherapex"],
9430 system_shared_libs: [],
9431 stl: "none",
9432 stubs: {
9433 versions: ["1"],
9434 },
9435 }
9436 `
9437
9438 stublibPrebuiltBp := `
9439 cc_prebuilt_library_shared {
9440 name: "stublib",
9441 srcs: ["prebuilt.so"],
9442 apex_available: ["otherapex"],
9443 stubs: {
9444 versions: ["1"],
9445 },
9446 %s
9447 }
9448 `
9449
9450 tests := []struct {
9451 name string
9452 stublibBp string
9453 usePrebuilt bool
9454 modNames []string // Modules to collect AndroidMkEntries for
9455 otherApexEnabled []string
9456 }{
9457 {
9458 name: "only_source",
9459 stublibBp: stublibSourceBp,
9460 usePrebuilt: false,
9461 modNames: []string{"stublib"},
9462 otherApexEnabled: []string{"true", "false"},
9463 },
9464 {
9465 name: "source_preferred",
9466 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9467 usePrebuilt: false,
9468 modNames: []string{"stublib", "prebuilt_stublib"},
9469 otherApexEnabled: []string{"true", "false"},
9470 },
9471 {
9472 name: "prebuilt_preferred",
9473 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9474 usePrebuilt: true,
9475 modNames: []string{"stublib", "prebuilt_stublib"},
9476 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9477 },
9478 {
9479 name: "only_prebuilt",
9480 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9481 usePrebuilt: true,
9482 modNames: []string{"stublib"},
9483 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9484 },
9485 }
9486
9487 for _, test := range tests {
9488 t.Run(test.name, func(t *testing.T) {
9489 for _, otherApexEnabled := range test.otherApexEnabled {
9490 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009491 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009492
9493 type modAndMkEntries struct {
9494 mod *cc.Module
9495 mkEntries android.AndroidMkEntries
9496 }
9497 entries := []*modAndMkEntries{}
9498
9499 // Gather shared lib modules that are installable
9500 for _, modName := range test.modNames {
9501 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9502 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9503 continue
9504 }
9505 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009506 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009507 continue
9508 }
Colin Crossaa255532020-07-03 13:18:24 -07009509 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009510 if ent.Disabled {
9511 continue
9512 }
9513 entries = append(entries, &modAndMkEntries{
9514 mod: mod,
9515 mkEntries: ent,
9516 })
9517 }
9518 }
9519 }
9520
9521 var entry *modAndMkEntries = nil
9522 for _, ent := range entries {
9523 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9524 if entry != nil {
9525 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9526 } else {
9527 entry = ent
9528 }
9529 }
9530 }
9531
9532 if entry == nil {
9533 t.Errorf("AndroidMk entry for \"stublib\" missing")
9534 } else {
9535 isPrebuilt := entry.mod.Prebuilt() != nil
9536 if isPrebuilt != test.usePrebuilt {
9537 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9538 }
9539 if !entry.mod.IsStubs() {
9540 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9541 }
9542 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9543 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9544 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009545 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009546 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009547 if !android.InList(expected, cflags) {
9548 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9549 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009550 }
9551 })
9552 }
9553 })
9554 }
9555}
9556
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009557func TestHostApexInHostOnlyBuild(t *testing.T) {
9558 testApex(t, `
9559 apex {
9560 name: "myapex",
9561 host_supported: true,
9562 key: "myapex.key",
9563 updatable: false,
9564 payload_type: "zip",
9565 }
9566 apex_key {
9567 name: "myapex.key",
9568 public_key: "testkey.avbpubkey",
9569 private_key: "testkey.pem",
9570 }
9571 `,
9572 android.FixtureModifyConfig(func(config android.Config) {
9573 // We may not have device targets in all builds, e.g. in
9574 // prebuilts/build-tools/build-prebuilts.sh
9575 config.Targets[android.Android] = []android.Target{}
9576 }))
9577}
9578
Colin Crossc33e5212021-05-25 18:16:02 -07009579func TestApexJavaCoverage(t *testing.T) {
9580 bp := `
9581 apex {
9582 name: "myapex",
9583 key: "myapex.key",
9584 java_libs: ["mylib"],
9585 bootclasspath_fragments: ["mybootclasspathfragment"],
9586 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9587 updatable: false,
9588 }
9589
9590 apex_key {
9591 name: "myapex.key",
9592 public_key: "testkey.avbpubkey",
9593 private_key: "testkey.pem",
9594 }
9595
9596 java_library {
9597 name: "mylib",
9598 srcs: ["mylib.java"],
9599 apex_available: ["myapex"],
9600 compile_dex: true,
9601 }
9602
9603 bootclasspath_fragment {
9604 name: "mybootclasspathfragment",
9605 contents: ["mybootclasspathlib"],
9606 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009607 hidden_api: {
9608 split_packages: ["*"],
9609 },
Colin Crossc33e5212021-05-25 18:16:02 -07009610 }
9611
9612 java_library {
9613 name: "mybootclasspathlib",
9614 srcs: ["mybootclasspathlib.java"],
9615 apex_available: ["myapex"],
9616 compile_dex: true,
9617 }
9618
9619 systemserverclasspath_fragment {
9620 name: "mysystemserverclasspathfragment",
9621 contents: ["mysystemserverclasspathlib"],
9622 apex_available: ["myapex"],
9623 }
9624
9625 java_library {
9626 name: "mysystemserverclasspathlib",
9627 srcs: ["mysystemserverclasspathlib.java"],
9628 apex_available: ["myapex"],
9629 compile_dex: true,
9630 }
9631 `
9632
9633 result := android.GroupFixturePreparers(
9634 PrepareForTestWithApexBuildComponents,
9635 prepareForTestWithMyapex,
9636 java.PrepareForTestWithJavaDefaultModules,
9637 android.PrepareForTestWithAndroidBuildComponents,
9638 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009639 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9640 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009641 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009642 ).RunTest(t)
9643
9644 // Make sure jacoco ran on both mylib and mybootclasspathlib
9645 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9646 t.Errorf("Failed to find jacoco rule for mylib")
9647 }
9648 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9649 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9650 }
9651 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9652 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9653 }
9654}
9655
Jiyong Park192600a2021-08-03 07:52:17 +00009656func TestProhibitStaticExecutable(t *testing.T) {
9657 testApexError(t, `executable mybin is static`, `
9658 apex {
9659 name: "myapex",
9660 key: "myapex.key",
9661 binaries: ["mybin"],
9662 min_sdk_version: "29",
9663 }
9664
9665 apex_key {
9666 name: "myapex.key",
9667 public_key: "testkey.avbpubkey",
9668 private_key: "testkey.pem",
9669 }
9670
9671 cc_binary {
9672 name: "mybin",
9673 srcs: ["mylib.cpp"],
9674 relative_install_path: "foo/bar",
9675 static_executable: true,
9676 system_shared_libs: [],
9677 stl: "none",
9678 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009679 min_sdk_version: "29",
9680 }
9681 `)
9682
9683 testApexError(t, `executable mybin.rust is static`, `
9684 apex {
9685 name: "myapex",
9686 key: "myapex.key",
9687 binaries: ["mybin.rust"],
9688 min_sdk_version: "29",
9689 }
9690
9691 apex_key {
9692 name: "myapex.key",
9693 public_key: "testkey.avbpubkey",
9694 private_key: "testkey.pem",
9695 }
9696
9697 rust_binary {
9698 name: "mybin.rust",
9699 srcs: ["foo.rs"],
9700 static_executable: true,
9701 apex_available: ["myapex"],
9702 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009703 }
9704 `)
9705}
9706
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009707func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9708 ctx := testApex(t, `
9709 apex {
9710 name: "myapex",
9711 key: "myapex.key",
9712 updatable: false,
9713 java_libs: ["foo"],
9714 }
9715
9716 apex_key {
9717 name: "myapex.key",
9718 public_key: "testkey.avbpubkey",
9719 private_key: "testkey.pem",
9720 }
9721
9722 java_library {
9723 name: "foo",
9724 srcs: ["foo.java"],
9725 apex_available: ["myapex"],
9726 installable: true,
9727 }
9728 `,
9729 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9730 )
9731
9732 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9733 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9734 var builder strings.Builder
9735 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9736 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009737 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.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 +00009738}
9739
9740func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9741 ctx := testApex(t, `
9742 prebuilt_apex {
9743 name: "myapex",
9744 arch: {
9745 arm64: {
9746 src: "myapex-arm64.apex",
9747 },
9748 arm: {
9749 src: "myapex-arm.apex",
9750 },
9751 },
9752 exported_java_libs: ["foo"],
9753 }
9754
9755 java_import {
9756 name: "foo",
9757 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009758 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009759 }
9760 `,
9761 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9762 )
9763
9764 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9765 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9766 mainModuleEntries := entriesList[0]
9767 android.AssertArrayString(t,
9768 "LOCAL_REQUIRED_MODULES",
9769 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9770 []string{
9771 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9772 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9773 })
9774}
9775
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009776func TestAndroidMk_RequiredModules(t *testing.T) {
9777 ctx := testApex(t, `
9778 apex {
9779 name: "myapex",
9780 key: "myapex.key",
9781 updatable: false,
9782 java_libs: ["foo"],
9783 required: ["otherapex"],
9784 }
9785
9786 apex {
9787 name: "otherapex",
9788 key: "myapex.key",
9789 updatable: false,
9790 java_libs: ["foo"],
9791 required: ["otherapex"],
9792 }
9793
9794 apex_key {
9795 name: "myapex.key",
9796 public_key: "testkey.avbpubkey",
9797 private_key: "testkey.pem",
9798 }
9799
9800 java_library {
9801 name: "foo",
9802 srcs: ["foo.java"],
9803 apex_available: ["myapex", "otherapex"],
9804 installable: true,
9805 }
9806 `)
9807
9808 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9809 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9810 var builder strings.Builder
9811 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9812 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009813 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009814}
9815
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009816func TestAndroidMk_RequiredDeps(t *testing.T) {
9817 ctx := testApex(t, `
9818 apex {
9819 name: "myapex",
9820 key: "myapex.key",
9821 updatable: false,
9822 }
9823
9824 apex_key {
9825 name: "myapex.key",
9826 public_key: "testkey.avbpubkey",
9827 private_key: "testkey.pem",
9828 }
9829 `)
9830
9831 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009832 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009833 data := android.AndroidMkDataForTest(t, ctx, bundle)
9834 var builder strings.Builder
9835 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9836 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009837 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009838}
9839
Jooyung Hana6d36672022-02-24 13:58:07 +09009840func TestApexOutputFileProducer(t *testing.T) {
9841 for _, tc := range []struct {
9842 name string
9843 ref string
9844 expected_data []string
9845 }{
9846 {
9847 name: "test_using_output",
9848 ref: ":myapex",
9849 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9850 },
9851 {
9852 name: "test_using_apex",
9853 ref: ":myapex{.apex}",
9854 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9855 },
9856 } {
9857 t.Run(tc.name, func(t *testing.T) {
9858 ctx := testApex(t, `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 compressible: true,
9863 updatable: false,
9864 }
9865
9866 apex_key {
9867 name: "myapex.key",
9868 public_key: "testkey.avbpubkey",
9869 private_key: "testkey.pem",
9870 }
9871
9872 java_test {
9873 name: "`+tc.name+`",
9874 srcs: ["a.java"],
9875 data: ["`+tc.ref+`"],
9876 }
9877 `,
9878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9879 variables.CompressedApex = proptools.BoolPtr(true)
9880 }))
9881 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9882 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9883 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9884 })
9885 }
9886}
9887
satayev758968a2021-12-06 11:42:40 +00009888func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9889 preparer := android.GroupFixturePreparers(
9890 PrepareForTestWithApexBuildComponents,
9891 prepareForTestWithMyapex,
9892 java.PrepareForTestWithJavaSdkLibraryFiles,
9893 java.PrepareForTestWithJavaDefaultModules,
9894 android.PrepareForTestWithAndroidBuildComponents,
9895 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9896 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9897 )
9898
9899 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9900 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9901 preparer.RunTestWithBp(t, `
9902 apex {
9903 name: "myapex",
9904 key: "myapex.key",
9905 bootclasspath_fragments: ["mybootclasspathfragment"],
9906 min_sdk_version: "30",
9907 updatable: false,
9908 }
9909
9910 apex_key {
9911 name: "myapex.key",
9912 public_key: "testkey.avbpubkey",
9913 private_key: "testkey.pem",
9914 }
9915
9916 bootclasspath_fragment {
9917 name: "mybootclasspathfragment",
9918 contents: ["mybootclasspathlib"],
9919 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009920 hidden_api: {
9921 split_packages: ["*"],
9922 },
satayev758968a2021-12-06 11:42:40 +00009923 }
9924
9925 java_sdk_library {
9926 name: "mybootclasspathlib",
9927 srcs: ["mybootclasspathlib.java"],
9928 apex_available: ["myapex"],
9929 compile_dex: true,
9930 unsafe_ignore_missing_latest_api: true,
9931 min_sdk_version: "31",
9932 static_libs: ["util"],
9933 }
9934
9935 java_library {
9936 name: "util",
9937 srcs: ["a.java"],
9938 apex_available: ["myapex"],
9939 min_sdk_version: "31",
9940 static_libs: ["another_util"],
9941 }
9942
9943 java_library {
9944 name: "another_util",
9945 srcs: ["a.java"],
9946 min_sdk_version: "31",
9947 apex_available: ["myapex"],
9948 }
9949 `)
9950 })
9951
9952 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9953 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9954 preparer.RunTestWithBp(t, `
9955 apex {
9956 name: "myapex",
9957 key: "myapex.key",
9958 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9959 min_sdk_version: "30",
9960 updatable: false,
9961 }
9962
9963 apex_key {
9964 name: "myapex.key",
9965 public_key: "testkey.avbpubkey",
9966 private_key: "testkey.pem",
9967 }
9968
9969 systemserverclasspath_fragment {
9970 name: "mysystemserverclasspathfragment",
9971 contents: ["mysystemserverclasspathlib"],
9972 apex_available: ["myapex"],
9973 }
9974
9975 java_sdk_library {
9976 name: "mysystemserverclasspathlib",
9977 srcs: ["mysystemserverclasspathlib.java"],
9978 apex_available: ["myapex"],
9979 compile_dex: true,
9980 min_sdk_version: "32",
9981 unsafe_ignore_missing_latest_api: true,
9982 static_libs: ["util"],
9983 }
9984
9985 java_library {
9986 name: "util",
9987 srcs: ["a.java"],
9988 apex_available: ["myapex"],
9989 min_sdk_version: "31",
9990 static_libs: ["another_util"],
9991 }
9992
9993 java_library {
9994 name: "another_util",
9995 srcs: ["a.java"],
9996 min_sdk_version: "31",
9997 apex_available: ["myapex"],
9998 }
9999 `)
10000 })
10001
10002 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10003 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10004 RunTestWithBp(t, `
10005 apex {
10006 name: "myapex",
10007 key: "myapex.key",
10008 bootclasspath_fragments: ["mybootclasspathfragment"],
10009 min_sdk_version: "30",
10010 updatable: false,
10011 }
10012
10013 apex_key {
10014 name: "myapex.key",
10015 public_key: "testkey.avbpubkey",
10016 private_key: "testkey.pem",
10017 }
10018
10019 bootclasspath_fragment {
10020 name: "mybootclasspathfragment",
10021 contents: ["mybootclasspathlib"],
10022 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010023 hidden_api: {
10024 split_packages: ["*"],
10025 },
satayev758968a2021-12-06 11:42:40 +000010026 }
10027
10028 java_sdk_library {
10029 name: "mybootclasspathlib",
10030 srcs: ["mybootclasspathlib.java"],
10031 apex_available: ["myapex"],
10032 compile_dex: true,
10033 unsafe_ignore_missing_latest_api: true,
10034 }
10035 `)
10036 })
10037
10038 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10039 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10040 RunTestWithBp(t, `
10041 apex {
10042 name: "myapex",
10043 key: "myapex.key",
10044 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10045 min_sdk_version: "30",
10046 updatable: false,
10047 }
10048
10049 apex_key {
10050 name: "myapex.key",
10051 public_key: "testkey.avbpubkey",
10052 private_key: "testkey.pem",
10053 }
10054
10055 systemserverclasspath_fragment {
10056 name: "mysystemserverclasspathfragment",
10057 contents: ["mysystemserverclasspathlib"],
10058 apex_available: ["myapex"],
10059 }
10060
10061 java_sdk_library {
10062 name: "mysystemserverclasspathlib",
10063 srcs: ["mysystemserverclasspathlib.java"],
10064 apex_available: ["myapex"],
10065 compile_dex: true,
10066 unsafe_ignore_missing_latest_api: true,
10067 }
10068 `)
10069 })
10070}
10071
Jiakai Zhang6decef92022-01-12 17:56:19 +000010072// Verifies that the APEX depends on all the Make modules in the list.
10073func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10074 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10075 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010076 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010077 }
10078}
10079
10080// Verifies that the APEX does not depend on any of the Make modules in the list.
10081func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10082 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10083 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010084 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010085 }
10086}
10087
Cole Faust1021ccd2023-02-26 21:15:25 -080010088// TODO(b/193460475): Re-enable this test
10089//func TestApexStrictUpdtabilityLint(t *testing.T) {
10090// bpTemplate := `
10091// apex {
10092// name: "myapex",
10093// key: "myapex.key",
10094// java_libs: ["myjavalib"],
10095// updatable: %v,
10096// min_sdk_version: "29",
10097// }
10098// apex_key {
10099// name: "myapex.key",
10100// }
10101// java_library {
10102// name: "myjavalib",
10103// srcs: ["MyClass.java"],
10104// apex_available: [ "myapex" ],
10105// lint: {
10106// strict_updatability_linting: %v,
10107// },
10108// sdk_version: "current",
10109// min_sdk_version: "29",
10110// }
10111// `
10112// fs := android.MockFS{
10113// "lint-baseline.xml": nil,
10114// }
10115//
10116// testCases := []struct {
10117// testCaseName string
10118// apexUpdatable bool
10119// javaStrictUpdtabilityLint bool
10120// lintFileExists bool
10121// disallowedFlagExpected bool
10122// }{
10123// {
10124// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10125// apexUpdatable: true,
10126// javaStrictUpdtabilityLint: true,
10127// lintFileExists: false,
10128// disallowedFlagExpected: false,
10129// },
10130// {
10131// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10132// apexUpdatable: false,
10133// javaStrictUpdtabilityLint: false,
10134// lintFileExists: true,
10135// disallowedFlagExpected: false,
10136// },
10137// {
10138// testCaseName: "non-updatable apex respects strict updatability of javalib",
10139// apexUpdatable: false,
10140// javaStrictUpdtabilityLint: true,
10141// lintFileExists: true,
10142// disallowedFlagExpected: true,
10143// },
10144// {
10145// testCaseName: "updatable apex sets strict updatability of javalib to true",
10146// apexUpdatable: true,
10147// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10148// lintFileExists: true,
10149// disallowedFlagExpected: true,
10150// },
10151// }
10152//
10153// for _, testCase := range testCases {
10154// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10155// fixtures := []android.FixturePreparer{}
10156// if testCase.lintFileExists {
10157// fixtures = append(fixtures, fs.AddToFixture())
10158// }
10159//
10160// result := testApex(t, bp, fixtures...)
10161// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10162// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10163// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10164//
10165// if disallowedFlagActual != testCase.disallowedFlagExpected {
10166// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10167// }
10168// }
10169//}
10170//
10171//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10172// bp := `
10173// apex {
10174// name: "myapex",
10175// key: "myapex.key",
10176// java_libs: ["myjavalib"],
10177// updatable: true,
10178// min_sdk_version: "29",
10179// }
10180// apex_key {
10181// name: "myapex.key",
10182// }
10183// java_library {
10184// name: "myjavalib",
10185// srcs: ["MyClass.java"],
10186// apex_available: [ "myapex" ],
10187// sdk_version: "current",
10188// min_sdk_version: "29",
10189// }
10190// `
10191//
10192// testCases := []struct {
10193// testCaseName string
10194// moduleDirectory string
10195// disallowedFlagExpected bool
10196// }{
10197// {
10198// testCaseName: "lintable module defined outside libcore",
10199// moduleDirectory: "",
10200// disallowedFlagExpected: true,
10201// },
10202// {
10203// testCaseName: "lintable module defined in libcore root directory",
10204// moduleDirectory: "libcore/",
10205// disallowedFlagExpected: false,
10206// },
10207// {
10208// testCaseName: "lintable module defined in libcore child directory",
10209// moduleDirectory: "libcore/childdir/",
10210// disallowedFlagExpected: true,
10211// },
10212// }
10213//
10214// for _, testCase := range testCases {
10215// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10216// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10217// result := testApex(t, "", lintFileCreator, bpFileCreator)
10218// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10219// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10220// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10221// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10222//
10223// if disallowedFlagActual != testCase.disallowedFlagExpected {
10224// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10225// }
10226// }
10227//}
10228//
10229//// checks transtive deps of an apex coming from bootclasspath_fragment
10230//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10231// bp := `
10232// apex {
10233// name: "myapex",
10234// key: "myapex.key",
10235// bootclasspath_fragments: ["mybootclasspathfragment"],
10236// updatable: true,
10237// min_sdk_version: "29",
10238// }
10239// apex_key {
10240// name: "myapex.key",
10241// }
10242// bootclasspath_fragment {
10243// name: "mybootclasspathfragment",
10244// contents: ["myjavalib"],
10245// apex_available: ["myapex"],
10246// hidden_api: {
10247// split_packages: ["*"],
10248// },
10249// }
10250// java_library {
10251// name: "myjavalib",
10252// srcs: ["MyClass.java"],
10253// apex_available: [ "myapex" ],
10254// sdk_version: "current",
10255// min_sdk_version: "29",
10256// compile_dex: true,
10257// }
10258// `
10259// fs := android.MockFS{
10260// "lint-baseline.xml": nil,
10261// }
10262//
10263// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10264// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10265// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10266// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10267// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10268// }
10269//}
Spandan Das66773252022-01-15 00:23:18 +000010270
Spandan Das42e89502022-05-06 22:12:55 +000010271// updatable apexes should propagate updatable=true to its apps
10272func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10273 bp := `
10274 apex {
10275 name: "myapex",
10276 key: "myapex.key",
10277 updatable: %v,
10278 apps: [
10279 "myapp",
10280 ],
10281 min_sdk_version: "30",
10282 }
10283 apex_key {
10284 name: "myapex.key",
10285 }
10286 android_app {
10287 name: "myapp",
10288 updatable: %v,
10289 apex_available: [
10290 "myapex",
10291 ],
10292 sdk_version: "current",
10293 min_sdk_version: "30",
10294 }
10295 `
10296 testCases := []struct {
10297 name string
10298 apex_is_updatable_bp bool
10299 app_is_updatable_bp bool
10300 app_is_updatable_expected bool
10301 }{
10302 {
10303 name: "Non-updatable apex respects updatable property of non-updatable app",
10304 apex_is_updatable_bp: false,
10305 app_is_updatable_bp: false,
10306 app_is_updatable_expected: false,
10307 },
10308 {
10309 name: "Non-updatable apex respects updatable property of updatable app",
10310 apex_is_updatable_bp: false,
10311 app_is_updatable_bp: true,
10312 app_is_updatable_expected: true,
10313 },
10314 {
10315 name: "Updatable apex respects updatable property of updatable app",
10316 apex_is_updatable_bp: true,
10317 app_is_updatable_bp: true,
10318 app_is_updatable_expected: true,
10319 },
10320 {
10321 name: "Updatable apex sets updatable=true on non-updatable app",
10322 apex_is_updatable_bp: true,
10323 app_is_updatable_bp: false,
10324 app_is_updatable_expected: true,
10325 },
10326 }
10327 for _, testCase := range testCases {
10328 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10329 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10330 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10331 }
10332}
10333
Kiyoung Kim487689e2022-07-26 09:48:22 +090010334func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10335 bp := `
10336 apex {
10337 name: "myapex",
10338 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010339 native_shared_libs: ["libbaz"],
10340 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010341 min_sdk_version: "29",
10342 }
10343 apex_key {
10344 name: "myapex.key",
10345 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010346 cc_binary {
10347 name: "binfoo",
10348 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010349 apex_available: ["myapex"],
10350 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010351 recovery_available: false,
10352 }
10353 cc_library {
10354 name: "libbar",
10355 srcs: ["libbar.cc"],
10356 stubs: {
10357 symbol_file: "libbar.map.txt",
10358 versions: [
10359 "29",
10360 ],
10361 },
10362 }
10363 cc_library {
10364 name: "libbaz",
10365 srcs: ["libbaz.cc"],
10366 apex_available: ["myapex"],
10367 min_sdk_version: "29",
10368 stubs: {
10369 symbol_file: "libbaz.map.txt",
10370 versions: [
10371 "29",
10372 ],
10373 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010374 }
10375 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010376 name: "libbar",
10377 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010378 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010379 variants: ["apex.29"],
10380 }
10381 cc_api_variant {
10382 name: "libbar",
10383 variant: "apex",
10384 version: "29",
10385 src: "libbar_apex_29.so",
10386 }
10387 cc_api_library {
10388 name: "libbaz",
10389 src: "libbaz_stub.so",
10390 min_sdk_version: "29",
10391 variants: ["apex.29"],
10392 }
10393 cc_api_variant {
10394 name: "libbaz",
10395 variant: "apex",
10396 version: "29",
10397 src: "libbaz_apex_29.so",
10398 }
10399 cc_api_library {
10400 name: "libqux",
10401 src: "libqux_stub.so",
10402 min_sdk_version: "29",
10403 variants: ["apex.29"],
10404 }
10405 cc_api_variant {
10406 name: "libqux",
10407 variant: "apex",
10408 version: "29",
10409 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010410 }
10411 api_imports {
10412 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010413 apex_shared_libs: [
10414 "libbar",
10415 "libbaz",
10416 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010417 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010418 }
10419 `
10420 result := testApex(t, bp)
10421
10422 hasDep := func(m android.Module, wantDep android.Module) bool {
10423 t.Helper()
10424 var found bool
10425 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10426 if dep == wantDep {
10427 found = true
10428 }
10429 })
10430 return found
10431 }
10432
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010433 // Library defines stubs and cc_api_library should be used with cc_api_library
10434 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10435 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10436 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010437
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010438 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10439 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010440
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010441 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10442 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10443 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10444 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10445
10446 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10447 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10448 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10449 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10450 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10451
10452 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10453 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10454 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10455
10456 // cc_api_library defined without original library should be linked with cc_api_library
10457 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10458 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10459 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10460}
10461
10462func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10463 bp := `
10464 apex {
10465 name: "myapex",
10466 key: "myapex.key",
10467 native_shared_libs: ["libbar"],
10468 min_sdk_version: "29",
10469 }
10470 apex_key {
10471 name: "myapex.key",
10472 }
10473 cc_binary {
10474 name: "binfoo",
10475 shared_libs: ["libbar"],
10476 recovery_available: false,
10477 }
10478 cc_library {
10479 name: "libbar",
10480 srcs: ["libbar.cc"],
10481 apex_available: ["myapex"],
10482 min_sdk_version: "29",
10483 stubs: {
10484 symbol_file: "libbar.map.txt",
10485 versions: [
10486 "29",
10487 ],
10488 },
10489 }
10490 cc_api_library {
10491 name: "libbar",
10492 src: "libbar_stub.so",
10493 variants: ["apex.29"],
10494 }
10495 cc_api_variant {
10496 name: "libbar",
10497 variant: "apex",
10498 version: "29",
10499 src: "libbar_apex_29.so",
10500 }
10501 api_imports {
10502 name: "api_imports",
10503 apex_shared_libs: [
10504 "libbar",
10505 ],
10506 }
10507 `
10508
10509 result := testApex(t, bp)
10510
10511 hasDep := func(m android.Module, wantDep android.Module) bool {
10512 t.Helper()
10513 var found bool
10514 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10515 if dep == wantDep {
10516 found = true
10517 }
10518 })
10519 return found
10520 }
10521
10522 // Library defines stubs and cc_api_library should be used with cc_api_library
10523 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10524 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10525 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10526
10527 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10528 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10529
10530 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10531 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10532 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10533 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010534}
Dennis Shend4f5d932023-01-31 20:27:21 +000010535
10536func TestTrimmedApex(t *testing.T) {
10537 bp := `
10538 apex {
10539 name: "myapex",
10540 key: "myapex.key",
10541 native_shared_libs: ["libfoo","libbaz"],
10542 min_sdk_version: "29",
10543 trim_against: "mydcla",
10544 }
10545 apex {
10546 name: "mydcla",
10547 key: "myapex.key",
10548 native_shared_libs: ["libfoo","libbar"],
10549 min_sdk_version: "29",
10550 file_contexts: ":myapex-file_contexts",
10551 dynamic_common_lib_apex: true,
10552 }
10553 apex_key {
10554 name: "myapex.key",
10555 }
10556 cc_library {
10557 name: "libfoo",
10558 shared_libs: ["libc"],
10559 apex_available: ["myapex","mydcla"],
10560 min_sdk_version: "29",
10561 }
10562 cc_library {
10563 name: "libbar",
10564 shared_libs: ["libc"],
10565 apex_available: ["myapex","mydcla"],
10566 min_sdk_version: "29",
10567 }
10568 cc_library {
10569 name: "libbaz",
10570 shared_libs: ["libc"],
10571 apex_available: ["myapex","mydcla"],
10572 min_sdk_version: "29",
10573 }
10574 cc_api_library {
10575 name: "libc",
10576 src: "libc.so",
10577 min_sdk_version: "29",
10578 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010579 vendor_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010580 }
10581 api_imports {
10582 name: "api_imports",
10583 shared_libs: [
10584 "libc",
10585 ],
10586 header_libs: [],
10587 }
10588 `
10589 ctx := testApex(t, bp)
10590 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10591 apexRule := module.MaybeRule("apexRule")
10592 if apexRule.Rule == nil {
10593 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10594 }
10595
10596 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10597 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10598 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10599 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10600 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10601 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10602}
Jingwen Chendea7a642023-03-28 11:30:50 +000010603
10604func TestCannedFsConfig(t *testing.T) {
10605 ctx := testApex(t, `
10606 apex {
10607 name: "myapex",
10608 key: "myapex.key",
10609 updatable: false,
10610 }
10611
10612 apex_key {
10613 name: "myapex.key",
10614 public_key: "testkey.avbpubkey",
10615 private_key: "testkey.pem",
10616 }`)
10617 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10618 generateFsRule := mod.Rule("generateFsConfig")
10619 cmd := generateFsRule.RuleParams.Command
10620
10621 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10622}
10623
10624func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10625 ctx := testApex(t, `
10626 apex {
10627 name: "myapex",
10628 key: "myapex.key",
10629 canned_fs_config: "my_config",
10630 updatable: false,
10631 }
10632
10633 apex_key {
10634 name: "myapex.key",
10635 public_key: "testkey.avbpubkey",
10636 private_key: "testkey.pem",
10637 }`)
10638 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10639 generateFsRule := mod.Rule("generateFsConfig")
10640 cmd := generateFsRule.RuleParams.Command
10641
10642 // Ensure that canned_fs_config has "cat my_config" at the end
10643 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10644}
Spandan Das20fce2d2023-04-12 17:21:39 +000010645
10646func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10647 testCases := []struct {
10648 desc string
10649 hasStubs bool
10650 apexAvailable string
10651 expectedError string
10652 }{
10653 {
10654 desc: "non-stub library can have multiple apex_available",
10655 hasStubs: false,
10656 apexAvailable: `["myapex", "otherapex"]`,
10657 },
10658 {
10659 desc: "stub library should not be available to anyapex",
10660 hasStubs: true,
10661 apexAvailable: `["//apex_available:anyapex"]`,
10662 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10663 },
10664 {
10665 desc: "stub library should not be available to multiple apexes",
10666 hasStubs: true,
10667 apexAvailable: `["myapex", "otherapex"]`,
10668 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10669 },
10670 {
10671 desc: "stub library can be available to a core apex and a test apex",
10672 hasStubs: true,
10673 apexAvailable: `["myapex", "test_myapex"]`,
10674 },
10675 }
10676 bpTemplate := `
10677 cc_library {
10678 name: "libfoo",
10679 %v
10680 apex_available: %v,
10681 }
10682 apex {
10683 name: "myapex",
10684 key: "apex.key",
10685 updatable: false,
10686 native_shared_libs: ["libfoo"],
10687 }
10688 apex {
10689 name: "otherapex",
10690 key: "apex.key",
10691 updatable: false,
10692 }
10693 apex_test {
10694 name: "test_myapex",
10695 key: "apex.key",
10696 updatable: false,
10697 native_shared_libs: ["libfoo"],
10698 }
10699 apex_key {
10700 name: "apex.key",
10701 }
10702 `
10703 for _, tc := range testCases {
10704 stubs := ""
10705 if tc.hasStubs {
10706 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10707 }
10708 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10709 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10710 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10711 })
10712 if tc.expectedError == "" {
10713 testApex(t, bp, mockFsFixturePreparer)
10714 } else {
10715 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10716 }
10717 }
10718}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010719
10720func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10721 context := android.GroupFixturePreparers(
10722 android.PrepareForIntegrationTestWithAndroid,
10723 cc.PrepareForIntegrationTestWithCc,
10724 PrepareForTestWithApexBuildComponents,
10725 prepareForTestWithMyapex,
10726 filesystem.PrepareForTestWithFilesystemBuildComponents,
10727 )
10728 result := context.RunTestWithBp(t, `
10729 android_system_image {
10730 name: "myfilesystem",
10731 deps: [
10732 "libfoo",
10733 ],
10734 linker_config_src: "linker.config.json",
10735 }
10736
10737 cc_library {
10738 name: "libfoo",
10739 shared_libs: [
10740 "libbar",
10741 ],
10742 stl: "none",
10743 }
10744
10745 cc_library {
10746 name: "libbar",
10747 stl: "none",
10748 apex_available: ["myapex"],
10749 }
10750
10751 apex {
10752 name: "myapex",
10753 native_shared_libs: ["libbar"],
10754 key: "myapex.key",
10755 updatable: false,
10756 }
10757
10758 apex_key {
10759 name: "myapex.key",
10760 public_key: "testkey.avbpubkey",
10761 private_key: "testkey.pem",
10762 }
10763 `)
10764
10765 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10766 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10767 inputs.Strings(),
10768 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10769}