blob: c781be4ef43a335482e6e15e1fde449a67e3f1fe [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
789 for _, useFileContextsAsIs := range []bool{true, false} {
790 prop := ""
791 if useFileContextsAsIs {
792 prop = "use_file_contexts_as_is: true,\n"
793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 file_contexts: "file_contexts",
799 updatable: false,
800 vendor: true,
801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
809 `, withFiles(map[string][]byte{
810 "file_contexts": nil,
811 }))
812
813 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
814 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
815 if useFileContextsAsIs {
816 android.AssertStringDoesNotContain(t, "should force-label",
817 rule.RuleParams.Command, forceLabellingCommand)
818 } else {
819 android.AssertStringDoesContain(t, "shouldn't force-label",
820 rule.RuleParams.Command, forceLabellingCommand)
821 }
822 }
823}
824
Alex Light5098a612018-11-29 17:12:15 -0800825func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800826 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800827 apex {
828 name: "myapex",
829 key: "myapex.key",
830 payload_type: "zip",
831 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000832 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800833 }
834
835 apex_key {
836 name: "myapex.key",
837 public_key: "testkey.avbpubkey",
838 private_key: "testkey.pem",
839 }
840
841 cc_library {
842 name: "mylib",
843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib2"],
845 system_shared_libs: [],
846 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000847 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800848 }
849
850 cc_library {
851 name: "mylib2",
852 srcs: ["mylib.cpp"],
853 system_shared_libs: [],
854 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000855 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800856 }
857 `)
858
Sundong Ahnabb64432019-10-22 13:58:29 +0900859 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800860 copyCmds := zipApexRule.Args["copy_commands"]
861
862 // Ensure that main rule creates an output
863 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
864
865 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700869 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800870
871 // Ensure that both direct and indirect deps are copied into apex
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
873 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874}
875
876func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800877 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 apex {
879 name: "myapex",
880 key: "myapex.key",
881 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900882 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000883 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
885
886 apex_key {
887 name: "myapex.key",
888 public_key: "testkey.avbpubkey",
889 private_key: "testkey.pem",
890 }
891
892 cc_library {
893 name: "mylib",
894 srcs: ["mylib.cpp"],
895 shared_libs: ["mylib2", "mylib3"],
896 system_shared_libs: [],
897 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000898 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 }
900
901 cc_library {
902 name: "mylib2",
903 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900904 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["1", "2", "3"],
909 },
910 }
911
912 cc_library {
913 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900914 srcs: ["mylib.cpp"],
915 shared_libs: ["mylib4"],
916 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 stl: "none",
918 stubs: {
919 versions: ["10", "11", "12"],
920 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900923
924 cc_library {
925 name: "mylib4",
926 srcs: ["mylib.cpp"],
927 system_shared_libs: [],
928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000929 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900930 }
Jiyong Park105dc322021-06-11 17:22:09 +0900931
932 rust_binary {
933 name: "foo.rust",
934 srcs: ["foo.rs"],
935 shared_libs: ["libfoo.shared_from_rust"],
936 prefer_rlib: true,
937 apex_available: ["myapex"],
938 }
939
940 cc_library_shared {
941 name: "libfoo.shared_from_rust",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["10", "11", "12"],
947 },
948 }
949
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 `)
951
Sundong Ahnabb64432019-10-22 13:58:29 +0900952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 copyCmds := apexRule.Args["copy_commands"]
954
955 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
961 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800962 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
Colin Crossaede88c2020-08-11 12:17:01 -0700964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965
966 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900967 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900969 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970
971 // 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 -0700972 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700974 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900975
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700976 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
977 // is replaced by sharing of "cFlags" in cc/builder.go.
978 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
979 // module variable representing "cflags". So it was not detected by ensureNotContains.
980 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
981 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
982 // including the original cflags's "-include mylib.h".
983 //
Jiyong Park64379952018-12-13 18:37:29 +0900984 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700985 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
986 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900987
Jiyong Park85cc35a2022-07-17 11:30:47 +0900988 // Ensure that genstub for platform-provided lib is invoked with --systemapi
989 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
990 // Ensure that genstub for apex-provided lib is invoked with --apex
991 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900992
Jooyung Hana57af4a2020-01-23 05:36:59 +0000993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900994 "lib64/mylib.so",
995 "lib64/mylib3.so",
996 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900997 "bin/foo.rust",
998 "lib64/libc++.so", // by the implicit dependency from foo.rust
999 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001000 })
Jiyong Park105dc322021-06-11 17:22:09 +09001001
1002 // Ensure that stub dependency from a rust module is not included
1003 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1004 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001005 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001006 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1007 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001008
1009 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1010 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011}
1012
Jiyong Park1bc84122021-06-22 20:23:05 +09001013func TestApexCanUsePrivateApis(t *testing.T) {
1014 ctx := testApex(t, `
1015 apex {
1016 name: "myapex",
1017 key: "myapex.key",
1018 native_shared_libs: ["mylib"],
1019 binaries: ["foo.rust"],
1020 updatable: false,
1021 platform_apis: true,
1022 }
1023
1024 apex_key {
1025 name: "myapex.key",
1026 public_key: "testkey.avbpubkey",
1027 private_key: "testkey.pem",
1028 }
1029
1030 cc_library {
1031 name: "mylib",
1032 srcs: ["mylib.cpp"],
1033 shared_libs: ["mylib2"],
1034 system_shared_libs: [],
1035 stl: "none",
1036 apex_available: [ "myapex" ],
1037 }
1038
1039 cc_library {
1040 name: "mylib2",
1041 srcs: ["mylib.cpp"],
1042 cflags: ["-include mylib.h"],
1043 system_shared_libs: [],
1044 stl: "none",
1045 stubs: {
1046 versions: ["1", "2", "3"],
1047 },
1048 }
1049
1050 rust_binary {
1051 name: "foo.rust",
1052 srcs: ["foo.rs"],
1053 shared_libs: ["libfoo.shared_from_rust"],
1054 prefer_rlib: true,
1055 apex_available: ["myapex"],
1056 }
1057
1058 cc_library_shared {
1059 name: "libfoo.shared_from_rust",
1060 srcs: ["mylib.cpp"],
1061 system_shared_libs: [],
1062 stl: "none",
1063 stubs: {
1064 versions: ["10", "11", "12"],
1065 },
1066 }
1067 `)
1068
1069 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1070 copyCmds := apexRule.Args["copy_commands"]
1071
1072 // Ensure that indirect stubs dep is not included
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1074 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1075
1076 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1077 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001078 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1080 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001081 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001082 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1083 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1084}
1085
Colin Cross7812fd32020-09-25 12:35:10 -07001086func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001088 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib", "mylib3"],
1093 min_sdk_version: "29",
1094 }
1095
1096 apex_key {
1097 name: "myapex.key",
1098 public_key: "testkey.avbpubkey",
1099 private_key: "testkey.pem",
1100 }
1101
1102 cc_library {
1103 name: "mylib",
1104 srcs: ["mylib.cpp"],
1105 shared_libs: ["mylib2", "mylib3"],
1106 system_shared_libs: [],
1107 stl: "none",
1108 apex_available: [ "myapex" ],
1109 min_sdk_version: "28",
1110 }
1111
1112 cc_library {
1113 name: "mylib2",
1114 srcs: ["mylib.cpp"],
1115 cflags: ["-include mylib.h"],
1116 system_shared_libs: [],
1117 stl: "none",
1118 stubs: {
1119 versions: ["28", "29", "30", "current"],
1120 },
1121 min_sdk_version: "28",
1122 }
1123
1124 cc_library {
1125 name: "mylib3",
1126 srcs: ["mylib.cpp"],
1127 shared_libs: ["mylib4"],
1128 system_shared_libs: [],
1129 stl: "none",
1130 stubs: {
1131 versions: ["28", "29", "30", "current"],
1132 },
1133 apex_available: [ "myapex" ],
1134 min_sdk_version: "28",
1135 }
1136
1137 cc_library {
1138 name: "mylib4",
1139 srcs: ["mylib.cpp"],
1140 system_shared_libs: [],
1141 stl: "none",
1142 apex_available: [ "myapex" ],
1143 min_sdk_version: "28",
1144 }
1145 `)
1146
1147 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1148 copyCmds := apexRule.Args["copy_commands"]
1149
1150 // Ensure that direct non-stubs dep is always included
1151 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155
1156 // Ensure that direct stubs dep is included
1157 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1158
1159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1160
Jiyong Park55549df2021-02-26 23:57:23 +09001161 // Ensure that mylib is linking with the latest version of stub for mylib2
1162 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001163 // ... and not linking to the non-stub (impl) variant of mylib2
1164 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1165
1166 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1167 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1168 // .. and not linking to the stubs variant of mylib3
1169 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1170
1171 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001172 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001173 ensureNotContains(t, mylib2Cflags, "-include ")
1174
Jiyong Park85cc35a2022-07-17 11:30:47 +09001175 // Ensure that genstub is invoked with --systemapi
1176 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001177
1178 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1179 "lib64/mylib.so",
1180 "lib64/mylib3.so",
1181 "lib64/mylib4.so",
1182 })
1183}
1184
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001185func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1186 t.Parallel()
1187 // myapex (Z)
1188 // mylib -----------------.
1189 // |
1190 // otherapex (29) |
1191 // libstub's versions: 29 Z current
1192 // |
1193 // <platform> |
1194 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001195 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001196 apex {
1197 name: "myapex",
1198 key: "myapex.key",
1199 native_shared_libs: ["mylib"],
1200 min_sdk_version: "Z", // non-final
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
1206 shared_libs: ["libstub"],
1207 apex_available: ["myapex"],
1208 min_sdk_version: "Z",
1209 }
1210
1211 apex_key {
1212 name: "myapex.key",
1213 public_key: "testkey.avbpubkey",
1214 private_key: "testkey.pem",
1215 }
1216
1217 apex {
1218 name: "otherapex",
1219 key: "myapex.key",
1220 native_shared_libs: ["libstub"],
1221 min_sdk_version: "29",
1222 }
1223
1224 cc_library {
1225 name: "libstub",
1226 srcs: ["mylib.cpp"],
1227 stubs: {
1228 versions: ["29", "Z", "current"],
1229 },
1230 apex_available: ["otherapex"],
1231 min_sdk_version: "29",
1232 }
1233
1234 // platform module depending on libstub from otherapex should use the latest stub("current")
1235 cc_library {
1236 name: "libplatform",
1237 srcs: ["mylib.cpp"],
1238 shared_libs: ["libstub"],
1239 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001240 `,
1241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1242 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1243 variables.Platform_sdk_final = proptools.BoolPtr(false)
1244 variables.Platform_version_active_codenames = []string{"Z"}
1245 }),
1246 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001247
Jiyong Park55549df2021-02-26 23:57:23 +09001248 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001249 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001250 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001251 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001252 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001253
1254 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1255 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1256 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1257 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1258 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1259}
1260
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001262 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001264 name: "myapex2",
1265 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001266 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001267 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001268 }
1269
1270 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001271 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001272 public_key: "testkey.avbpubkey",
1273 private_key: "testkey.pem",
1274 }
1275
1276 cc_library {
1277 name: "mylib",
1278 srcs: ["mylib.cpp"],
1279 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001280 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 system_shared_libs: [],
1282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001283 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284 }
1285
1286 cc_library {
1287 name: "libfoo",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libbar"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 stubs: {
1293 versions: ["10", "20", "30"],
1294 },
1295 }
1296
1297 cc_library {
1298 name: "libbar",
1299 srcs: ["mylib.cpp"],
1300 system_shared_libs: [],
1301 stl: "none",
1302 }
1303
Jiyong Park678c8812020-02-07 17:25:49 +09001304 cc_library_static {
1305 name: "libbaz",
1306 srcs: ["mylib.cpp"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [ "myapex2" ],
1310 }
1311
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 `)
1313
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001315 copyCmds := apexRule.Args["copy_commands"]
1316
1317 // Ensure that direct non-stubs dep is always included
1318 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1319
1320 // Ensure that indirect stubs dep is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1322
1323 // Ensure that dependency of stubs is not included
1324 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1325
Colin Crossaede88c2020-08-11 12:17:01 -07001326 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327
1328 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001329 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001330 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001331 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332
Jiyong Park3ff16992019-12-27 14:11:47 +09001333 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334
1335 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1336 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001340
Artur Satayeva8bd1132020-04-27 18:07:06 +01001341 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001342 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001343}
1344
Jooyung Hand3639552019-08-09 12:57:43 +09001345func TestApexWithRuntimeLibsDependency(t *testing.T) {
1346 /*
1347 myapex
1348 |
1349 v (runtime_libs)
1350 mylib ------+------> libfoo [provides stub]
1351 |
1352 `------> libbar
1353 */
Colin Cross1c460562021-02-16 17:55:47 -08001354 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001355 apex {
1356 name: "myapex",
1357 key: "myapex.key",
1358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001359 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001360 }
1361
1362 apex_key {
1363 name: "myapex.key",
1364 public_key: "testkey.avbpubkey",
1365 private_key: "testkey.pem",
1366 }
1367
1368 cc_library {
1369 name: "mylib",
1370 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001371 static_libs: ["libstatic"],
1372 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001373 runtime_libs: ["libfoo", "libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001376 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001377 }
1378
1379 cc_library {
1380 name: "libfoo",
1381 srcs: ["mylib.cpp"],
1382 system_shared_libs: [],
1383 stl: "none",
1384 stubs: {
1385 versions: ["10", "20", "30"],
1386 },
1387 }
1388
1389 cc_library {
1390 name: "libbar",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001394 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001395 }
1396
Liz Kammer5f108fa2023-05-11 14:33:17 -04001397 cc_library {
1398 name: "libstatic",
1399 srcs: ["mylib.cpp"],
1400 system_shared_libs: [],
1401 stl: "none",
1402 apex_available: [ "myapex" ],
1403 runtime_libs: ["libstatic_to_runtime"],
1404 }
1405
1406 cc_library {
1407 name: "libshared",
1408 srcs: ["mylib.cpp"],
1409 system_shared_libs: [],
1410 stl: "none",
1411 apex_available: [ "myapex" ],
1412 runtime_libs: ["libshared_to_runtime"],
1413 }
1414
1415 cc_library {
1416 name: "libstatic_to_runtime",
1417 srcs: ["mylib.cpp"],
1418 system_shared_libs: [],
1419 stl: "none",
1420 apex_available: [ "myapex" ],
1421 }
1422
1423 cc_library {
1424 name: "libshared_to_runtime",
1425 srcs: ["mylib.cpp"],
1426 system_shared_libs: [],
1427 stl: "none",
1428 apex_available: [ "myapex" ],
1429 }
Jooyung Hand3639552019-08-09 12:57:43 +09001430 `)
1431
Sundong Ahnabb64432019-10-22 13:58:29 +09001432 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001433 copyCmds := apexRule.Args["copy_commands"]
1434
1435 // Ensure that direct non-stubs dep is always included
1436 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1437
1438 // Ensure that indirect stubs dep is not included
1439 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1440
1441 // Ensure that runtime_libs dep in included
1442 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001443 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1444 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1445
1446 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001447
Sundong Ahnabb64432019-10-22 13:58:29 +09001448 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001449 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1450 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001451}
1452
Paul Duffina02cae32021-03-09 01:44:06 +00001453var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1454 cc.PrepareForTestWithCcBuildComponents,
1455 PrepareForTestWithApexBuildComponents,
1456 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001457 apex {
1458 name: "com.android.runtime",
1459 key: "com.android.runtime.key",
1460 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001461 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 }
1463
1464 apex_key {
1465 name: "com.android.runtime.key",
1466 public_key: "testkey.avbpubkey",
1467 private_key: "testkey.pem",
1468 }
Paul Duffina02cae32021-03-09 01:44:06 +00001469 `),
1470 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1471)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
Paul Duffina02cae32021-03-09 01:44:06 +00001473func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001474 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001475 cc_library {
1476 name: "libc",
1477 no_libcrt: true,
1478 nocrt: true,
1479 stl: "none",
1480 system_shared_libs: [],
1481 stubs: { versions: ["1"] },
1482 apex_available: ["com.android.runtime"],
1483
1484 sanitize: {
1485 hwaddress: true,
1486 }
1487 }
1488
1489 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001490 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 srcs: [""],
1496 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001497 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001498
1499 sanitize: {
1500 never: true,
1501 },
Spandan Das4de7b492023-05-05 21:13:01 +00001502 apex_available: [
1503 "//apex_available:anyapex",
1504 "//apex_available:platform",
1505 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001506 } `)
1507 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508
1509 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1510 "lib64/bionic/libc.so",
1511 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1512 })
1513
Colin Cross4c4c1be2022-02-10 11:41:18 -08001514 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515
1516 installed := hwasan.Description("install libclang_rt.hwasan")
1517 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1518
1519 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1520 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1521 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1522}
1523
1524func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001525 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001526 prepareForTestOfRuntimeApexWithHwasan,
1527 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1528 variables.SanitizeDevice = []string{"hwaddress"}
1529 }),
1530 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001531 cc_library {
1532 name: "libc",
1533 no_libcrt: true,
1534 nocrt: true,
1535 stl: "none",
1536 system_shared_libs: [],
1537 stubs: { versions: ["1"] },
1538 apex_available: ["com.android.runtime"],
1539 }
1540
1541 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001542 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001543 no_libcrt: true,
1544 nocrt: true,
1545 stl: "none",
1546 system_shared_libs: [],
1547 srcs: [""],
1548 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001549 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
1551 sanitize: {
1552 never: true,
1553 },
Spandan Das4de7b492023-05-05 21:13:01 +00001554 apex_available: [
1555 "//apex_available:anyapex",
1556 "//apex_available:platform",
1557 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 }
Paul Duffina02cae32021-03-09 01:44:06 +00001559 `)
1560 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001561
1562 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1563 "lib64/bionic/libc.so",
1564 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1565 })
1566
Colin Cross4c4c1be2022-02-10 11:41:18 -08001567 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568
1569 installed := hwasan.Description("install libclang_rt.hwasan")
1570 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1571
1572 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1573 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1574 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1575}
1576
Jooyung Han61b66e92020-03-21 14:21:46 +00001577func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1578 testcases := []struct {
1579 name string
1580 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001581 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 shouldLink string
1583 shouldNotLink []string
1584 }{
1585 {
Jiyong Park55549df2021-02-26 23:57:23 +09001586 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001587 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001588 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001589 shouldLink: "current",
1590 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001591 },
1592 {
Jiyong Park55549df2021-02-26 23:57:23 +09001593 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001594 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001595 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001596 shouldLink: "current",
1597 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001598 },
1599 }
1600 for _, tc := range testcases {
1601 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001602 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 apex {
1604 name: "myapex",
1605 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001607 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001608 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Jooyung Han61b66e92020-03-21 14:21:46 +00001611 apex_key {
1612 name: "myapex.key",
1613 public_key: "testkey.avbpubkey",
1614 private_key: "testkey.pem",
1615 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001616
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 cc_library {
1618 name: "mylib",
1619 srcs: ["mylib.cpp"],
1620 vendor_available: true,
1621 shared_libs: ["libbar"],
1622 system_shared_libs: [],
1623 stl: "none",
1624 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001625 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001626 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001627
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 cc_library {
1629 name: "libbar",
1630 srcs: ["mylib.cpp"],
1631 system_shared_libs: [],
1632 stl: "none",
1633 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001634 llndk: {
1635 symbol_file: "libbar.map.txt",
1636 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001638 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001639 withUnbundledBuild,
1640 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001641
Jooyung Han61b66e92020-03-21 14:21:46 +00001642 // Ensure that LLNDK dep is not included
1643 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1644 "lib64/mylib.so",
1645 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001646
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 // Ensure that LLNDK dep is required
1648 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1649 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1650 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001651
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1653 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001654 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001656 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001657
Steven Moreland2c4000c2021-04-27 02:08:49 +00001658 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001659 ver := tc.shouldLink
1660 if tc.shouldLink == "current" {
1661 ver = strconv.Itoa(android.FutureApiLevelInt)
1662 }
1663 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001664 })
1665 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001666}
1667
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001669 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 apex {
1671 name: "myapex",
1672 key: "myapex.key",
1673 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001674 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675 }
1676
1677 apex_key {
1678 name: "myapex.key",
1679 public_key: "testkey.avbpubkey",
1680 private_key: "testkey.pem",
1681 }
1682
1683 cc_library {
1684 name: "mylib",
1685 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001686 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 shared_libs: ["libdl#27"],
1688 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001689 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 }
1691
1692 cc_library_shared {
1693 name: "mylib_shared",
1694 srcs: ["mylib.cpp"],
1695 shared_libs: ["libdl#27"],
1696 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001697 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 }
1699
1700 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001701 name: "libBootstrap",
1702 srcs: ["mylib.cpp"],
1703 stl: "none",
1704 bootstrap: true,
1705 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 `)
1707
Sundong Ahnabb64432019-10-22 13:58:29 +09001708 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001709 copyCmds := apexRule.Args["copy_commands"]
1710
1711 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001713 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1714 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
1716 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001717 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718
Colin Crossaede88c2020-08-11 12:17:01 -07001719 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1720 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1721 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001722
1723 // For dependency to libc
1724 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001725 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001727 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001729 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1730 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001731
1732 // For dependency to libm
1733 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001734 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001735 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001736 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001737 // ... and is not compiling with the stub
1738 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1739 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1740
1741 // For dependency to libdl
1742 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001743 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1746 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001747 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001748 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001749 // ... Cflags from stub is correctly exported to mylib
1750 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1751 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001752
1753 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001754 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1755 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1756 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1757 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001758}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001759
Jooyung Han749dc692020-04-15 11:03:39 +09001760func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001761 // there are three links between liba --> libz.
1762 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001763 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001764 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001770 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001771 }
1772
1773 apex {
1774 name: "otherapex",
1775 key: "myapex.key",
1776 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001777 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001778 }
1779
1780 apex_key {
1781 name: "myapex.key",
1782 public_key: "testkey.avbpubkey",
1783 private_key: "testkey.pem",
1784 }
1785
1786 cc_library {
1787 name: "libx",
1788 shared_libs: ["liba"],
1789 system_shared_libs: [],
1790 stl: "none",
1791 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001792 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001793 }
1794
1795 cc_library {
1796 name: "liby",
1797 shared_libs: ["liba"],
1798 system_shared_libs: [],
1799 stl: "none",
1800 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001801 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001802 }
1803
1804 cc_library {
1805 name: "liba",
1806 shared_libs: ["libz"],
1807 system_shared_libs: [],
1808 stl: "none",
1809 apex_available: [
1810 "//apex_available:anyapex",
1811 "//apex_available:platform",
1812 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001813 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001814 }
1815
1816 cc_library {
1817 name: "libz",
1818 system_shared_libs: [],
1819 stl: "none",
1820 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001821 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001822 },
1823 }
Jooyung Han749dc692020-04-15 11:03:39 +09001824 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001825
1826 expectLink := func(from, from_variant, to, to_variant string) {
1827 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1828 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1829 }
1830 expectNoLink := func(from, from_variant, to, to_variant string) {
1831 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1832 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1833 }
1834 // platform liba is linked to non-stub version
1835 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001836 // liba in myapex is linked to current
1837 expectLink("liba", "shared_apex29", "libz", "shared_current")
1838 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001839 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001840 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 // liba in otherapex is linked to current
1842 expectLink("liba", "shared_apex30", "libz", "shared_current")
1843 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001844 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1845 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001846}
1847
Jooyung Hanaed150d2020-04-02 01:41:41 +09001848func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001849 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libx"],
1854 min_sdk_version: "R",
1855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 cc_library {
1864 name: "libx",
1865 shared_libs: ["libz"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001869 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
1877 versions: ["29", "R"],
1878 },
1879 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001880 `,
1881 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1882 variables.Platform_version_active_codenames = []string{"R"}
1883 }),
1884 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001885
1886 expectLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
1890 expectNoLink := func(from, from_variant, to, to_variant string) {
1891 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1892 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1893 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001894 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1895 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001896 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1897 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001898}
1899
Jooyung Han4c4da062021-06-23 10:23:16 +09001900func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1901 testApex(t, `
1902 apex {
1903 name: "myapex",
1904 key: "myapex.key",
1905 java_libs: ["libx"],
1906 min_sdk_version: "S",
1907 }
1908
1909 apex_key {
1910 name: "myapex.key",
1911 public_key: "testkey.avbpubkey",
1912 private_key: "testkey.pem",
1913 }
1914
1915 java_library {
1916 name: "libx",
1917 srcs: ["a.java"],
1918 apex_available: [ "myapex" ],
1919 sdk_version: "current",
1920 min_sdk_version: "S", // should be okay
1921 }
1922 `,
1923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1924 variables.Platform_version_active_codenames = []string{"S"}
1925 variables.Platform_sdk_codename = proptools.StringPtr("S")
1926 }),
1927 )
1928}
1929
Jooyung Han749dc692020-04-15 11:03:39 +09001930func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001931 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001936 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001937 }
1938
1939 apex_key {
1940 name: "myapex.key",
1941 public_key: "testkey.avbpubkey",
1942 private_key: "testkey.pem",
1943 }
1944
1945 cc_library {
1946 name: "libx",
1947 shared_libs: ["libz"],
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 }
1952
1953 cc_library {
1954 name: "libz",
1955 system_shared_libs: [],
1956 stl: "none",
1957 stubs: {
1958 versions: ["1", "2"],
1959 },
1960 }
1961 `)
1962
1963 expectLink := func(from, from_variant, to, to_variant string) {
1964 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1966 }
1967 expectNoLink := func(from, from_variant, to, to_variant string) {
1968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001971 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001972 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001973 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001974 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001975}
1976
Jooyung Handfc864c2023-03-20 18:19:07 +09001977func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001978 ctx := testApex(t, `
1979 apex {
1980 name: "myapex",
1981 key: "myapex.key",
1982 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001983 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001984 vendor: true,
1985 min_sdk_version: "29",
1986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001997 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001998 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001999 shared_libs: ["libbar"],
2000 }
2001
2002 cc_library {
2003 name: "libbar",
2004 stubs: { versions: ["29", "30"] },
2005 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002006 }
2007 `)
2008
2009 vendorVariant := "android_vendor.29_arm64_armv8-a"
2010
Jooyung Handfc864c2023-03-20 18:19:07 +09002011 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2012
2013 // Ensure that mylib links with "current" LLNDK
2014 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2015 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2016
2017 // Ensure that mylib is targeting 29
2018 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2019 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2020
2021 // Ensure that the correct variant of crtbegin_so is used.
2022 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2023 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002024
2025 // Ensure that the crtbegin_so used by the APEX is targeting 29
2026 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2027 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2028}
2029
Jooyung Han4495f842023-04-25 16:39:59 +09002030func TestTrackAllowedDeps(t *testing.T) {
2031 ctx := testApex(t, `
2032 apex {
2033 name: "myapex",
2034 key: "myapex.key",
2035 updatable: true,
2036 native_shared_libs: [
2037 "mylib",
2038 "yourlib",
2039 ],
2040 min_sdk_version: "29",
2041 }
2042
2043 apex {
2044 name: "myapex2",
2045 key: "myapex.key",
2046 updatable: false,
2047 native_shared_libs: ["yourlib"],
2048 }
2049
2050 apex_key {
2051 name: "myapex.key",
2052 public_key: "testkey.avbpubkey",
2053 private_key: "testkey.pem",
2054 }
2055
2056 cc_library {
2057 name: "mylib",
2058 srcs: ["mylib.cpp"],
2059 shared_libs: ["libbar"],
2060 min_sdk_version: "29",
2061 apex_available: ["myapex"],
2062 }
2063
2064 cc_library {
2065 name: "libbar",
2066 stubs: { versions: ["29", "30"] },
2067 }
2068
2069 cc_library {
2070 name: "yourlib",
2071 srcs: ["mylib.cpp"],
2072 min_sdk_version: "29",
2073 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2074 }
2075 `, withFiles(android.MockFS{
2076 "packages/modules/common/build/allowed_deps.txt": nil,
2077 }))
2078
2079 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2080 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2081 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2082 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2083 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2084 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2085
2086 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2087 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2088 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2089 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2090 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2091 flatlist, "mylib:(minSdkVersion:29)")
2092 android.AssertStringListContains(t, "track platform-available lib",
2093 flatlist, "yourlib(minSdkVersion:29)")
2094}
2095
2096func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2097 ctx := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 updatable: true,
2102 min_sdk_version: "29",
2103 }
2104
2105 apex_key {
2106 name: "myapex.key",
2107 public_key: "testkey.avbpubkey",
2108 private_key: "testkey.pem",
2109 }
2110 `)
2111 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2112 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2113 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2114 }
2115}
2116
Jooyung Han03b51852020-02-26 22:45:42 +09002117func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002118 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002119 apex {
2120 name: "myapex",
2121 key: "myapex.key",
2122 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002123 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002124 }
2125
2126 apex_key {
2127 name: "myapex.key",
2128 public_key: "testkey.avbpubkey",
2129 private_key: "testkey.pem",
2130 }
2131
2132 cc_library {
2133 name: "libx",
2134 system_shared_libs: [],
2135 stl: "none",
2136 apex_available: [ "myapex" ],
2137 stubs: {
2138 versions: ["1", "2"],
2139 },
2140 }
2141
2142 cc_library {
2143 name: "libz",
2144 shared_libs: ["libx"],
2145 system_shared_libs: [],
2146 stl: "none",
2147 }
2148 `)
2149
2150 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002151 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002152 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2153 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2154 }
2155 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002156 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002157 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2158 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2159 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002160 expectLink("libz", "shared", "libx", "shared_current")
2161 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002162 expectNoLink("libz", "shared", "libz", "shared_1")
2163 expectNoLink("libz", "shared", "libz", "shared")
2164}
2165
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002166var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2167 func(variables android.FixtureProductVariables) {
2168 variables.SanitizeDevice = []string{"hwaddress"}
2169 },
2170)
2171
Jooyung Han75568392020-03-20 04:29:24 +09002172func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002173 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libx"],
2178 min_sdk_version: "29",
2179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "libx",
2189 shared_libs: ["libbar"],
2190 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002191 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002192 }
2193
2194 cc_library {
2195 name: "libbar",
2196 stubs: {
2197 versions: ["29", "30"],
2198 },
2199 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002200 `,
2201 prepareForTestWithSantitizeHwaddress,
2202 )
Jooyung Han03b51852020-02-26 22:45:42 +09002203 expectLink := func(from, from_variant, to, to_variant string) {
2204 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2205 libFlags := ld.Args["libFlags"]
2206 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2207 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002208 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002209}
2210
Jooyung Han75568392020-03-20 04:29:24 +09002211func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002212 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002213 apex {
2214 name: "myapex",
2215 key: "myapex.key",
2216 native_shared_libs: ["libx"],
2217 min_sdk_version: "29",
2218 }
2219
2220 apex_key {
2221 name: "myapex.key",
2222 public_key: "testkey.avbpubkey",
2223 private_key: "testkey.pem",
2224 }
2225
2226 cc_library {
2227 name: "libx",
2228 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002229 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002230 }
Jooyung Han75568392020-03-20 04:29:24 +09002231 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002232
2233 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002234 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236 // note that platform variant is not.
2237 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002238 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002239}
2240
Jooyung Han749dc692020-04-15 11:03:39 +09002241func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2242 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002243 apex {
2244 name: "myapex",
2245 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002246 native_shared_libs: ["mylib"],
2247 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002248 }
2249
2250 apex_key {
2251 name: "myapex.key",
2252 public_key: "testkey.avbpubkey",
2253 private_key: "testkey.pem",
2254 }
Jooyung Han749dc692020-04-15 11:03:39 +09002255
2256 cc_library {
2257 name: "mylib",
2258 srcs: ["mylib.cpp"],
2259 system_shared_libs: [],
2260 stl: "none",
2261 apex_available: [
2262 "myapex",
2263 ],
2264 min_sdk_version: "30",
2265 }
2266 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002267
2268 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2269 apex {
2270 name: "myapex",
2271 key: "myapex.key",
2272 native_shared_libs: ["libfoo.ffi"],
2273 min_sdk_version: "29",
2274 }
2275
2276 apex_key {
2277 name: "myapex.key",
2278 public_key: "testkey.avbpubkey",
2279 private_key: "testkey.pem",
2280 }
2281
2282 rust_ffi_shared {
2283 name: "libfoo.ffi",
2284 srcs: ["foo.rs"],
2285 crate_name: "foo",
2286 apex_available: [
2287 "myapex",
2288 ],
2289 min_sdk_version: "30",
2290 }
2291 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002292
2293 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 java_libs: ["libfoo"],
2298 min_sdk_version: "29",
2299 }
2300
2301 apex_key {
2302 name: "myapex.key",
2303 public_key: "testkey.avbpubkey",
2304 private_key: "testkey.pem",
2305 }
2306
2307 java_import {
2308 name: "libfoo",
2309 jars: ["libfoo.jar"],
2310 apex_available: [
2311 "myapex",
2312 ],
2313 min_sdk_version: "30",
2314 }
2315 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002316
2317 // Skip check for modules compiling against core API surface
2318 testApex(t, `
2319 apex {
2320 name: "myapex",
2321 key: "myapex.key",
2322 java_libs: ["libfoo"],
2323 min_sdk_version: "29",
2324 }
2325
2326 apex_key {
2327 name: "myapex.key",
2328 public_key: "testkey.avbpubkey",
2329 private_key: "testkey.pem",
2330 }
2331
2332 java_library {
2333 name: "libfoo",
2334 srcs: ["Foo.java"],
2335 apex_available: [
2336 "myapex",
2337 ],
2338 // Compile against core API surface
2339 sdk_version: "core_current",
2340 min_sdk_version: "30",
2341 }
2342 `)
2343
Jooyung Han749dc692020-04-15 11:03:39 +09002344}
2345
2346func TestApexMinSdkVersion_Okay(t *testing.T) {
2347 testApex(t, `
2348 apex {
2349 name: "myapex",
2350 key: "myapex.key",
2351 native_shared_libs: ["libfoo"],
2352 java_libs: ["libbar"],
2353 min_sdk_version: "29",
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 cc_library {
2363 name: "libfoo",
2364 srcs: ["mylib.cpp"],
2365 shared_libs: ["libfoo_dep"],
2366 apex_available: ["myapex"],
2367 min_sdk_version: "29",
2368 }
2369
2370 cc_library {
2371 name: "libfoo_dep",
2372 srcs: ["mylib.cpp"],
2373 apex_available: ["myapex"],
2374 min_sdk_version: "29",
2375 }
2376
2377 java_library {
2378 name: "libbar",
2379 sdk_version: "current",
2380 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002381 static_libs: [
2382 "libbar_dep",
2383 "libbar_import_dep",
2384 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002385 apex_available: ["myapex"],
2386 min_sdk_version: "29",
2387 }
2388
2389 java_library {
2390 name: "libbar_dep",
2391 sdk_version: "current",
2392 srcs: ["a.java"],
2393 apex_available: ["myapex"],
2394 min_sdk_version: "29",
2395 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002396
2397 java_import {
2398 name: "libbar_import_dep",
2399 jars: ["libbar.jar"],
2400 apex_available: ["myapex"],
2401 min_sdk_version: "29",
2402 }
Jooyung Han03b51852020-02-26 22:45:42 +09002403 `)
2404}
2405
Colin Cross8ca61c12022-10-06 21:00:14 -07002406func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2407 // Tests that an apex dependency with min_sdk_version higher than the
2408 // min_sdk_version of the apex is allowed as long as the dependency's
2409 // min_sdk_version is less than or equal to the api level that the
2410 // architecture was introduced in. In this case, arm64 didn't exist
2411 // until api level 21, so the arm64 code will never need to run on
2412 // an api level 20 device, even if other architectures of the apex
2413 // will.
2414 testApex(t, `
2415 apex {
2416 name: "myapex",
2417 key: "myapex.key",
2418 native_shared_libs: ["libfoo"],
2419 min_sdk_version: "20",
2420 }
2421
2422 apex_key {
2423 name: "myapex.key",
2424 public_key: "testkey.avbpubkey",
2425 private_key: "testkey.pem",
2426 }
2427
2428 cc_library {
2429 name: "libfoo",
2430 srcs: ["mylib.cpp"],
2431 apex_available: ["myapex"],
2432 min_sdk_version: "21",
2433 stl: "none",
2434 }
2435 `)
2436}
2437
Artur Satayev8cf899a2020-04-15 17:29:42 +01002438func TestJavaStableSdkVersion(t *testing.T) {
2439 testCases := []struct {
2440 name string
2441 expectedError string
2442 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002443 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002444 }{
2445 {
2446 name: "Non-updatable apex with non-stable dep",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002452 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
2468 name: "Updatable apex with stable dep",
2469 bp: `
2470 apex {
2471 name: "myapex",
2472 java_libs: ["myjar"],
2473 key: "myapex.key",
2474 updatable: true,
2475 min_sdk_version: "29",
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "current",
2486 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002487 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002488 }
2489 `,
2490 },
2491 {
2492 name: "Updatable apex with non-stable dep",
2493 expectedError: "cannot depend on \"myjar\"",
2494 bp: `
2495 apex {
2496 name: "myapex",
2497 java_libs: ["myjar"],
2498 key: "myapex.key",
2499 updatable: true,
2500 }
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506 java_library {
2507 name: "myjar",
2508 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002509 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 apex_available: ["myapex"],
2511 }
2512 `,
2513 },
2514 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002515 name: "Updatable apex with non-stable legacy core platform dep",
2516 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2517 bp: `
2518 apex {
2519 name: "myapex",
2520 java_libs: ["myjar-uses-legacy"],
2521 key: "myapex.key",
2522 updatable: true,
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 java_library {
2530 name: "myjar-uses-legacy",
2531 srcs: ["foo/bar/MyClass.java"],
2532 sdk_version: "core_platform",
2533 apex_available: ["myapex"],
2534 }
2535 `,
2536 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2537 },
2538 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002539 name: "Updatable apex with non-stable transitive dep",
2540 // This is not actually detecting that the transitive dependency is unstable, rather it is
2541 // detecting that the transitive dependency is building against a wider API surface than the
2542 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002543 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002544 bp: `
2545 apex {
2546 name: "myapex",
2547 java_libs: ["myjar"],
2548 key: "myapex.key",
2549 updatable: true,
2550 }
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556 java_library {
2557 name: "myjar",
2558 srcs: ["foo/bar/MyClass.java"],
2559 sdk_version: "current",
2560 apex_available: ["myapex"],
2561 static_libs: ["transitive-jar"],
2562 }
2563 java_library {
2564 name: "transitive-jar",
2565 srcs: ["foo/bar/MyClass.java"],
2566 sdk_version: "core_platform",
2567 apex_available: ["myapex"],
2568 }
2569 `,
2570 },
2571 }
2572
2573 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002574 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2575 continue
2576 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002577 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002578 errorHandler := android.FixtureExpectsNoErrors
2579 if test.expectedError != "" {
2580 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002581 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002582 android.GroupFixturePreparers(
2583 java.PrepareForTestWithJavaDefaultModules,
2584 PrepareForTestWithApexBuildComponents,
2585 prepareForTestWithMyapex,
2586 android.OptionalFixturePreparer(test.preparer),
2587 ).
2588 ExtendWithErrorHandler(errorHandler).
2589 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002590 })
2591 }
2592}
2593
Jooyung Han749dc692020-04-15 11:03:39 +09002594func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2595 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 native_shared_libs: ["mylib"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 cc_library {
2610 name: "mylib",
2611 srcs: ["mylib.cpp"],
2612 shared_libs: ["mylib2"],
2613 system_shared_libs: [],
2614 stl: "none",
2615 apex_available: [
2616 "myapex",
2617 ],
2618 min_sdk_version: "29",
2619 }
2620
2621 // indirect part of the apex
2622 cc_library {
2623 name: "mylib2",
2624 srcs: ["mylib.cpp"],
2625 system_shared_libs: [],
2626 stl: "none",
2627 apex_available: [
2628 "myapex",
2629 ],
2630 min_sdk_version: "30",
2631 }
2632 `)
2633}
2634
2635func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2636 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2637 apex {
2638 name: "myapex",
2639 key: "myapex.key",
2640 apps: ["AppFoo"],
2641 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002642 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002643 }
2644
2645 apex_key {
2646 name: "myapex.key",
2647 public_key: "testkey.avbpubkey",
2648 private_key: "testkey.pem",
2649 }
2650
2651 android_app {
2652 name: "AppFoo",
2653 srcs: ["foo/bar/MyClass.java"],
2654 sdk_version: "current",
2655 min_sdk_version: "29",
2656 system_modules: "none",
2657 stl: "none",
2658 static_libs: ["bar"],
2659 apex_available: [ "myapex" ],
2660 }
2661
2662 java_library {
2663 name: "bar",
2664 sdk_version: "current",
2665 srcs: ["a.java"],
2666 apex_available: [ "myapex" ],
2667 }
2668 `)
2669}
2670
2671func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002672 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002673 apex {
2674 name: "myapex",
2675 key: "myapex.key",
2676 native_shared_libs: ["mylib"],
2677 min_sdk_version: "29",
2678 }
2679
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002686 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002687 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2688 cc_library {
2689 name: "mylib",
2690 srcs: ["mylib.cpp"],
2691 shared_libs: ["mylib2"],
2692 system_shared_libs: [],
2693 stl: "none",
2694 apex_available: ["myapex", "otherapex"],
2695 min_sdk_version: "29",
2696 }
2697
2698 cc_library {
2699 name: "mylib2",
2700 srcs: ["mylib.cpp"],
2701 system_shared_libs: [],
2702 stl: "none",
2703 apex_available: ["otherapex"],
2704 stubs: { versions: ["29", "30"] },
2705 min_sdk_version: "30",
2706 }
2707
2708 apex {
2709 name: "otherapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["mylib", "mylib2"],
2712 min_sdk_version: "30",
2713 }
2714 `)
2715 expectLink := func(from, from_variant, to, to_variant string) {
2716 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2717 libFlags := ld.Args["libFlags"]
2718 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2719 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002720 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002721 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002722}
2723
Jooyung Haned124c32021-01-26 11:43:46 +09002724func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002725 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2726 func(variables android.FixtureProductVariables) {
2727 variables.Platform_sdk_codename = proptools.StringPtr("S")
2728 variables.Platform_version_active_codenames = []string{"S"}
2729 },
2730 )
Jooyung Haned124c32021-01-26 11:43:46 +09002731 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2732 apex {
2733 name: "myapex",
2734 key: "myapex.key",
2735 native_shared_libs: ["libfoo"],
2736 min_sdk_version: "S",
2737 }
2738 apex_key {
2739 name: "myapex.key",
2740 public_key: "testkey.avbpubkey",
2741 private_key: "testkey.pem",
2742 }
2743 cc_library {
2744 name: "libfoo",
2745 shared_libs: ["libbar"],
2746 apex_available: ["myapex"],
2747 min_sdk_version: "29",
2748 }
2749 cc_library {
2750 name: "libbar",
2751 apex_available: ["myapex"],
2752 }
2753 `, withSAsActiveCodeNames)
2754}
2755
2756func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002757 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2758 variables.Platform_sdk_codename = proptools.StringPtr("S")
2759 variables.Platform_version_active_codenames = []string{"S", "T"}
2760 })
Colin Cross1c460562021-02-16 17:55:47 -08002761 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002762 apex {
2763 name: "myapex",
2764 key: "myapex.key",
2765 native_shared_libs: ["libfoo"],
2766 min_sdk_version: "S",
2767 }
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773 cc_library {
2774 name: "libfoo",
2775 shared_libs: ["libbar"],
2776 apex_available: ["myapex"],
2777 min_sdk_version: "S",
2778 }
2779 cc_library {
2780 name: "libbar",
2781 stubs: {
2782 symbol_file: "libbar.map.txt",
2783 versions: ["30", "S", "T"],
2784 },
2785 }
2786 `, withSAsActiveCodeNames)
2787
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002789 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2790 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002791 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002792}
2793
Jiyong Park7c2ee712018-12-07 00:42:25 +09002794func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002795 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002796 apex {
2797 name: "myapex",
2798 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 native_shared_libs: ["mylib"],
2800 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002802 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002803 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002804 }
2805
2806 apex_key {
2807 name: "myapex.key",
2808 public_key: "testkey.avbpubkey",
2809 private_key: "testkey.pem",
2810 }
2811
2812 prebuilt_etc {
2813 name: "myetc",
2814 src: "myprebuilt",
2815 sub_dir: "foo/bar",
2816 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002817
2818 cc_library {
2819 name: "mylib",
2820 srcs: ["mylib.cpp"],
2821 relative_install_path: "foo/bar",
2822 system_shared_libs: [],
2823 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002824 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002825 }
2826
2827 cc_binary {
2828 name: "mybin",
2829 srcs: ["mylib.cpp"],
2830 relative_install_path: "foo/bar",
2831 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002832 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002833 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002834 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002835 `)
2836
Sundong Ahnabb64432019-10-22 13:58:29 +09002837 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002838 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002839
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002840 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002841 ensureContains(t, cmd, "/etc ")
2842 ensureContains(t, cmd, "/etc/foo ")
2843 ensureContains(t, cmd, "/etc/foo/bar ")
2844 ensureContains(t, cmd, "/lib64 ")
2845 ensureContains(t, cmd, "/lib64/foo ")
2846 ensureContains(t, cmd, "/lib64/foo/bar ")
2847 ensureContains(t, cmd, "/lib ")
2848 ensureContains(t, cmd, "/lib/foo ")
2849 ensureContains(t, cmd, "/lib/foo/bar ")
2850 ensureContains(t, cmd, "/bin ")
2851 ensureContains(t, cmd, "/bin/foo ")
2852 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002853}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002854
Jooyung Han35155c42020-02-06 17:33:20 +09002855func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002856 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002857 apex {
2858 name: "myapex",
2859 key: "myapex.key",
2860 multilib: {
2861 both: {
2862 native_shared_libs: ["mylib"],
2863 binaries: ["mybin"],
2864 },
2865 },
2866 compile_multilib: "both",
2867 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002868 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 relative_install_path: "foo/bar",
2880 system_shared_libs: [],
2881 stl: "none",
2882 apex_available: [ "myapex" ],
2883 native_bridge_supported: true,
2884 }
2885
2886 cc_binary {
2887 name: "mybin",
2888 relative_install_path: "foo/bar",
2889 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002890 stl: "none",
2891 apex_available: [ "myapex" ],
2892 native_bridge_supported: true,
2893 compile_multilib: "both", // default is "first" for binary
2894 multilib: {
2895 lib64: {
2896 suffix: "64",
2897 },
2898 },
2899 }
2900 `, withNativeBridgeEnabled)
2901 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2902 "bin/foo/bar/mybin",
2903 "bin/foo/bar/mybin64",
2904 "bin/arm/foo/bar/mybin",
2905 "bin/arm64/foo/bar/mybin64",
2906 "lib/foo/bar/mylib.so",
2907 "lib/arm/foo/bar/mylib.so",
2908 "lib64/foo/bar/mylib.so",
2909 "lib64/arm64/foo/bar/mylib.so",
2910 })
2911}
2912
Jooyung Han85d61762020-06-24 23:50:26 +09002913func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002914 result := android.GroupFixturePreparers(
2915 prepareForApexTest,
2916 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2917 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002918 apex {
2919 name: "myapex",
2920 key: "myapex.key",
2921 binaries: ["mybin"],
2922 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002923 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002924 }
2925 apex_key {
2926 name: "myapex.key",
2927 public_key: "testkey.avbpubkey",
2928 private_key: "testkey.pem",
2929 }
2930 cc_binary {
2931 name: "mybin",
2932 vendor: true,
2933 shared_libs: ["libfoo"],
2934 }
2935 cc_library {
2936 name: "libfoo",
2937 proprietary: true,
2938 }
2939 `)
2940
Colin Crossc68db4b2021-11-11 18:59:15 -08002941 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002942 "bin/mybin",
2943 "lib64/libfoo.so",
2944 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2945 "lib64/libc++.so",
2946 })
2947
Colin Crossc68db4b2021-11-11 18:59:15 -08002948 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2949 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002950 name := apexBundle.BaseModuleName()
2951 prefix := "TARGET_"
2952 var builder strings.Builder
2953 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002954 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002955 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002956 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002957
Colin Crossc68db4b2021-11-11 18:59:15 -08002958 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002959 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2960 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002961}
2962
Jooyung Hanc5a96762022-02-04 11:54:50 +09002963func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2964 testApexError(t, `Trying to include a VNDK library`, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2969 vendor: true,
2970 use_vndk_as_stable: true,
2971 updatable: false,
2972 }
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }`)
2978}
2979
Jooyung Handf78e212020-07-22 15:54:47 +09002980func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002981 // myapex myapex2
2982 // | |
2983 // mybin ------. mybin2
2984 // \ \ / |
2985 // (stable) .---\--------` |
2986 // \ / \ |
2987 // \ / \ /
2988 // libvndk libvendor
2989 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002990 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002991 apex {
2992 name: "myapex",
2993 key: "myapex.key",
2994 binaries: ["mybin"],
2995 vendor: true,
2996 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002997 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002998 }
2999 apex_key {
3000 name: "myapex.key",
3001 public_key: "testkey.avbpubkey",
3002 private_key: "testkey.pem",
3003 }
3004 cc_binary {
3005 name: "mybin",
3006 vendor: true,
3007 shared_libs: ["libvndk", "libvendor"],
3008 }
3009 cc_library {
3010 name: "libvndk",
3011 vndk: {
3012 enabled: true,
3013 },
3014 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003015 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003016 }
3017 cc_library {
3018 name: "libvendor",
3019 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003020 stl: "none",
3021 }
3022 apex {
3023 name: "myapex2",
3024 key: "myapex.key",
3025 binaries: ["mybin2"],
3026 vendor: true,
3027 use_vndk_as_stable: false,
3028 updatable: false,
3029 }
3030 cc_binary {
3031 name: "mybin2",
3032 vendor: true,
3033 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003034 }
3035 `)
3036
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003037 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003038
Jooyung Han91f92032022-02-04 12:36:33 +09003039 for _, tc := range []struct {
3040 name string
3041 apexName string
3042 moduleName string
3043 moduleVariant string
3044 libs []string
3045 contents []string
3046 requireVndkNamespace bool
3047 }{
3048 {
3049 name: "use_vndk_as_stable",
3050 apexName: "myapex",
3051 moduleName: "mybin",
3052 moduleVariant: vendorVariant + "_apex10000",
3053 libs: []string{
3054 // should link with vendor variants of VNDK libs(libvndk/libc++)
3055 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3056 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3057 // unstable Vendor libs as APEX variant
3058 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3059 },
3060 contents: []string{
3061 "bin/mybin",
3062 "lib64/libvendor.so",
3063 // VNDK libs (libvndk/libc++) are not included
3064 },
3065 requireVndkNamespace: true,
3066 },
3067 {
3068 name: "!use_vndk_as_stable",
3069 apexName: "myapex2",
3070 moduleName: "mybin2",
3071 moduleVariant: vendorVariant + "_myapex2",
3072 libs: []string{
3073 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3074 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3075 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3076 // unstable vendor libs have "merged" APEX variants
3077 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3078 },
3079 contents: []string{
3080 "bin/mybin2",
3081 "lib64/libvendor.so",
3082 // VNDK libs are included as well
3083 "lib64/libvndk.so",
3084 "lib64/libc++.so",
3085 },
3086 requireVndkNamespace: false,
3087 },
3088 } {
3089 t.Run(tc.name, func(t *testing.T) {
3090 // Check linked libs
3091 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3092 libs := names(ldRule.Args["libFlags"])
3093 for _, lib := range tc.libs {
3094 ensureListContains(t, libs, lib)
3095 }
3096 // Check apex contents
3097 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003098
Jooyung Han91f92032022-02-04 12:36:33 +09003099 // Check "requireNativeLibs"
3100 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3101 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3102 if tc.requireVndkNamespace {
3103 ensureListContains(t, requireNativeLibs, ":vndk")
3104 } else {
3105 ensureListNotContains(t, requireNativeLibs, ":vndk")
3106 }
3107 })
3108 }
Jooyung Handf78e212020-07-22 15:54:47 +09003109}
3110
Justin Yun13decfb2021-03-08 19:25:55 +09003111func TestProductVariant(t *testing.T) {
3112 ctx := testApex(t, `
3113 apex {
3114 name: "myapex",
3115 key: "myapex.key",
3116 updatable: false,
3117 product_specific: true,
3118 binaries: ["foo"],
3119 }
3120
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }
3126
3127 cc_binary {
3128 name: "foo",
3129 product_available: true,
3130 apex_available: ["myapex"],
3131 srcs: ["foo.cpp"],
3132 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003133 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3134 variables.ProductVndkVersion = proptools.StringPtr("current")
3135 }),
3136 )
Justin Yun13decfb2021-03-08 19:25:55 +09003137
3138 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003139 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003140 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3141 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3142 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3143 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3144}
3145
Jooyung Han8e5685d2020-09-21 11:02:57 +09003146func TestApex_withPrebuiltFirmware(t *testing.T) {
3147 testCases := []struct {
3148 name string
3149 additionalProp string
3150 }{
3151 {"system apex with prebuilt_firmware", ""},
3152 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3153 }
3154 for _, tc := range testCases {
3155 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003156 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003157 apex {
3158 name: "myapex",
3159 key: "myapex.key",
3160 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003161 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003162 `+tc.additionalProp+`
3163 }
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169 prebuilt_firmware {
3170 name: "myfirmware",
3171 src: "myfirmware.bin",
3172 filename_from_src: true,
3173 `+tc.additionalProp+`
3174 }
3175 `)
3176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3177 "etc/firmware/myfirmware.bin",
3178 })
3179 })
3180 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003181}
3182
Jooyung Hanefb184e2020-06-25 17:14:25 +09003183func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003184 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003185 apex {
3186 name: "myapex",
3187 key: "myapex.key",
3188 vendor: true,
3189 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003190 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003191 }
3192
3193 apex_key {
3194 name: "myapex.key",
3195 public_key: "testkey.avbpubkey",
3196 private_key: "testkey.pem",
3197 }
3198
3199 cc_library {
3200 name: "mylib",
3201 vendor_available: true,
3202 }
3203 `)
3204
3205 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003206 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003207 name := apexBundle.BaseModuleName()
3208 prefix := "TARGET_"
3209 var builder strings.Builder
3210 data.Custom(&builder, name, prefix, "", data)
3211 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003212 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003213}
3214
Jooyung Han2ed99d02020-06-24 23:26:26 +09003215func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003216 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003217 apex {
3218 name: "myapex",
3219 key: "myapex.key",
3220 vintf_fragments: ["fragment.xml"],
3221 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003222 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003223 }
3224 apex_key {
3225 name: "myapex.key",
3226 public_key: "testkey.avbpubkey",
3227 private_key: "testkey.pem",
3228 }
3229 cc_binary {
3230 name: "mybin",
3231 }
3232 `)
3233
3234 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003235 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003236 name := apexBundle.BaseModuleName()
3237 prefix := "TARGET_"
3238 var builder strings.Builder
3239 data.Custom(&builder, name, prefix, "", data)
3240 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003241 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003242 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003243}
3244
Jiyong Park16e91a02018-12-20 18:18:08 +09003245func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003247 apex {
3248 name: "myapex",
3249 key: "myapex.key",
3250 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003251 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003252 }
3253
3254 apex_key {
3255 name: "myapex.key",
3256 public_key: "testkey.avbpubkey",
3257 private_key: "testkey.pem",
3258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
3265 stubs: {
3266 versions: ["1", "2", "3"],
3267 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003268 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003269 }
3270
3271 cc_binary {
3272 name: "not_in_apex",
3273 srcs: ["mylib.cpp"],
3274 static_libs: ["mylib"],
3275 static_executable: true,
3276 system_shared_libs: [],
3277 stl: "none",
3278 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003279 `)
3280
Colin Cross7113d202019-11-20 16:39:12 -08003281 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003282
3283 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003284 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003285}
Jiyong Park9335a262018-12-24 11:31:58 +09003286
3287func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003288 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003289 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003290 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003291 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003292 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003293 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003294 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297
3298 cc_library {
3299 name: "mylib",
3300 srcs: ["mylib.cpp"],
3301 system_shared_libs: [],
3302 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003303 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003304 }
3305
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003312 android_app_certificate {
3313 name: "myapex.certificate",
3314 certificate: "testkey",
3315 }
3316
3317 android_app_certificate {
3318 name: "myapex.certificate.override",
3319 certificate: "testkey.override",
3320 }
3321
Jiyong Park9335a262018-12-24 11:31:58 +09003322 `)
3323
3324 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003325 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003326
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003327 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3328 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003329 "vendor/foo/devkeys/testkey.avbpubkey")
3330 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003331 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3332 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003333 "vendor/foo/devkeys/testkey.pem")
3334 }
3335
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003336 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003337 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003338 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003339 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003340 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003341 }
3342}
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Jooyung Hanf121a652019-12-17 14:30:11 +09003344func TestCertificate(t *testing.T) {
3345 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 }
3352 apex_key {
3353 name: "myapex.key",
3354 public_key: "testkey.avbpubkey",
3355 private_key: "testkey.pem",
3356 }`)
3357 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3358 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3359 if actual := rule.Args["certificates"]; actual != expected {
3360 t.Errorf("certificates should be %q, not %q", expected, actual)
3361 }
3362 })
3363 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003364 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003365 apex {
3366 name: "myapex_keytest",
3367 key: "myapex.key",
3368 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003369 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 }
3371 apex_key {
3372 name: "myapex.key",
3373 public_key: "testkey.avbpubkey",
3374 private_key: "testkey.pem",
3375 }
3376 android_app_certificate {
3377 name: "myapex.certificate.override",
3378 certificate: "testkey.override",
3379 }`)
3380 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3381 expected := "testkey.override.x509.pem testkey.override.pk8"
3382 if actual := rule.Args["certificates"]; actual != expected {
3383 t.Errorf("certificates should be %q, not %q", expected, actual)
3384 }
3385 })
3386 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003387 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003388 apex {
3389 name: "myapex",
3390 key: "myapex.key",
3391 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003392 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 }
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }
3399 android_app_certificate {
3400 name: "myapex.certificate",
3401 certificate: "testkey",
3402 }`)
3403 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3404 expected := "testkey.x509.pem testkey.pk8"
3405 if actual := rule.Args["certificates"]; actual != expected {
3406 t.Errorf("certificates should be %q, not %q", expected, actual)
3407 }
3408 })
3409 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003410 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 apex {
3412 name: "myapex_keytest",
3413 key: "myapex.key",
3414 file_contexts: ":myapex-file_contexts",
3415 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 android_app_certificate {
3424 name: "myapex.certificate.override",
3425 certificate: "testkey.override",
3426 }`)
3427 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3428 expected := "testkey.override.x509.pem testkey.override.pk8"
3429 if actual := rule.Args["certificates"]; actual != expected {
3430 t.Errorf("certificates should be %q, not %q", expected, actual)
3431 }
3432 })
3433 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
3438 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003439 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003440 }
3441 apex_key {
3442 name: "myapex.key",
3443 public_key: "testkey.avbpubkey",
3444 private_key: "testkey.pem",
3445 }`)
3446 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3447 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003453 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003454 apex {
3455 name: "myapex_keytest",
3456 key: "myapex.key",
3457 file_contexts: ":myapex-file_contexts",
3458 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003459 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003460 }
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466 android_app_certificate {
3467 name: "myapex.certificate.override",
3468 certificate: "testkey.override",
3469 }`)
3470 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3471 expected := "testkey.override.x509.pem testkey.override.pk8"
3472 if actual := rule.Args["certificates"]; actual != expected {
3473 t.Errorf("certificates should be %q, not %q", expected, actual)
3474 }
3475 })
3476}
3477
Jiyong Park58e364a2019-01-19 19:24:06 +09003478func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003479 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003480 apex {
3481 name: "myapex",
3482 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003483 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003485 }
3486
3487 apex {
3488 name: "otherapex",
3489 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003490 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003491 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003492 }
3493
3494 apex_key {
3495 name: "myapex.key",
3496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_library {
3501 name: "mylib",
3502 srcs: ["mylib.cpp"],
3503 system_shared_libs: [],
3504 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003505 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003506 "myapex",
3507 "otherapex",
3508 ],
Jooyung Han24282772020-03-21 23:20:55 +09003509 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003510 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003511 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003512 cc_library {
3513 name: "mylib2",
3514 srcs: ["mylib.cpp"],
3515 system_shared_libs: [],
3516 stl: "none",
3517 apex_available: [
3518 "myapex",
3519 "otherapex",
3520 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003521 static_libs: ["mylib3"],
3522 recovery_available: true,
3523 min_sdk_version: "29",
3524 }
3525 cc_library {
3526 name: "mylib3",
3527 srcs: ["mylib.cpp"],
3528 system_shared_libs: [],
3529 stl: "none",
3530 apex_available: [
3531 "myapex",
3532 "otherapex",
3533 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003534 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003535 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003536 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003537 `)
3538
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003540 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003541 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542
Vinh Tranf9754732023-01-19 22:41:46 -05003543 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003544 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003545 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003546
Vinh Tranf9754732023-01-19 22:41:46 -05003547 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003548 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003549 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003550
Colin Crossaede88c2020-08-11 12:17:01 -07003551 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3552 // each variant defines additional macros to distinguish which apex variant it is built for
3553
3554 // non-APEX variant does not have __ANDROID_APEX__ defined
3555 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3556 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3557
Vinh Tranf9754732023-01-19 22:41:46 -05003558 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003559 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3560 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003561
Jooyung Hanc87a0592020-03-02 17:44:33 +09003562 // non-APEX variant does not have __ANDROID_APEX__ defined
3563 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3564 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3565
Vinh Tranf9754732023-01-19 22:41:46 -05003566 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003567 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003568 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003569}
Jiyong Park7e636d02019-01-28 16:16:54 +09003570
3571func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003573 apex {
3574 name: "myapex",
3575 key: "myapex.key",
3576 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003577 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003578 }
3579
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585
3586 cc_library_headers {
3587 name: "mylib_headers",
3588 export_include_dirs: ["my_include"],
3589 system_shared_libs: [],
3590 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003591 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003592 }
3593
3594 cc_library {
3595 name: "mylib",
3596 srcs: ["mylib.cpp"],
3597 system_shared_libs: [],
3598 stl: "none",
3599 header_libs: ["mylib_headers"],
3600 export_header_lib_headers: ["mylib_headers"],
3601 stubs: {
3602 versions: ["1", "2", "3"],
3603 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003604 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003605 }
3606
3607 cc_library {
3608 name: "otherlib",
3609 srcs: ["mylib.cpp"],
3610 system_shared_libs: [],
3611 stl: "none",
3612 shared_libs: ["mylib"],
3613 }
3614 `)
3615
Colin Cross7113d202019-11-20 16:39:12 -08003616 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003617
3618 // Ensure that the include path of the header lib is exported to 'otherlib'
3619 ensureContains(t, cFlags, "-Imy_include")
3620}
Alex Light9670d332019-01-29 18:07:33 -08003621
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622type fileInApex struct {
3623 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003624 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 isLink bool
3626}
3627
Jooyung Han1724d582022-12-21 10:17:44 +09003628func (f fileInApex) String() string {
3629 return f.src + ":" + f.path
3630}
3631
3632func (f fileInApex) match(expectation string) bool {
3633 parts := strings.Split(expectation, ":")
3634 if len(parts) == 1 {
3635 match, _ := path.Match(parts[0], f.path)
3636 return match
3637 }
3638 if len(parts) == 2 {
3639 matchSrc, _ := path.Match(parts[0], f.src)
3640 matchDst, _ := path.Match(parts[1], f.path)
3641 return matchSrc && matchDst
3642 }
3643 panic("invalid expected file specification: " + expectation)
3644}
3645
Jooyung Hana57af4a2020-01-23 05:36:59 +00003646func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003648 module := ctx.ModuleForTests(moduleName, variant)
3649 apexRule := module.MaybeRule("apexRule")
3650 apexDir := "/image.apex/"
3651 if apexRule.Rule == nil {
3652 apexRule = module.Rule("zipApexRule")
3653 apexDir = "/image.zipapex/"
3654 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003655 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003657 for _, cmd := range strings.Split(copyCmds, "&&") {
3658 cmd = strings.TrimSpace(cmd)
3659 if cmd == "" {
3660 continue
3661 }
3662 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003663 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003664 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003665 switch terms[0] {
3666 case "mkdir":
3667 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 t.Fatal("copyCmds contains invalid cp command", cmd)
3670 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003671 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003672 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003673 isLink = false
3674 case "ln":
3675 if len(terms) != 3 && len(terms) != 4 {
3676 // ln LINK TARGET or ln -s LINK TARGET
3677 t.Fatal("copyCmds contains invalid ln command", cmd)
3678 }
3679 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003680 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003681 isLink = true
3682 default:
3683 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3684 }
3685 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003686 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003687 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003688 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 }
Jooyung Han1724d582022-12-21 10:17:44 +09003690 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003691 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003692 }
3693 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003694 return ret
3695}
3696
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003697func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003698 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 var failed bool
3700 var surplus []string
3701 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003702 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003703 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003704 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003705 if file.match(expected) {
3706 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003707 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003708 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003709 }
3710 }
Jooyung Han1724d582022-12-21 10:17:44 +09003711 if !matchFound {
3712 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003713 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003714 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003717 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003718 t.Log("surplus files", surplus)
3719 failed = true
3720 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003721
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003722 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003723 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003724 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003725 if !filesMatched[expected] {
3726 missing = append(missing, expected)
3727 }
3728 }
3729 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 t.Log("missing files", missing)
3731 failed = true
3732 }
3733 if failed {
3734 t.Fail()
3735 }
3736}
3737
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003738func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3739 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3740}
3741
3742func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3743 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3744 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3745 if deapexer.Output != nil {
3746 outputs = append(outputs, deapexer.Output.String())
3747 }
3748 for _, output := range deapexer.ImplicitOutputs {
3749 outputs = append(outputs, output.String())
3750 }
3751 actualFiles := make([]fileInApex, 0, len(outputs))
3752 for _, output := range outputs {
3753 dir := "/deapexer/"
3754 pos := strings.LastIndex(output, dir)
3755 if pos == -1 {
3756 t.Fatal("Unknown deapexer output ", output)
3757 }
3758 path := output[pos+len(dir):]
3759 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3760 }
3761 assertFileListEquals(t, files, actualFiles)
3762}
3763
Jooyung Han344d5432019-08-23 11:17:39 +09003764func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003765 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003766 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003767 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003768 "etc/llndk.libraries.29.txt",
3769 "etc/vndkcore.libraries.29.txt",
3770 "etc/vndksp.libraries.29.txt",
3771 "etc/vndkprivate.libraries.29.txt",
3772 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003773 }
3774 testCases := []struct {
3775 vndkVersion string
3776 expectedFiles []string
3777 }{
3778 {
3779 vndkVersion: "current",
3780 expectedFiles: append(commonFiles,
3781 "lib/libvndk.so",
3782 "lib/libvndksp.so",
3783 "lib64/libvndk.so",
3784 "lib64/libvndksp.so"),
3785 },
3786 {
3787 vndkVersion: "",
3788 expectedFiles: append(commonFiles,
3789 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3790 "lib/libvndksp.so",
3791 "lib64/libvndksp.so"),
3792 },
3793 }
3794 for _, tc := range testCases {
3795 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3796 ctx := testApex(t, `
3797 apex_vndk {
3798 name: "com.android.vndk.current",
3799 key: "com.android.vndk.current.key",
3800 updatable: false,
3801 }
3802
3803 apex_key {
3804 name: "com.android.vndk.current.key",
3805 public_key: "testkey.avbpubkey",
3806 private_key: "testkey.pem",
3807 }
3808
3809 cc_library {
3810 name: "libvndk",
3811 srcs: ["mylib.cpp"],
3812 vendor_available: true,
3813 product_available: true,
3814 vndk: {
3815 enabled: true,
3816 },
3817 system_shared_libs: [],
3818 stl: "none",
3819 apex_available: [ "com.android.vndk.current" ],
3820 }
3821
3822 cc_library {
3823 name: "libvndksp",
3824 srcs: ["mylib.cpp"],
3825 vendor_available: true,
3826 product_available: true,
3827 vndk: {
3828 enabled: true,
3829 support_system_process: true,
3830 },
3831 system_shared_libs: [],
3832 stl: "none",
3833 apex_available: [ "com.android.vndk.current" ],
3834 }
3835
3836 // VNDK-Ext should not cause any problems
3837
3838 cc_library {
3839 name: "libvndk.ext",
3840 srcs: ["mylib2.cpp"],
3841 vendor: true,
3842 vndk: {
3843 enabled: true,
3844 extends: "libvndk",
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
3848 }
3849
3850 cc_library {
3851 name: "libvndksp.ext",
3852 srcs: ["mylib2.cpp"],
3853 vendor: true,
3854 vndk: {
3855 enabled: true,
3856 support_system_process: true,
3857 extends: "libvndksp",
3858 },
3859 system_shared_libs: [],
3860 stl: "none",
3861 }
3862 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3863 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3864 }))
3865 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3866 })
3867 }
Jooyung Han344d5432019-08-23 11:17:39 +09003868}
3869
3870func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003871 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003872 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003873 name: "com.android.vndk.current",
3874 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003875 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003876 }
3877
3878 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003879 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003880 public_key: "testkey.avbpubkey",
3881 private_key: "testkey.pem",
3882 }
3883
3884 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003885 name: "libvndk",
3886 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003887 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003888 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003889 vndk: {
3890 enabled: true,
3891 },
3892 system_shared_libs: [],
3893 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003894 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003895 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003896
3897 cc_prebuilt_library_shared {
3898 name: "libvndk.arm",
3899 srcs: ["libvndk.arm.so"],
3900 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003901 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 vndk: {
3903 enabled: true,
3904 },
3905 enabled: false,
3906 arch: {
3907 arm: {
3908 enabled: true,
3909 },
3910 },
3911 system_shared_libs: [],
3912 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003913 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 `+vndkLibrariesTxtFiles("current"),
3916 withFiles(map[string][]byte{
3917 "libvndk.so": nil,
3918 "libvndk.arm.so": nil,
3919 }))
Colin Cross2807f002021-03-02 10:15:29 -08003920 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003921 "lib/libvndk.so",
3922 "lib/libvndk.arm.so",
3923 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003924 "lib/libc++.so",
3925 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003927 })
Jooyung Han344d5432019-08-23 11:17:39 +09003928}
3929
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930func vndkLibrariesTxtFiles(vers ...string) (result string) {
3931 for _, v := range vers {
3932 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003933 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003934 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003935 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003936 name: "` + txt + `.libraries.txt",
3937 }
3938 `
3939 }
3940 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003941 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003942 result += `
3943 prebuilt_etc {
3944 name: "` + txt + `.libraries.` + v + `.txt",
3945 src: "dummy.txt",
3946 }
3947 `
3948 }
3949 }
3950 }
3951 return
3952}
3953
Jooyung Han344d5432019-08-23 11:17:39 +09003954func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003955 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003956 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003957 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003958 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003959 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003961 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 }
3963
3964 apex_key {
3965 name: "myapex.key",
3966 public_key: "testkey.avbpubkey",
3967 private_key: "testkey.pem",
3968 }
3969
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 vndk_prebuilt_shared {
3971 name: "libvndk27",
3972 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003973 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003974 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003975 vndk: {
3976 enabled: true,
3977 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003978 target_arch: "arm64",
3979 arch: {
3980 arm: {
3981 srcs: ["libvndk27_arm.so"],
3982 },
3983 arm64: {
3984 srcs: ["libvndk27_arm64.so"],
3985 },
3986 },
Colin Cross2807f002021-03-02 10:15:29 -08003987 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003988 }
3989
3990 vndk_prebuilt_shared {
3991 name: "libvndk27",
3992 version: "27",
3993 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003994 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003995 vndk: {
3996 enabled: true,
3997 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003998 target_arch: "x86_64",
3999 arch: {
4000 x86: {
4001 srcs: ["libvndk27_x86.so"],
4002 },
4003 x86_64: {
4004 srcs: ["libvndk27_x86_64.so"],
4005 },
4006 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 }
4008 `+vndkLibrariesTxtFiles("27"),
4009 withFiles(map[string][]byte{
4010 "libvndk27_arm.so": nil,
4011 "libvndk27_arm64.so": nil,
4012 "libvndk27_x86.so": nil,
4013 "libvndk27_x86_64.so": nil,
4014 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004015
Colin Cross2807f002021-03-02 10:15:29 -08004016 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 "lib/libvndk27_arm.so",
4018 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004019 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 })
Jooyung Han344d5432019-08-23 11:17:39 +09004021}
4022
Jooyung Han90eee022019-10-01 20:02:42 +09004023func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004024 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004025 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004026 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004027 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004028 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004029 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004030 }
4031 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004032 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004033 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004034 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004035 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004036 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038 apex_key {
4039 name: "myapex.key",
4040 public_key: "testkey.avbpubkey",
4041 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004042 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004043
4044 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004045 module := ctx.ModuleForTests(moduleName, "android_common_image")
4046 apexManifestRule := module.Rule("apexManifestRule")
4047 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004048 }
4049
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004050 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004051 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004052}
4053
Jooyung Han344d5432019-08-23 11:17:39 +09004054func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004056 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004057 name: "com.android.vndk.current",
4058 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004059 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004061 }
4062
4063 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004064 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
4068
4069 cc_library {
4070 name: "libvndk",
4071 srcs: ["mylib.cpp"],
4072 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004073 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004074 native_bridge_supported: true,
4075 host_supported: true,
4076 vndk: {
4077 enabled: true,
4078 },
4079 system_shared_libs: [],
4080 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004081 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004082 }
Colin Cross2807f002021-03-02 10:15:29 -08004083 `+vndkLibrariesTxtFiles("current"),
4084 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004085
Colin Cross2807f002021-03-02 10:15:29 -08004086 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 "lib/libvndk.so",
4088 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004089 "lib/libc++.so",
4090 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004091 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004092 })
Jooyung Han344d5432019-08-23 11:17:39 +09004093}
4094
4095func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004096 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004097 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004098 name: "com.android.vndk.current",
4099 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004100 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004101 native_bridge_supported: true,
4102 }
4103
4104 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004105 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004106 public_key: "testkey.avbpubkey",
4107 private_key: "testkey.pem",
4108 }
4109
4110 cc_library {
4111 name: "libvndk",
4112 srcs: ["mylib.cpp"],
4113 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004114 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004115 native_bridge_supported: true,
4116 host_supported: true,
4117 vndk: {
4118 enabled: true,
4119 },
4120 system_shared_libs: [],
4121 stl: "none",
4122 }
4123 `)
4124}
4125
Jooyung Han31c470b2019-10-18 16:26:59 +09004126func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004127 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004129 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004131 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004133 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 vndk_prebuilt_shared {
4143 name: "libvndk27",
4144 version: "27",
4145 target_arch: "arm",
4146 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004147 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 vndk: {
4149 enabled: true,
4150 },
4151 arch: {
4152 arm: {
4153 srcs: ["libvndk27.so"],
4154 }
4155 },
4156 }
4157
4158 vndk_prebuilt_shared {
4159 name: "libvndk27",
4160 version: "27",
4161 target_arch: "arm",
4162 binder32bit: true,
4163 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004164 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004165 vndk: {
4166 enabled: true,
4167 },
4168 arch: {
4169 arm: {
4170 srcs: ["libvndk27binder32.so"],
4171 }
4172 },
Colin Cross2807f002021-03-02 10:15:29 -08004173 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004174 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004175 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004176 withFiles(map[string][]byte{
4177 "libvndk27.so": nil,
4178 "libvndk27binder32.so": nil,
4179 }),
4180 withBinder32bit,
4181 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004182 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004183 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4184 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004185 },
4186 }),
4187 )
4188
Colin Cross2807f002021-03-02 10:15:29 -08004189 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004190 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004191 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004192 })
4193}
4194
Jooyung Han45a96772020-06-15 14:59:42 +09004195func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004196 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004197 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004198 name: "com.android.vndk.current",
4199 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004200 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004201 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004202 }
4203
4204 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004205 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004206 public_key: "testkey.avbpubkey",
4207 private_key: "testkey.pem",
4208 }
4209
4210 cc_library {
4211 name: "libz",
4212 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004213 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004214 vndk: {
4215 enabled: true,
4216 },
4217 stubs: {
4218 symbol_file: "libz.map.txt",
4219 versions: ["30"],
4220 }
4221 }
4222 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4223 "libz.map.txt": nil,
4224 }))
4225
Colin Cross2807f002021-03-02 10:15:29 -08004226 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004227 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4228 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004229 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4230 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4231 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4232 "*/*",
4233 })
Jooyung Han45a96772020-06-15 14:59:42 +09004234}
4235
Jooyung Hane3f02812023-05-08 13:54:50 +09004236func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4237 ctx := testApex(t, "",
4238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4239 variables.DeviceVndkVersion = proptools.StringPtr("27")
4240 }),
4241 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4242 cc.RegisterVendorSnapshotModules(ctx)
4243 }),
4244 withFiles(map[string][]byte{
4245 "vendor/foo/Android.bp": []byte(`
4246 apex {
4247 name: "myapex",
4248 binaries: ["foo"],
4249 key: "myapex.key",
4250 min_sdk_version: "27",
4251 vendor: true,
4252 }
4253
4254 cc_binary {
4255 name: "foo",
4256 vendor: true,
4257 srcs: ["abc.cpp"],
4258 shared_libs: [
4259 "libllndk",
4260 "libvndk",
4261 ],
4262 nocrt: true,
4263 system_shared_libs: [],
4264 min_sdk_version: "27",
4265 }
4266
4267 apex_key {
4268 name: "myapex.key",
4269 public_key: "testkey.avbpubkey",
4270 private_key: "testkey.pem",
4271 }
4272 `),
4273 // Simulate VNDK prebuilts with vendor_snapshot
4274 "prebuilts/vndk/Android.bp": []byte(`
4275 vndk_prebuilt_shared {
4276 name: "libllndk",
4277 version: "27",
4278 vendor_available: true,
4279 product_available: true,
4280 target_arch: "arm64",
4281 arch: {
4282 arm64: {
4283 srcs: ["libllndk.so"],
4284 },
4285 },
4286 }
4287
4288 vndk_prebuilt_shared {
4289 name: "libvndk",
4290 version: "27",
4291 vendor_available: true,
4292 product_available: true,
4293 target_arch: "arm64",
4294 arch: {
4295 arm64: {
4296 srcs: ["libvndk.so"],
4297 },
4298 },
4299 vndk: {
4300 enabled: true,
4301 },
4302 min_sdk_version: "27",
4303 }
4304
4305 vndk_prebuilt_shared {
4306 name: "libc++",
4307 version: "27",
4308 target_arch: "arm64",
4309 vendor_available: true,
4310 product_available: true,
4311 vndk: {
4312 enabled: true,
4313 support_system_process: true,
4314 },
4315 arch: {
4316 arm64: {
4317 srcs: ["libc++.so"],
4318 },
4319 },
4320 min_sdk_version: "apex_inherit",
4321 }
4322
4323 vendor_snapshot {
4324 name: "vendor_snapshot",
4325 version: "27",
4326 arch: {
4327 arm64: {
4328 vndk_libs: [
4329 "libc++",
4330 "libllndk",
4331 "libvndk",
4332 ],
4333 static_libs: [
4334 "libc++demangle",
4335 "libclang_rt.builtins",
4336 "libunwind",
4337 ],
4338 },
4339 }
4340 }
4341
4342 vendor_snapshot_static {
4343 name: "libclang_rt.builtins",
4344 version: "27",
4345 target_arch: "arm64",
4346 vendor: true,
4347 arch: {
4348 arm64: {
4349 src: "libclang_rt.builtins-aarch64-android.a",
4350 },
4351 },
4352 }
4353
4354 vendor_snapshot_static {
4355 name: "libc++demangle",
4356 version: "27",
4357 target_arch: "arm64",
4358 compile_multilib: "64",
4359 vendor: true,
4360 arch: {
4361 arm64: {
4362 src: "libc++demangle.a",
4363 },
4364 },
4365 min_sdk_version: "apex_inherit",
4366 }
4367
4368 vendor_snapshot_static {
4369 name: "libunwind",
4370 version: "27",
4371 target_arch: "arm64",
4372 compile_multilib: "64",
4373 vendor: true,
4374 arch: {
4375 arm64: {
4376 src: "libunwind.a",
4377 },
4378 },
4379 min_sdk_version: "apex_inherit",
4380 }
4381 `),
4382 }))
4383
4384 // Should embed the prebuilt VNDK libraries in the apex
4385 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4386 "bin/foo",
4387 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4388 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4389 })
4390
4391 // Should link foo with prebuilt libraries (shared/static)
4392 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4393 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4394 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4395 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4396 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4397
4398 // Should declare the LLNDK library as a "required" external dependency
4399 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4400 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4401 ensureListContains(t, requireNativeLibs, "libllndk.so")
4402}
4403
Jooyung Hane1633032019-08-01 17:41:43 +09004404func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004405 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004406 apex {
4407 name: "myapex_nodep",
4408 key: "myapex.key",
4409 native_shared_libs: ["lib_nodep"],
4410 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004411 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004412 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004413 }
4414
4415 apex {
4416 name: "myapex_dep",
4417 key: "myapex.key",
4418 native_shared_libs: ["lib_dep"],
4419 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004420 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004421 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 apex {
4425 name: "myapex_provider",
4426 key: "myapex.key",
4427 native_shared_libs: ["libfoo"],
4428 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004429 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004430 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004431 }
4432
4433 apex {
4434 name: "myapex_selfcontained",
4435 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004436 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004439 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004440 }
4441
4442 apex_key {
4443 name: "myapex.key",
4444 public_key: "testkey.avbpubkey",
4445 private_key: "testkey.pem",
4446 }
4447
4448 cc_library {
4449 name: "lib_nodep",
4450 srcs: ["mylib.cpp"],
4451 system_shared_libs: [],
4452 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004453 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004454 }
4455
4456 cc_library {
4457 name: "lib_dep",
4458 srcs: ["mylib.cpp"],
4459 shared_libs: ["libfoo"],
4460 system_shared_libs: [],
4461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004462 apex_available: [
4463 "myapex_dep",
4464 "myapex_provider",
4465 "myapex_selfcontained",
4466 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004467 }
4468
4469 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004470 name: "lib_dep_on_bar",
4471 srcs: ["mylib.cpp"],
4472 shared_libs: ["libbar"],
4473 system_shared_libs: [],
4474 stl: "none",
4475 apex_available: [
4476 "myapex_selfcontained",
4477 ],
4478 }
4479
4480
4481 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004482 name: "libfoo",
4483 srcs: ["mytest.cpp"],
4484 stubs: {
4485 versions: ["1"],
4486 },
4487 system_shared_libs: [],
4488 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004489 apex_available: [
4490 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004491 ],
4492 }
4493
4494 cc_library {
4495 name: "libbar",
4496 srcs: ["mytest.cpp"],
4497 stubs: {
4498 versions: ["1"],
4499 },
4500 system_shared_libs: [],
4501 stl: "none",
4502 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004503 "myapex_selfcontained",
4504 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004505 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004506
Jooyung Hane1633032019-08-01 17:41:43 +09004507 `)
4508
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004509 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004510 var provideNativeLibs, requireNativeLibs []string
4511
Sundong Ahnabb64432019-10-22 13:58:29 +09004512 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004513 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4514 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, provideNativeLibs)
4516 ensureListEmpty(t, requireNativeLibs)
4517
Sundong Ahnabb64432019-10-22 13:58:29 +09004518 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004519 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4520 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004521 ensureListEmpty(t, provideNativeLibs)
4522 ensureListContains(t, requireNativeLibs, "libfoo.so")
4523
Sundong Ahnabb64432019-10-22 13:58:29 +09004524 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004525 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4526 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004527 ensureListContains(t, provideNativeLibs, "libfoo.so")
4528 ensureListEmpty(t, requireNativeLibs)
4529
Sundong Ahnabb64432019-10-22 13:58:29 +09004530 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004531 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4532 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004533 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004534 ensureListEmpty(t, requireNativeLibs)
4535}
4536
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004537func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4538 ctx := testApex(t, `
4539 apex {
4540 name: "myapex",
4541 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004542 native_shared_libs: ["mylib"],
4543 updatable: false,
4544 }
4545
4546 apex_key {
4547 name: "myapex.key",
4548 public_key: "testkey.avbpubkey",
4549 private_key: "testkey.pem",
4550 }
4551
4552 cc_library {
4553 name: "mylib",
4554 srcs: ["mylib.cpp"],
4555 system_shared_libs: [],
4556 stl: "none",
4557 apex_available: [
4558 "//apex_available:platform",
4559 "myapex",
4560 ],
4561 }
4562 `, android.FixtureMergeEnv(map[string]string{
4563 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4564 }))
4565
Jooyung Han63dff462023-02-09 00:11:27 +00004566 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004567 apexManifestRule := module.Rule("apexManifestRule")
4568 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4569}
4570
Vinh Tran8f5310f2022-10-07 18:16:47 -04004571func TestCompileMultilibProp(t *testing.T) {
4572 testCases := []struct {
4573 compileMultiLibProp string
4574 containedLibs []string
4575 notContainedLibs []string
4576 }{
4577 {
4578 containedLibs: []string{
4579 "image.apex/lib64/mylib.so",
4580 "image.apex/lib/mylib.so",
4581 },
4582 compileMultiLibProp: `compile_multilib: "both",`,
4583 },
4584 {
4585 containedLibs: []string{"image.apex/lib64/mylib.so"},
4586 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4587 compileMultiLibProp: `compile_multilib: "first",`,
4588 },
4589 {
4590 containedLibs: []string{"image.apex/lib64/mylib.so"},
4591 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4592 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4593 },
4594 {
4595 containedLibs: []string{"image.apex/lib64/mylib.so"},
4596 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4597 compileMultiLibProp: `compile_multilib: "64",`,
4598 },
4599 {
4600 containedLibs: []string{"image.apex/lib/mylib.so"},
4601 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4602 compileMultiLibProp: `compile_multilib: "32",`,
4603 },
4604 }
4605 for _, testCase := range testCases {
4606 ctx := testApex(t, fmt.Sprintf(`
4607 apex {
4608 name: "myapex",
4609 key: "myapex.key",
4610 %s
4611 native_shared_libs: ["mylib"],
4612 updatable: false,
4613 }
4614 apex_key {
4615 name: "myapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
4619 cc_library {
4620 name: "mylib",
4621 srcs: ["mylib.cpp"],
4622 apex_available: [
4623 "//apex_available:platform",
4624 "myapex",
4625 ],
4626 }
4627 `, testCase.compileMultiLibProp),
4628 )
4629 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4630 apexRule := module.Rule("apexRule")
4631 copyCmds := apexRule.Args["copy_commands"]
4632 for _, containedLib := range testCase.containedLibs {
4633 ensureContains(t, copyCmds, containedLib)
4634 }
4635 for _, notContainedLib := range testCase.notContainedLibs {
4636 ensureNotContains(t, copyCmds, notContainedLib)
4637 }
4638 }
4639}
4640
Alex Light0851b882019-02-07 13:20:53 -08004641func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
4646 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004647 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004648 }
4649
4650 apex_key {
4651 name: "myapex.key",
4652 public_key: "testkey.avbpubkey",
4653 private_key: "testkey.pem",
4654 }
4655
4656 cc_library {
4657 name: "mylib_common",
4658 srcs: ["mylib.cpp"],
4659 system_shared_libs: [],
4660 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004661 apex_available: [
4662 "//apex_available:platform",
4663 "myapex",
4664 ],
Alex Light0851b882019-02-07 13:20:53 -08004665 }
4666 `)
4667
Sundong Ahnabb64432019-10-22 13:58:29 +09004668 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004669 apexRule := module.Rule("apexRule")
4670 copyCmds := apexRule.Args["copy_commands"]
4671
4672 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4673 t.Log("Apex was a test apex!")
4674 t.Fail()
4675 }
4676 // Ensure that main rule creates an output
4677 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4678
4679 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004680 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004681
4682 // Ensure that both direct and indirect deps are copied into apex
4683 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4684
Colin Cross7113d202019-11-20 16:39:12 -08004685 // Ensure that the platform variant ends with _shared
4686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004687
Colin Cross56a83212020-09-15 18:30:11 -07004688 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004689 t.Log("Found mylib_common not in any apex!")
4690 t.Fail()
4691 }
4692}
4693
4694func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004695 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004696 apex_test {
4697 name: "myapex",
4698 key: "myapex.key",
4699 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004700 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004701 }
4702
4703 apex_key {
4704 name: "myapex.key",
4705 public_key: "testkey.avbpubkey",
4706 private_key: "testkey.pem",
4707 }
4708
4709 cc_library {
4710 name: "mylib_common_test",
4711 srcs: ["mylib.cpp"],
4712 system_shared_libs: [],
4713 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004714 // TODO: remove //apex_available:platform
4715 apex_available: [
4716 "//apex_available:platform",
4717 "myapex",
4718 ],
Alex Light0851b882019-02-07 13:20:53 -08004719 }
4720 `)
4721
Sundong Ahnabb64432019-10-22 13:58:29 +09004722 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004723 apexRule := module.Rule("apexRule")
4724 copyCmds := apexRule.Args["copy_commands"]
4725
4726 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4727 t.Log("Apex was not a test apex!")
4728 t.Fail()
4729 }
4730 // Ensure that main rule creates an output
4731 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4732
4733 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004735
4736 // Ensure that both direct and indirect deps are copied into apex
4737 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4738
Colin Cross7113d202019-11-20 16:39:12 -08004739 // Ensure that the platform variant ends with _shared
4740 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004741}
4742
Alex Light9670d332019-01-29 18:07:33 -08004743func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004744 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004745 apex {
4746 name: "myapex",
4747 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004748 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004749 multilib: {
4750 first: {
4751 native_shared_libs: ["mylib_common"],
4752 }
4753 },
4754 target: {
4755 android: {
4756 multilib: {
4757 first: {
4758 native_shared_libs: ["mylib"],
4759 }
4760 }
4761 },
4762 host: {
4763 multilib: {
4764 first: {
4765 native_shared_libs: ["mylib2"],
4766 }
4767 }
4768 }
4769 }
4770 }
4771
4772 apex_key {
4773 name: "myapex.key",
4774 public_key: "testkey.avbpubkey",
4775 private_key: "testkey.pem",
4776 }
4777
4778 cc_library {
4779 name: "mylib",
4780 srcs: ["mylib.cpp"],
4781 system_shared_libs: [],
4782 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004783 // TODO: remove //apex_available:platform
4784 apex_available: [
4785 "//apex_available:platform",
4786 "myapex",
4787 ],
Alex Light9670d332019-01-29 18:07:33 -08004788 }
4789
4790 cc_library {
4791 name: "mylib_common",
4792 srcs: ["mylib.cpp"],
4793 system_shared_libs: [],
4794 stl: "none",
4795 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004796 // TODO: remove //apex_available:platform
4797 apex_available: [
4798 "//apex_available:platform",
4799 "myapex",
4800 ],
Alex Light9670d332019-01-29 18:07:33 -08004801 }
4802
4803 cc_library {
4804 name: "mylib2",
4805 srcs: ["mylib.cpp"],
4806 system_shared_libs: [],
4807 stl: "none",
4808 compile_multilib: "first",
4809 }
4810 `)
4811
Sundong Ahnabb64432019-10-22 13:58:29 +09004812 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004813 copyCmds := apexRule.Args["copy_commands"]
4814
4815 // Ensure that main rule creates an output
4816 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4817
4818 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004819 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4820 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4821 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004822
4823 // Ensure that both direct and indirect deps are copied into apex
4824 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4825 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4826 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4827
Colin Cross7113d202019-11-20 16:39:12 -08004828 // Ensure that the platform variant ends with _shared
4829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004832}
Jiyong Park04480cf2019-02-06 00:16:29 +09004833
Jiyong Park59140302020-12-14 18:44:04 +09004834func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004835 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004836 apex {
4837 name: "myapex",
4838 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004839 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004840 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004841 arch: {
4842 arm64: {
4843 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004844 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004845 },
4846 x86_64: {
4847 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004848 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004849 },
4850 }
4851 }
4852
4853 apex_key {
4854 name: "myapex.key",
4855 public_key: "testkey.avbpubkey",
4856 private_key: "testkey.pem",
4857 }
4858
4859 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004860 name: "mylib.generic",
4861 srcs: ["mylib.cpp"],
4862 system_shared_libs: [],
4863 stl: "none",
4864 // TODO: remove //apex_available:platform
4865 apex_available: [
4866 "//apex_available:platform",
4867 "myapex",
4868 ],
4869 }
4870
4871 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004872 name: "mylib.arm64",
4873 srcs: ["mylib.cpp"],
4874 system_shared_libs: [],
4875 stl: "none",
4876 // TODO: remove //apex_available:platform
4877 apex_available: [
4878 "//apex_available:platform",
4879 "myapex",
4880 ],
4881 }
4882
4883 cc_library {
4884 name: "mylib.x64",
4885 srcs: ["mylib.cpp"],
4886 system_shared_libs: [],
4887 stl: "none",
4888 // TODO: remove //apex_available:platform
4889 apex_available: [
4890 "//apex_available:platform",
4891 "myapex",
4892 ],
4893 }
4894 `)
4895
4896 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4897 copyCmds := apexRule.Args["copy_commands"]
4898
4899 // Ensure that apex variant is created for the direct dep
4900 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004901 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004902 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4903
4904 // Ensure that both direct and indirect deps are copied into apex
4905 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4906 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4907}
4908
Jiyong Park04480cf2019-02-06 00:16:29 +09004909func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004910 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004914 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004915 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004916 }
4917
4918 apex_key {
4919 name: "myapex.key",
4920 public_key: "testkey.avbpubkey",
4921 private_key: "testkey.pem",
4922 }
4923
4924 sh_binary {
4925 name: "myscript",
4926 src: "mylib.cpp",
4927 filename: "myscript.sh",
4928 sub_dir: "script",
4929 }
4930 `)
4931
Sundong Ahnabb64432019-10-22 13:58:29 +09004932 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004933 copyCmds := apexRule.Args["copy_commands"]
4934
4935 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4936}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004937
Jooyung Han91df2082019-11-20 01:49:42 +09004938func TestApexInVariousPartition(t *testing.T) {
4939 testcases := []struct {
4940 propName, parition, flattenedPartition string
4941 }{
4942 {"", "system", "system_ext"},
4943 {"product_specific: true", "product", "product"},
4944 {"soc_specific: true", "vendor", "vendor"},
4945 {"proprietary: true", "vendor", "vendor"},
4946 {"vendor: true", "vendor", "vendor"},
4947 {"system_ext_specific: true", "system_ext", "system_ext"},
4948 }
4949 for _, tc := range testcases {
4950 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004951 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004955 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004956 `+tc.propName+`
4957 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004958
Jooyung Han91df2082019-11-20 01:49:42 +09004959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
4964 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004965
Jooyung Han91df2082019-11-20 01:49:42 +09004966 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004967 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4968 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004969 if actual != expected {
4970 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4971 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004972
Jooyung Han91df2082019-11-20 01:49:42 +09004973 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004974 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4975 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004976 if actual != expected {
4977 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4978 }
4979 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004980 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004981}
Jiyong Park67882562019-03-21 01:11:21 +09004982
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004984 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 apex {
4986 name: "myapex",
4987 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004988 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004990
Jooyung Han580eb4f2020-06-24 19:33:06 +09004991 apex_key {
4992 name: "myapex.key",
4993 public_key: "testkey.avbpubkey",
4994 private_key: "testkey.pem",
4995 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004996 `)
4997 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004998 rule := module.Output("file_contexts")
4999 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5000}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005001
Jooyung Han580eb4f2020-06-24 19:33:06 +09005002func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005003 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005004 apex {
5005 name: "myapex",
5006 key: "myapex.key",
5007 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005008 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005010
Jooyung Han580eb4f2020-06-24 19:33:06 +09005011 apex_key {
5012 name: "myapex.key",
5013 public_key: "testkey.avbpubkey",
5014 private_key: "testkey.pem",
5015 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005016 `, withFiles(map[string][]byte{
5017 "my_own_file_contexts": nil,
5018 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005019}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex {
5024 name: "myapex",
5025 key: "myapex.key",
5026 product_specific: true,
5027 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005028 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex_key {
5032 name: "myapex.key",
5033 public_key: "testkey.avbpubkey",
5034 private_key: "testkey.pem",
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036 `)
5037
Colin Cross1c460562021-02-16 17:55:47 -08005038 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
5042 product_specific: true,
5043 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005044 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex_key {
5048 name: "myapex.key",
5049 public_key: "testkey.avbpubkey",
5050 private_key: "testkey.pem",
5051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005052 `, withFiles(map[string][]byte{
5053 "product_specific_file_contexts": nil,
5054 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5056 rule := module.Output("file_contexts")
5057 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5058}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005061 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 apex {
5063 name: "myapex",
5064 key: "myapex.key",
5065 product_specific: true,
5066 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005067 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069
Jooyung Han580eb4f2020-06-24 19:33:06 +09005070 apex_key {
5071 name: "myapex.key",
5072 public_key: "testkey.avbpubkey",
5073 private_key: "testkey.pem",
5074 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076 filegroup {
5077 name: "my-file-contexts",
5078 srcs: ["product_specific_file_contexts"],
5079 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005080 `, withFiles(map[string][]byte{
5081 "product_specific_file_contexts": nil,
5082 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5084 rule := module.Output("file_contexts")
5085 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086}
5087
Jiyong Park67882562019-03-21 01:11:21 +09005088func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005089 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005090 apex_key {
5091 name: "myapex.key",
5092 public_key: ":my.avbpubkey",
5093 private_key: ":my.pem",
5094 product_specific: true,
5095 }
5096
5097 filegroup {
5098 name: "my.avbpubkey",
5099 srcs: ["testkey2.avbpubkey"],
5100 }
5101
5102 filegroup {
5103 name: "my.pem",
5104 srcs: ["testkey2.pem"],
5105 }
5106 `)
5107
5108 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5109 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005110 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005111 if actual_pubkey != expected_pubkey {
5112 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5113 }
5114 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005115 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005116 if actual_privkey != expected_privkey {
5117 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5118 }
5119}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005120
5121func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005122 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005123 prebuilt_apex {
5124 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005125 arch: {
5126 arm64: {
5127 src: "myapex-arm64.apex",
5128 },
5129 arm: {
5130 src: "myapex-arm.apex",
5131 },
5132 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005133 }
5134 `)
5135
Wei Li340ee8e2022-03-18 17:33:24 -07005136 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5137 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005138
Jiyong Parkc95714e2019-03-29 14:23:10 +09005139 expectedInput := "myapex-arm64.apex"
5140 if prebuilt.inputApex.String() != expectedInput {
5141 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5142 }
Wei Li340ee8e2022-03-18 17:33:24 -07005143 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5144 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5145 rule := testingModule.Rule("genProvenanceMetaData")
5146 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5147 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5148 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5149 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005150
5151 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5152 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005153}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005154
Paul Duffinc0609c62021-03-01 17:27:16 +00005155func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005156 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005157 prebuilt_apex {
5158 name: "myapex",
5159 }
5160 `)
5161}
5162
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005163func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005165 prebuilt_apex {
5166 name: "myapex",
5167 src: "myapex-arm.apex",
5168 filename: "notmyapex.apex",
5169 }
5170 `)
5171
Wei Li340ee8e2022-03-18 17:33:24 -07005172 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5173 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005174
5175 expected := "notmyapex.apex"
5176 if p.installFilename != expected {
5177 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5178 }
Wei Li340ee8e2022-03-18 17:33:24 -07005179 rule := testingModule.Rule("genProvenanceMetaData")
5180 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5181 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5182 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5183 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005184}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005185
Samiul Islam7c02e262021-09-08 17:48:28 +01005186func TestApexSetFilenameOverride(t *testing.T) {
5187 testApex(t, `
5188 apex_set {
5189 name: "com.company.android.myapex",
5190 apex_name: "com.android.myapex",
5191 set: "company-myapex.apks",
5192 filename: "com.company.android.myapex.apex"
5193 }
5194 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5195
5196 testApex(t, `
5197 apex_set {
5198 name: "com.company.android.myapex",
5199 apex_name: "com.android.myapex",
5200 set: "company-myapex.apks",
5201 filename: "com.company.android.myapex.capex"
5202 }
5203 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5204
5205 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5206 apex_set {
5207 name: "com.company.android.myapex",
5208 apex_name: "com.android.myapex",
5209 set: "company-myapex.apks",
5210 filename: "some-random-suffix"
5211 }
5212 `)
5213}
5214
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005215func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005217 prebuilt_apex {
5218 name: "myapex.prebuilt",
5219 src: "myapex-arm.apex",
5220 overrides: [
5221 "myapex",
5222 ],
5223 }
5224 `)
5225
Wei Li340ee8e2022-03-18 17:33:24 -07005226 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5227 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005228
5229 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005230 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005231 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005232 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005233 }
Wei Li340ee8e2022-03-18 17:33:24 -07005234 rule := testingModule.Rule("genProvenanceMetaData")
5235 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5236 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5237 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5238 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005239}
5240
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005241func TestPrebuiltApexName(t *testing.T) {
5242 testApex(t, `
5243 prebuilt_apex {
5244 name: "com.company.android.myapex",
5245 apex_name: "com.android.myapex",
5246 src: "company-myapex-arm.apex",
5247 }
5248 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5249
5250 testApex(t, `
5251 apex_set {
5252 name: "com.company.android.myapex",
5253 apex_name: "com.android.myapex",
5254 set: "company-myapex.apks",
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257}
5258
5259func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5260 _ = android.GroupFixturePreparers(
5261 java.PrepareForTestWithJavaDefaultModules,
5262 PrepareForTestWithApexBuildComponents,
5263 android.FixtureWithRootAndroidBp(`
5264 platform_bootclasspath {
5265 name: "platform-bootclasspath",
5266 fragments: [
5267 {
5268 apex: "com.android.art",
5269 module: "art-bootclasspath-fragment",
5270 },
5271 ],
5272 }
5273
5274 prebuilt_apex {
5275 name: "com.company.android.art",
5276 apex_name: "com.android.art",
5277 src: "com.company.android.art-arm.apex",
5278 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5279 }
5280
5281 prebuilt_bootclasspath_fragment {
5282 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005283 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005284 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005285 hidden_api: {
5286 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5287 metadata: "my-bootclasspath-fragment/metadata.csv",
5288 index: "my-bootclasspath-fragment/index.csv",
5289 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5290 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5291 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005292 }
5293
5294 java_import {
5295 name: "core-oj",
5296 jars: ["prebuilt.jar"],
5297 }
5298 `),
5299 ).RunTest(t)
5300}
5301
Paul Duffin092153d2021-01-26 11:42:39 +00005302// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5303// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005304func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005305 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005306
Paul Duffin89886cb2021-02-05 16:44:03 +00005307 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005308 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005309 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005310 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005311 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005312 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005313 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5314 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5315 android.NormalizePathForTesting(dexJarBuildPath))
5316 }
5317
5318 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005319 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005320 // Make sure the import has been given the correct path to the dex jar.
5321 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5322 dexJarBuildPath := p.DexJarInstallPath()
5323 stem := android.RemoveOptionalPrebuiltPrefix(name)
5324 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5325 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5326 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005327 }
5328
Paul Duffin39853512021-02-26 11:09:39 +00005329 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005330 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005331 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005332 android.AssertArrayString(t, "Check if there is no source variant",
5333 []string{"android_common"},
5334 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005335 }
5336
5337 t.Run("prebuilt only", func(t *testing.T) {
5338 bp := `
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin39853512021-02-26 11:09:39 +00005349 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005350 }
5351
5352 java_import {
5353 name: "libfoo",
5354 jars: ["libfoo.jar"],
5355 }
Paul Duffin39853512021-02-26 11:09:39 +00005356
5357 java_sdk_library_import {
5358 name: "libbar",
5359 public: {
5360 jars: ["libbar.jar"],
5361 },
5362 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005363 `
5364
5365 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5366 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5367
Martin Stjernholm44825602021-09-17 01:44:12 +01005368 deapexerName := deapexerModuleName("myapex")
5369 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5370
Paul Duffinf6932af2021-02-26 18:21:56 +00005371 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005372 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005373 rule := deapexer.Rule("deapexer")
5374 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5375 t.Errorf("expected: %q, found: %q", expected, actual)
5376 }
5377
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005378 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005379 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005380 rule = prebuiltApex.Rule("android/soong/android.Cp")
5381 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5382 t.Errorf("expected: %q, found: %q", expected, actual)
5383 }
5384
Paul Duffin89886cb2021-02-05 16:44:03 +00005385 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005386 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005387
5388 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005389 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 })
5391
5392 t.Run("prebuilt with source preferred", func(t *testing.T) {
5393
5394 bp := `
5395 prebuilt_apex {
5396 name: "myapex",
5397 arch: {
5398 arm64: {
5399 src: "myapex-arm64.apex",
5400 },
5401 arm: {
5402 src: "myapex-arm.apex",
5403 },
5404 },
Paul Duffin39853512021-02-26 11:09:39 +00005405 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005406 }
5407
5408 java_import {
5409 name: "libfoo",
5410 jars: ["libfoo.jar"],
5411 }
5412
5413 java_library {
5414 name: "libfoo",
5415 }
Paul Duffin39853512021-02-26 11:09:39 +00005416
5417 java_sdk_library_import {
5418 name: "libbar",
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
5423
5424 java_sdk_library {
5425 name: "libbar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 unsafe_ignore_missing_latest_api: true,
5428 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005429 `
5430
5431 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5432 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5433
Paul Duffin89886cb2021-02-05 16:44:03 +00005434 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005435 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005436 ensureNoSourceVariant(t, ctx, "libfoo")
5437
5438 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005439 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005440 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 })
5442
5443 t.Run("prebuilt preferred with source", func(t *testing.T) {
5444 bp := `
5445 prebuilt_apex {
5446 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005447 arch: {
5448 arm64: {
5449 src: "myapex-arm64.apex",
5450 },
5451 arm: {
5452 src: "myapex-arm.apex",
5453 },
5454 },
Paul Duffin39853512021-02-26 11:09:39 +00005455 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005456 }
5457
5458 java_import {
5459 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005460 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005461 jars: ["libfoo.jar"],
5462 }
5463
5464 java_library {
5465 name: "libfoo",
5466 }
Paul Duffin39853512021-02-26 11:09:39 +00005467
5468 java_sdk_library_import {
5469 name: "libbar",
5470 prefer: true,
5471 public: {
5472 jars: ["libbar.jar"],
5473 },
5474 }
5475
5476 java_sdk_library {
5477 name: "libbar",
5478 srcs: ["foo/bar/MyClass.java"],
5479 unsafe_ignore_missing_latest_api: true,
5480 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005481 `
5482
5483 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5484 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5485
Paul Duffin89886cb2021-02-05 16:44:03 +00005486 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005487 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005488 ensureNoSourceVariant(t, ctx, "libfoo")
5489
5490 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005491 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005492 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005493 })
5494}
5495
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005496func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005497 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005498 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005499 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5500 // is disabled.
5501 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5502 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503
Paul Duffin37856732021-02-26 14:24:15 +00005504 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5505 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005506 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005507 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005508 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005510 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 foundLibfooJar = true
5512 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005513 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005514 }
5515 }
5516 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005517 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 +00005518 }
5519 }
5520
Paul Duffin40a3f652021-07-19 13:11:24 +01005521 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005522 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005523 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005524 var rule android.TestingBuildParams
5525
5526 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5527 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005528 }
5529
Paul Duffin40a3f652021-07-19 13:11:24 +01005530 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5531 t.Helper()
5532 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5533 var rule android.TestingBuildParams
5534
5535 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5536 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5537 }
5538
Paul Duffin89f570a2021-06-16 01:42:33 +01005539 fragment := java.ApexVariantReference{
5540 Apex: proptools.StringPtr("myapex"),
5541 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5542 }
5543
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 t.Run("prebuilt only", func(t *testing.T) {
5545 bp := `
5546 prebuilt_apex {
5547 name: "myapex",
5548 arch: {
5549 arm64: {
5550 src: "myapex-arm64.apex",
5551 },
5552 arm: {
5553 src: "myapex-arm.apex",
5554 },
5555 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005556 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5557 }
5558
5559 prebuilt_bootclasspath_fragment {
5560 name: "my-bootclasspath-fragment",
5561 contents: ["libfoo", "libbar"],
5562 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005563 hidden_api: {
5564 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5565 metadata: "my-bootclasspath-fragment/metadata.csv",
5566 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005567 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5568 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5569 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005570 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005571 }
5572
5573 java_import {
5574 name: "libfoo",
5575 jars: ["libfoo.jar"],
5576 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005577 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005578 }
Paul Duffin37856732021-02-26 14:24:15 +00005579
5580 java_sdk_library_import {
5581 name: "libbar",
5582 public: {
5583 jars: ["libbar.jar"],
5584 },
5585 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005586 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005587 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005588 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 `
5590
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005592 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5593 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005594
Paul Duffin537ea3d2021-05-14 10:38:00 +01005595 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005596 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005598 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005599 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5600 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005601 })
5602
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005603 t.Run("apex_set only", func(t *testing.T) {
5604 bp := `
5605 apex_set {
5606 name: "myapex",
5607 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005608 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005609 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005610 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5611 }
5612
5613 java_import {
5614 name: "myjavalib",
5615 jars: ["myjavalib.jar"],
5616 apex_available: ["myapex"],
5617 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005618 }
5619
5620 prebuilt_bootclasspath_fragment {
5621 name: "my-bootclasspath-fragment",
5622 contents: ["libfoo", "libbar"],
5623 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005624 hidden_api: {
5625 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5626 metadata: "my-bootclasspath-fragment/metadata.csv",
5627 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005628 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5629 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5630 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005631 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005632 }
5633
Liz Kammer2dc72442023-04-20 10:10:48 -04005634 prebuilt_systemserverclasspath_fragment {
5635 name: "my-systemserverclasspath-fragment",
5636 contents: ["libbaz"],
5637 apex_available: ["myapex"],
5638 }
5639
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005640 java_import {
5641 name: "libfoo",
5642 jars: ["libfoo.jar"],
5643 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005644 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005645 }
5646
5647 java_sdk_library_import {
5648 name: "libbar",
5649 public: {
5650 jars: ["libbar.jar"],
5651 },
5652 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005653 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005654 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005655 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005656
5657 java_sdk_library_import {
5658 name: "libbaz",
5659 public: {
5660 jars: ["libbaz.jar"],
5661 },
5662 apex_available: ["myapex"],
5663 shared_library: false,
5664 permitted_packages: ["baz"],
5665 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005666 `
5667
Paul Duffin89f570a2021-06-16 01:42:33 +01005668 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005669 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5670 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5671
Paul Duffin537ea3d2021-05-14 10:38:00 +01005672 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005673 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005674 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005675 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005676 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5677 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005678
5679 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5680
5681 overrideNames := []string{
5682 "",
5683 "myjavalib.myapex",
5684 "libfoo.myapex",
5685 "libbar.myapex",
5686 "libbaz.myapex",
5687 }
5688 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5689 for i, e := range mkEntries {
5690 g := e.OverrideName
5691 if w := overrideNames[i]; w != g {
5692 t.Errorf("Expected override name %q, got %q", w, g)
5693 }
5694 }
5695
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 })
5697
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005698 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5699 bp := `
5700 prebuilt_apex {
5701 name: "myapex",
5702 arch: {
5703 arm64: {
5704 src: "myapex-arm64.apex",
5705 },
5706 arm: {
5707 src: "myapex-arm.apex",
5708 },
5709 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005710 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5711 }
5712
5713 prebuilt_bootclasspath_fragment {
5714 name: "my-bootclasspath-fragment",
5715 contents: ["libfoo", "libbar"],
5716 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005717 hidden_api: {
5718 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5719 metadata: "my-bootclasspath-fragment/metadata.csv",
5720 index: "my-bootclasspath-fragment/index.csv",
5721 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5722 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5723 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005724 }
5725
5726 java_import {
5727 name: "libfoo",
5728 jars: ["libfoo.jar"],
5729 apex_available: ["myapex"],
5730 }
5731
5732 java_library {
5733 name: "libfoo",
5734 srcs: ["foo/bar/MyClass.java"],
5735 apex_available: ["myapex"],
5736 }
Paul Duffin37856732021-02-26 14:24:15 +00005737
5738 java_sdk_library_import {
5739 name: "libbar",
5740 public: {
5741 jars: ["libbar.jar"],
5742 },
5743 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005744 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005745 }
5746
5747 java_sdk_library {
5748 name: "libbar",
5749 srcs: ["foo/bar/MyClass.java"],
5750 unsafe_ignore_missing_latest_api: true,
5751 apex_available: ["myapex"],
5752 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005753 `
5754
5755 // In this test the source (java_library) libfoo is active since the
5756 // prebuilt (java_import) defaults to prefer:false. However the
5757 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5758 // find the dex boot jar in it. We either need to disable the source libfoo
5759 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005760 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005761 // dexbootjar check is skipped if AllowMissingDependencies is true
5762 preparerAllowMissingDeps := android.GroupFixturePreparers(
5763 preparer,
5764 android.PrepareForTestWithAllowMissingDependencies,
5765 )
5766 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005767 })
5768
5769 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5770 bp := `
5771 prebuilt_apex {
5772 name: "myapex",
5773 arch: {
5774 arm64: {
5775 src: "myapex-arm64.apex",
5776 },
5777 arm: {
5778 src: "myapex-arm.apex",
5779 },
5780 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005781 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5782 }
5783
5784 prebuilt_bootclasspath_fragment {
5785 name: "my-bootclasspath-fragment",
5786 contents: ["libfoo", "libbar"],
5787 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005788 hidden_api: {
5789 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5790 metadata: "my-bootclasspath-fragment/metadata.csv",
5791 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005792 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5793 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5794 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005795 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005796 }
5797
5798 java_import {
5799 name: "libfoo",
5800 prefer: true,
5801 jars: ["libfoo.jar"],
5802 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005803 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 }
5805
5806 java_library {
5807 name: "libfoo",
5808 srcs: ["foo/bar/MyClass.java"],
5809 apex_available: ["myapex"],
5810 }
Paul Duffin37856732021-02-26 14:24:15 +00005811
5812 java_sdk_library_import {
5813 name: "libbar",
5814 prefer: true,
5815 public: {
5816 jars: ["libbar.jar"],
5817 },
5818 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005819 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005820 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005821 }
5822
5823 java_sdk_library {
5824 name: "libbar",
5825 srcs: ["foo/bar/MyClass.java"],
5826 unsafe_ignore_missing_latest_api: true,
5827 apex_available: ["myapex"],
5828 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005829 `
5830
Paul Duffin89f570a2021-06-16 01:42:33 +01005831 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005832 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5833 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005834
Paul Duffin537ea3d2021-05-14 10:38:00 +01005835 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005836 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005837 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005838 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005839 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5840 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005841 })
5842
5843 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5844 bp := `
5845 apex {
5846 name: "myapex",
5847 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005848 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005849 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 }
5851
5852 apex_key {
5853 name: "myapex.key",
5854 public_key: "testkey.avbpubkey",
5855 private_key: "testkey.pem",
5856 }
5857
5858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
5873 contents: ["libfoo", "libbar"],
5874 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005875 hidden_api: {
5876 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5877 metadata: "my-bootclasspath-fragment/metadata.csv",
5878 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005879 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5880 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5881 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005882 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005883 }
5884
5885 java_import {
5886 name: "libfoo",
5887 jars: ["libfoo.jar"],
5888 apex_available: ["myapex"],
5889 }
5890
5891 java_library {
5892 name: "libfoo",
5893 srcs: ["foo/bar/MyClass.java"],
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005896 }
Paul Duffin37856732021-02-26 14:24:15 +00005897
5898 java_sdk_library_import {
5899 name: "libbar",
5900 public: {
5901 jars: ["libbar.jar"],
5902 },
5903 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005904 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005905 }
5906
5907 java_sdk_library {
5908 name: "libbar",
5909 srcs: ["foo/bar/MyClass.java"],
5910 unsafe_ignore_missing_latest_api: true,
5911 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005912 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005913 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 `
5915
Paul Duffin89f570a2021-06-16 01:42:33 +01005916 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005917 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5918 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005919
Paul Duffin537ea3d2021-05-14 10:38:00 +01005920 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005921 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005922 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005923 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005924 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5925 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005926 })
5927
5928 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5929 bp := `
5930 apex {
5931 name: "myapex",
5932 enabled: false,
5933 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005934 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005935 }
5936
5937 apex_key {
5938 name: "myapex.key",
5939 public_key: "testkey.avbpubkey",
5940 private_key: "testkey.pem",
5941 }
5942
5943 prebuilt_apex {
5944 name: "myapex",
5945 arch: {
5946 arm64: {
5947 src: "myapex-arm64.apex",
5948 },
5949 arm: {
5950 src: "myapex-arm.apex",
5951 },
5952 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005953 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5954 }
5955
5956 prebuilt_bootclasspath_fragment {
5957 name: "my-bootclasspath-fragment",
5958 contents: ["libfoo", "libbar"],
5959 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005960 hidden_api: {
5961 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5962 metadata: "my-bootclasspath-fragment/metadata.csv",
5963 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005964 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5965 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5966 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005967 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005968 }
5969
5970 java_import {
5971 name: "libfoo",
5972 prefer: true,
5973 jars: ["libfoo.jar"],
5974 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005975 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005976 }
5977
5978 java_library {
5979 name: "libfoo",
5980 srcs: ["foo/bar/MyClass.java"],
5981 apex_available: ["myapex"],
5982 }
Paul Duffin37856732021-02-26 14:24:15 +00005983
5984 java_sdk_library_import {
5985 name: "libbar",
5986 prefer: true,
5987 public: {
5988 jars: ["libbar.jar"],
5989 },
5990 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005991 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005992 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005993 }
5994
5995 java_sdk_library {
5996 name: "libbar",
5997 srcs: ["foo/bar/MyClass.java"],
5998 unsafe_ignore_missing_latest_api: true,
5999 apex_available: ["myapex"],
6000 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 `
6002
Paul Duffin89f570a2021-06-16 01:42:33 +01006003 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006004 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6005 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006006
Paul Duffin537ea3d2021-05-14 10:38:00 +01006007 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006008 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006009 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006010 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006011 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
6012 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006013 })
6014}
6015
Roland Levillain630846d2019-06-26 12:48:34 +01006016func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006017 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006018 apex_test {
6019 name: "myapex",
6020 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006021 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006022 tests: [
6023 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006024 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006025 ],
6026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
Liz Kammer1c14a212020-05-12 15:26:55 -07006034 filegroup {
6035 name: "fg",
6036 srcs: [
6037 "baz",
6038 "bar/baz"
6039 ],
6040 }
6041
Roland Levillain630846d2019-06-26 12:48:34 +01006042 cc_test {
6043 name: "mytest",
6044 gtest: false,
6045 srcs: ["mytest.cpp"],
6046 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006047 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006048 system_shared_libs: [],
6049 static_executable: true,
6050 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006051 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006052 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006053
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006054 cc_library {
6055 name: "mylib",
6056 srcs: ["mylib.cpp"],
6057 system_shared_libs: [],
6058 stl: "none",
6059 }
6060
Liz Kammer5bd365f2020-05-27 15:15:11 -07006061 filegroup {
6062 name: "fg2",
6063 srcs: [
6064 "testdata/baz"
6065 ],
6066 }
6067
Roland Levillain9b5fde92019-06-28 15:41:19 +01006068 cc_test {
6069 name: "mytests",
6070 gtest: false,
6071 srcs: [
6072 "mytest1.cpp",
6073 "mytest2.cpp",
6074 "mytest3.cpp",
6075 ],
6076 test_per_src: true,
6077 relative_install_path: "test",
6078 system_shared_libs: [],
6079 static_executable: true,
6080 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006081 data: [
6082 ":fg",
6083 ":fg2",
6084 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006085 }
Roland Levillain630846d2019-06-26 12:48:34 +01006086 `)
6087
Sundong Ahnabb64432019-10-22 13:58:29 +09006088 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006089 copyCmds := apexRule.Args["copy_commands"]
6090
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006091 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006092 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006093 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006094
Liz Kammer1c14a212020-05-12 15:26:55 -07006095 //Ensure that test data are copied into apex.
6096 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6097 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6098
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099 // Ensure that test deps built with `test_per_src` are copied into apex.
6100 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006103
6104 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006105 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006106 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006107 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 prefix := "TARGET_"
6109 var builder strings.Builder
6110 data.Custom(&builder, name, prefix, "", data)
6111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6115 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6116 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6117 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006118 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006119
6120 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006121 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006122 data.Custom(&builder, name, prefix, "", data)
6123 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006124 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6125 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006126}
6127
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006128func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006129 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006130 apex {
6131 name: "myapex",
6132 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006133 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006134 }
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006140 `,
6141 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6142 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
6143 }),
6144 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006145 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00006146 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07006147 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006148 var builder strings.Builder
6149 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
6150 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006151 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006152}
6153
Jooyung Hand48f3c32019-08-23 11:18:57 +09006154func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6155 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 native_shared_libs: ["libfoo"],
6160 }
6161
6162 apex_key {
6163 name: "myapex.key",
6164 public_key: "testkey.avbpubkey",
6165 private_key: "testkey.pem",
6166 }
6167
6168 cc_library {
6169 name: "libfoo",
6170 stl: "none",
6171 system_shared_libs: [],
6172 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006173 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006174 }
6175 `)
6176 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6177 apex {
6178 name: "myapex",
6179 key: "myapex.key",
6180 java_libs: ["myjar"],
6181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 java_library {
6190 name: "myjar",
6191 srcs: ["foo/bar/MyClass.java"],
6192 sdk_version: "none",
6193 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006194 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006195 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006196 }
6197 `)
6198}
6199
Bill Peckhama41a6962021-01-11 10:58:54 -08006200func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006201 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006206 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 java_import {
6216 name: "myjavaimport",
6217 apex_available: ["myapex"],
6218 jars: ["my.jar"],
6219 compile_dex: true,
6220 }
6221 `)
6222
6223 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6224 apexRule := module.Rule("apexRule")
6225 copyCmds := apexRule.Args["copy_commands"]
6226 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6227}
6228
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006230 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006231 apex {
6232 name: "myapex",
6233 key: "myapex.key",
6234 apps: [
6235 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006236 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006237 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006238 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 android_app {
6248 name: "AppFoo",
6249 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006250 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006252 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006253 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006254 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006255 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006256
6257 android_app {
6258 name: "AppFooPriv",
6259 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006260 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006261 system_modules: "none",
6262 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006263 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006265 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006266 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006267
6268 cc_library_shared {
6269 name: "libjni",
6270 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006271 shared_libs: ["libfoo"],
6272 stl: "none",
6273 system_shared_libs: [],
6274 apex_available: [ "myapex" ],
6275 sdk_version: "current",
6276 }
6277
6278 cc_library_shared {
6279 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006280 stl: "none",
6281 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006282 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006283 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006284 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006285 `)
6286
Sundong Ahnabb64432019-10-22 13:58:29 +09006287 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006288 apexRule := module.Rule("apexRule")
6289 copyCmds := apexRule.Args["copy_commands"]
6290
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006291 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6292 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006293 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006294
Colin Crossaede88c2020-08-11 12:17:01 -07006295 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006296 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006297 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006298 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006299 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006300 // JNI libraries including transitive deps are
6301 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006302 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006303 // ... embedded inside APK (jnilibs.zip)
6304 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6305 // ... and not directly inside the APEX
6306 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6307 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006308
6309 apexBundle := module.Module().(*apexBundle)
6310 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6311 var builder strings.Builder
6312 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6313 androidMk := builder.String()
6314 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6315 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6316 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6317 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6318 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6319 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 +01006320}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006321
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006322func TestApexWithAppImportBuildId(t *testing.T) {
6323 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6324 for _, id := range invalidBuildIds {
6325 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6326 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6327 variables.BuildId = proptools.StringPtr(id)
6328 })
6329 testApexError(t, message, `apex {
6330 name: "myapex",
6331 key: "myapex.key",
6332 apps: ["AppFooPrebuilt"],
6333 updatable: false,
6334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
6342 android_app_import {
6343 name: "AppFooPrebuilt",
6344 apk: "PrebuiltAppFoo.apk",
6345 presigned: true,
6346 apex_available: ["myapex"],
6347 }
6348 `, fixture)
6349 }
6350}
6351
Dario Frenicde2a032019-10-27 00:29:22 +01006352func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006353 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006354 apex {
6355 name: "myapex",
6356 key: "myapex.key",
6357 apps: [
6358 "AppFooPrebuilt",
6359 "AppFooPrivPrebuilt",
6360 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006361 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006362 }
6363
6364 apex_key {
6365 name: "myapex.key",
6366 public_key: "testkey.avbpubkey",
6367 private_key: "testkey.pem",
6368 }
6369
6370 android_app_import {
6371 name: "AppFooPrebuilt",
6372 apk: "PrebuiltAppFoo.apk",
6373 presigned: true,
6374 dex_preopt: {
6375 enabled: false,
6376 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006377 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006378 }
6379
6380 android_app_import {
6381 name: "AppFooPrivPrebuilt",
6382 apk: "PrebuiltAppFooPriv.apk",
6383 privileged: true,
6384 presigned: true,
6385 dex_preopt: {
6386 enabled: false,
6387 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006388 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006389 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006390 }
6391 `)
6392
Sundong Ahnabb64432019-10-22 13:58:29 +09006393 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006394 apexRule := module.Rule("apexRule")
6395 copyCmds := apexRule.Args["copy_commands"]
6396
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006397 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6398 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006399}
6400
6401func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006402 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006403 apex {
6404 name: "myapex",
6405 key: "myapex.key",
6406 apps: [
6407 "AppFoo",
6408 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006409 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006410 }
6411
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417
6418 android_app {
6419 name: "AppFoo",
6420 srcs: ["foo/bar/MyClass.java"],
6421 sdk_version: "none",
6422 system_modules: "none",
6423 apex_available: [ "myapex" ],
6424 }
6425
6426 android_app_import {
6427 name: "AppFoo",
6428 apk: "AppFooPrebuilt.apk",
6429 filename: "AppFooPrebuilt.apk",
6430 presigned: true,
6431 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006432 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006433 }
6434 `, withFiles(map[string][]byte{
6435 "AppFooPrebuilt.apk": nil,
6436 }))
6437
6438 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006439 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006440 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006441}
6442
Dario Freni6f3937c2019-12-20 22:58:03 +00006443func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006444 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 apex {
6446 name: "myapex",
6447 key: "myapex.key",
6448 apps: [
6449 "TesterHelpAppFoo",
6450 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006451 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 android_test_helper_app {
6461 name: "TesterHelpAppFoo",
6462 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006463 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006464 }
6465
6466 `)
6467
6468 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6469 apexRule := module.Rule("apexRule")
6470 copyCmds := apexRule.Args["copy_commands"]
6471
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006472 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006473}
6474
Jooyung Han18020ea2019-11-13 10:50:48 +09006475func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6476 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006477 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006478 apex {
6479 name: "myapex",
6480 key: "myapex.key",
6481 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006482 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006483 }
6484
6485 apex_key {
6486 name: "myapex.key",
6487 public_key: "testkey.avbpubkey",
6488 private_key: "testkey.pem",
6489 }
6490
6491 apex {
6492 name: "otherapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006495 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006496 }
6497
6498 cc_defaults {
6499 name: "libfoo-defaults",
6500 apex_available: ["otherapex"],
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 defaults: ["libfoo-defaults"],
6506 stl: "none",
6507 system_shared_libs: [],
6508 }`)
6509}
6510
Paul Duffine52e66f2020-03-30 17:54:29 +01006511func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006512 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006513 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006514 apex {
6515 name: "myapex",
6516 key: "myapex.key",
6517 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006518 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006519 }
6520
6521 apex_key {
6522 name: "myapex.key",
6523 public_key: "testkey.avbpubkey",
6524 private_key: "testkey.pem",
6525 }
6526
6527 apex {
6528 name: "otherapex",
6529 key: "otherapex.key",
6530 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006531 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006532 }
6533
6534 apex_key {
6535 name: "otherapex.key",
6536 public_key: "testkey.avbpubkey",
6537 private_key: "testkey.pem",
6538 }
6539
6540 cc_library {
6541 name: "libfoo",
6542 stl: "none",
6543 system_shared_libs: [],
6544 apex_available: ["otherapex"],
6545 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006546}
Jiyong Park127b40b2019-09-30 16:04:35 +09006547
Paul Duffine52e66f2020-03-30 17:54:29 +01006548func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006550 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006551.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006552.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006553.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006554.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006555.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006556.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006557 apex {
6558 name: "myapex",
6559 key: "myapex.key",
6560 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006561 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006562 }
6563
6564 apex_key {
6565 name: "myapex.key",
6566 public_key: "testkey.avbpubkey",
6567 private_key: "testkey.pem",
6568 }
6569
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 cc_library {
6571 name: "libfoo",
6572 stl: "none",
6573 shared_libs: ["libbar"],
6574 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006575 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 cc_library {
6579 name: "libbar",
6580 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006581 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006583 apex_available: ["myapex"],
6584 }
6585
6586 cc_library {
6587 name: "libbaz",
6588 stl: "none",
6589 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006590 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006591}
Jiyong Park127b40b2019-09-30 16:04:35 +09006592
Liz Kammer5f108fa2023-05-11 14:33:17 -04006593func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6594 testApex(t, `
6595 apex {
6596 name: "myapex",
6597 key: "myapex.key",
6598 native_shared_libs: ["libfoo"],
6599 updatable: false,
6600 }
6601
6602 apex_key {
6603 name: "myapex.key",
6604 public_key: "testkey.avbpubkey",
6605 private_key: "testkey.pem",
6606 }
6607
6608 cc_library {
6609 name: "libfoo",
6610 stl: "none",
6611 static_libs: ["libbar"],
6612 system_shared_libs: [],
6613 apex_available: ["myapex"],
6614 }
6615
6616 cc_library {
6617 name: "libbar",
6618 stl: "none",
6619 shared_libs: ["libbaz"],
6620 system_shared_libs: [],
6621 apex_available: ["myapex"],
6622 }
6623
6624 cc_library {
6625 name: "libbaz",
6626 stl: "none",
6627 system_shared_libs: [],
6628 }`)
6629
6630 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6631 apex {
6632 name: "myapex",
6633 key: "myapex.key",
6634 native_shared_libs: ["libfoo"],
6635 updatable: false,
6636 }
6637
6638 apex_key {
6639 name: "myapex.key",
6640 public_key: "testkey.avbpubkey",
6641 private_key: "testkey.pem",
6642 }
6643
6644 cc_library {
6645 name: "libfoo",
6646 stl: "none",
6647 static_libs: ["libbar"],
6648 system_shared_libs: [],
6649 apex_available: ["myapex"],
6650 }
6651
6652 cc_library {
6653 name: "libbar",
6654 stl: "none",
6655 system_shared_libs: [],
6656 }`)
6657}
6658
Paul Duffine52e66f2020-03-30 17:54:29 +01006659func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006660 testApexError(t, "\"otherapex\" is not a valid module name", `
6661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006665 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 }
6667
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673
6674 cc_library {
6675 name: "libfoo",
6676 stl: "none",
6677 system_shared_libs: [],
6678 apex_available: ["otherapex"],
6679 }`)
6680
Paul Duffine52e66f2020-03-30 17:54:29 +01006681 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006682 apex {
6683 name: "myapex",
6684 key: "myapex.key",
6685 native_shared_libs: ["libfoo", "libbar"],
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: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006699 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006700 apex_available: ["myapex"],
6701 }
6702
6703 cc_library {
6704 name: "libbar",
6705 stl: "none",
6706 system_shared_libs: [],
6707 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006708 }
6709
6710 cc_library {
6711 name: "libbaz",
6712 stl: "none",
6713 system_shared_libs: [],
6714 stubs: {
6715 versions: ["10", "20", "30"],
6716 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006717 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006718}
Jiyong Park127b40b2019-09-30 16:04:35 +09006719
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006720func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6721 t.Run("negative variant_version produces error", func(t *testing.T) {
6722 testApexError(t, "expected an integer between 0-9; got -1", `
6723 apex {
6724 name: "myapex",
6725 key: "myapex.key",
6726 apex_available_name: "com.android.foo",
6727 variant_version: "-1",
6728 updatable: false,
6729 }
6730 apex_key {
6731 name: "myapex.key",
6732 public_key: "testkey.avbpubkey",
6733 private_key: "testkey.pem",
6734 }
6735 `)
6736 })
6737
6738 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6739 testApexError(t, "expected an integer between 0-9; got 10", `
6740 apex {
6741 name: "myapex",
6742 key: "myapex.key",
6743 apex_available_name: "com.android.foo",
6744 variant_version: "10",
6745 updatable: false,
6746 }
6747 apex_key {
6748 name: "myapex.key",
6749 public_key: "testkey.avbpubkey",
6750 private_key: "testkey.pem",
6751 }
6752 `)
6753 })
6754}
6755
6756func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6757 context := android.GroupFixturePreparers(
6758 android.PrepareForIntegrationTestWithAndroid,
6759 PrepareForTestWithApexBuildComponents,
6760 android.FixtureMergeMockFs(android.MockFS{
6761 "system/sepolicy/apex/foo-file_contexts": nil,
6762 "system/sepolicy/apex/bar-file_contexts": nil,
6763 }),
6764 )
6765 result := context.RunTestWithBp(t, `
6766 apex {
6767 name: "foo",
6768 key: "myapex.key",
6769 apex_available_name: "com.android.foo",
6770 variant_version: "0",
6771 updatable: false,
6772 }
6773 apex {
6774 name: "bar",
6775 key: "myapex.key",
6776 apex_available_name: "com.android.foo",
6777 variant_version: "3",
6778 updatable: false,
6779 }
6780 apex_key {
6781 name: "myapex.key",
6782 public_key: "testkey.avbpubkey",
6783 private_key: "testkey.pem",
6784 }
6785 `)
6786
6787 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6788 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6789 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6790 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6791 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6792 }
6793
6794 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6795 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6796 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6797 barActualDefaultVersion := barManifestRule.Args["default_version"]
6798 if barActualDefaultVersion != barExpectedDefaultVersion {
6799 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6800 }
6801}
6802
Sam Delmericoca816532023-06-02 14:09:50 -04006803func TestApexAvailable_ApexAvailableName(t *testing.T) {
6804 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6805 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6806 apex {
6807 name: "myapex_sminus",
6808 key: "myapex.key",
6809 apps: ["AppFoo"],
6810 apex_available_name: "myapex",
6811 updatable: false,
6812 }
6813 apex {
6814 name: "myapex",
6815 key: "myapex.key",
6816 apps: ["AppFoo"],
6817 updatable: false,
6818 }
6819 apex_key {
6820 name: "myapex.key",
6821 public_key: "testkey.avbpubkey",
6822 private_key: "testkey.pem",
6823 }
6824 android_app {
6825 name: "AppFoo",
6826 srcs: ["foo/bar/MyClass.java"],
6827 sdk_version: "none",
6828 system_modules: "none",
6829 apex_available: [ "myapex_sminus" ],
6830 }`,
6831 android.FixtureMergeMockFs(android.MockFS{
6832 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6833 }),
6834 )
6835 })
6836
6837 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6838 testApex(t, `
6839 apex {
6840 name: "myapex_sminus",
6841 key: "myapex.key",
6842 apps: ["AppFoo"],
6843 apex_available_name: "myapex",
6844 updatable: false,
6845 }
6846 apex {
6847 name: "myapex",
6848 key: "myapex.key",
6849 apps: ["AppFoo"],
6850 updatable: false,
6851 }
6852 apex_key {
6853 name: "myapex.key",
6854 public_key: "testkey.avbpubkey",
6855 private_key: "testkey.pem",
6856 }
6857 android_app {
6858 name: "AppFoo",
6859 srcs: ["foo/bar/MyClass.java"],
6860 sdk_version: "none",
6861 system_modules: "none",
6862 apex_available: [ "myapex" ],
6863 }`,
6864 android.FixtureMergeMockFs(android.MockFS{
6865 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6866 }),
6867 )
6868 })
6869
6870 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6871 testApex(t, `
6872 override_apex {
6873 name: "myoverrideapex_sminus",
6874 base: "myapex_sminus",
6875 key: "myapex.key",
6876 apps: ["AppFooOverride"],
6877 }
6878 override_apex {
6879 name: "myoverrideapex",
6880 base: "myapex",
6881 key: "myapex.key",
6882 apps: ["AppFooOverride"],
6883 }
6884 apex {
6885 name: "myapex_sminus",
6886 key: "myapex.key",
6887 apps: ["AppFoo"],
6888 apex_available_name: "myapex",
6889 updatable: false,
6890 }
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 apps: ["AppFoo"],
6895 updatable: false,
6896 }
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902 android_app {
6903 name: "AppFooOverride",
6904 srcs: ["foo/bar/MyClass.java"],
6905 sdk_version: "none",
6906 system_modules: "none",
6907 apex_available: [ "myapex" ],
6908 }
6909 android_app {
6910 name: "AppFoo",
6911 srcs: ["foo/bar/MyClass.java"],
6912 sdk_version: "none",
6913 system_modules: "none",
6914 apex_available: [ "myapex" ],
6915 }`,
6916 android.FixtureMergeMockFs(android.MockFS{
6917 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6918 }),
6919 )
6920 })
6921}
6922
6923func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6924 context := android.GroupFixturePreparers(
6925 android.PrepareForIntegrationTestWithAndroid,
6926 PrepareForTestWithApexBuildComponents,
6927 java.PrepareForTestWithDexpreopt,
6928 android.FixtureMergeMockFs(android.MockFS{
6929 "system/sepolicy/apex/myapex-file_contexts": nil,
6930 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6931 }),
6932 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6933 variables.BuildId = proptools.StringPtr("buildid")
6934 }),
6935 )
6936 context.RunTestWithBp(t, `
6937 override_apex {
6938 name: "myoverrideapex_sminus",
6939 base: "myapex_sminus",
6940 }
6941 override_apex {
6942 name: "myoverrideapex",
6943 base: "myapex",
6944 }
6945 apex {
6946 name: "myapex",
6947 key: "myapex.key",
6948 apps: ["AppFoo"],
6949 updatable: false,
6950 }
6951 apex {
6952 name: "myapex_sminus",
6953 apex_available_name: "myapex",
6954 key: "myapex.key",
6955 apps: ["AppFoo_sminus"],
6956 updatable: false,
6957 }
6958 apex_key {
6959 name: "myapex.key",
6960 public_key: "testkey.avbpubkey",
6961 private_key: "testkey.pem",
6962 }
6963 android_app {
6964 name: "AppFoo",
6965 srcs: ["foo/bar/MyClass.java"],
6966 sdk_version: "none",
6967 system_modules: "none",
6968 apex_available: [ "myapex" ],
6969 }
6970 android_app {
6971 name: "AppFoo_sminus",
6972 srcs: ["foo/bar/MyClass.java"],
6973 sdk_version: "none",
6974 min_sdk_version: "29",
6975 system_modules: "none",
6976 apex_available: [ "myapex" ],
6977 }`)
6978}
6979
Jiyong Park89e850a2020-04-07 16:37:39 +09006980func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006981 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006986 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006987 }
6988
6989 apex_key {
6990 name: "myapex.key",
6991 public_key: "testkey.avbpubkey",
6992 private_key: "testkey.pem",
6993 }
6994
6995 cc_library {
6996 name: "libfoo",
6997 stl: "none",
6998 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006999 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007000 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007001 }
7002
7003 cc_library {
7004 name: "libfoo2",
7005 stl: "none",
7006 system_shared_libs: [],
7007 shared_libs: ["libbaz"],
7008 apex_available: ["//apex_available:platform"],
7009 }
7010
7011 cc_library {
7012 name: "libbar",
7013 stl: "none",
7014 system_shared_libs: [],
7015 apex_available: ["myapex"],
7016 }
7017
7018 cc_library {
7019 name: "libbaz",
7020 stl: "none",
7021 system_shared_libs: [],
7022 apex_available: ["myapex"],
7023 stubs: {
7024 versions: ["1"],
7025 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007026 }`)
7027
Jiyong Park89e850a2020-04-07 16:37:39 +09007028 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7029 // because it depends on libbar which isn't available to platform
7030 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7031 if libfoo.NotAvailableForPlatform() != true {
7032 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7033 }
7034
7035 // libfoo2 however can be available to platform because it depends on libbaz which provides
7036 // stubs
7037 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7038 if libfoo2.NotAvailableForPlatform() == true {
7039 t.Errorf("%q should be available to platform", libfoo2.String())
7040 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007041}
Jiyong Parka90ca002019-10-07 15:47:24 +09007042
Paul Duffine52e66f2020-03-30 17:54:29 +01007043func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007044 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007045 apex {
7046 name: "myapex",
7047 key: "myapex.key",
7048 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007049 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007050 }
7051
7052 apex_key {
7053 name: "myapex.key",
7054 public_key: "testkey.avbpubkey",
7055 private_key: "testkey.pem",
7056 }
7057
7058 cc_library {
7059 name: "libfoo",
7060 stl: "none",
7061 system_shared_libs: [],
7062 apex_available: ["myapex"],
7063 static: {
7064 apex_available: ["//apex_available:platform"],
7065 },
7066 }`)
7067
Jiyong Park89e850a2020-04-07 16:37:39 +09007068 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7069 if libfooShared.NotAvailableForPlatform() != true {
7070 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7071 }
7072 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7073 if libfooStatic.NotAvailableForPlatform() != false {
7074 t.Errorf("%q should be available to platform", libfooStatic.String())
7075 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007076}
7077
Jiyong Park5d790c32019-11-15 18:40:32 +09007078func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007079 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007080 apex {
7081 name: "myapex",
7082 key: "myapex.key",
7083 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007084 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007085 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007086 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007087 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007088 }
7089
7090 override_apex {
7091 name: "override_myapex",
7092 base: "myapex",
7093 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007094 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007095 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007096 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007097 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007098 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007099 key: "mynewapex.key",
7100 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007101 }
7102
7103 apex_key {
7104 name: "myapex.key",
7105 public_key: "testkey.avbpubkey",
7106 private_key: "testkey.pem",
7107 }
7108
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007109 apex_key {
7110 name: "mynewapex.key",
7111 public_key: "testkey2.avbpubkey",
7112 private_key: "testkey2.pem",
7113 }
7114
7115 android_app_certificate {
7116 name: "myapex.certificate",
7117 certificate: "testkey",
7118 }
7119
Jiyong Park5d790c32019-11-15 18:40:32 +09007120 android_app {
7121 name: "app",
7122 srcs: ["foo/bar/MyClass.java"],
7123 package_name: "foo",
7124 sdk_version: "none",
7125 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007126 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007127 }
7128
7129 override_android_app {
7130 name: "override_app",
7131 base: "app",
7132 package_name: "bar",
7133 }
markchien7c803b82021-08-26 22:10:06 +08007134
7135 bpf {
7136 name: "bpf",
7137 srcs: ["bpf.c"],
7138 }
7139
7140 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007141 name: "overrideBpf",
7142 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007143 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007144
7145 prebuilt_etc {
7146 name: "myetc",
7147 src: "myprebuilt",
7148 }
7149
7150 prebuilt_etc {
7151 name: "override_myetc",
7152 src: "override_myprebuilt",
7153 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007154 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007155
Jiyong Park317645e2019-12-05 13:20:58 +09007156 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7157 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7158 if originalVariant.GetOverriddenBy() != "" {
7159 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7160 }
7161 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7162 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7163 }
7164
Jiyong Park5d790c32019-11-15 18:40:32 +09007165 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7166 apexRule := module.Rule("apexRule")
7167 copyCmds := apexRule.Args["copy_commands"]
7168
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007169 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7170 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007171
markchien7c803b82021-08-26 22:10:06 +08007172 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007173 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007174
Daniel Norman5a3ce132021-08-26 15:44:43 -07007175 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7176 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7177
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007178 apexBundle := module.Module().(*apexBundle)
7179 name := apexBundle.Name()
7180 if name != "override_myapex" {
7181 t.Errorf("name should be \"override_myapex\", but was %q", name)
7182 }
7183
Baligh Uddin004d7172020-02-19 21:29:28 -08007184 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7185 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7186 }
7187
Jiyong Park20bacab2020-03-03 11:45:41 +09007188 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007189 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007190 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7191
7192 signApkRule := module.Rule("signapk")
7193 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007194
Colin Crossaa255532020-07-03 13:18:24 -07007195 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007196 var builder strings.Builder
7197 data.Custom(&builder, name, "TARGET_", "", data)
7198 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007199 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7200 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
7201 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007202 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007203 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007204 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007205 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007206 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007207 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
7208 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007209}
7210
Albert Martineefabcf2022-03-21 20:11:16 +00007211func TestMinSdkVersionOverride(t *testing.T) {
7212 // Override from 29 to 31
7213 minSdkOverride31 := "31"
7214 ctx := testApex(t, `
7215 apex {
7216 name: "myapex",
7217 key: "myapex.key",
7218 native_shared_libs: ["mylib"],
7219 updatable: true,
7220 min_sdk_version: "29"
7221 }
7222
7223 override_apex {
7224 name: "override_myapex",
7225 base: "myapex",
7226 logging_parent: "com.foo.bar",
7227 package_name: "test.overridden.package"
7228 }
7229
7230 apex_key {
7231 name: "myapex.key",
7232 public_key: "testkey.avbpubkey",
7233 private_key: "testkey.pem",
7234 }
7235
7236 cc_library {
7237 name: "mylib",
7238 srcs: ["mylib.cpp"],
7239 runtime_libs: ["libbar"],
7240 system_shared_libs: [],
7241 stl: "none",
7242 apex_available: [ "myapex" ],
7243 min_sdk_version: "apex_inherit"
7244 }
7245
7246 cc_library {
7247 name: "libbar",
7248 srcs: ["mylib.cpp"],
7249 system_shared_libs: [],
7250 stl: "none",
7251 apex_available: [ "myapex" ],
7252 min_sdk_version: "apex_inherit"
7253 }
7254
7255 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7256
7257 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7258 copyCmds := apexRule.Args["copy_commands"]
7259
7260 // Ensure that direct non-stubs dep is always included
7261 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7262
7263 // Ensure that runtime_libs dep in included
7264 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7265
7266 // Ensure libraries target overridden min_sdk_version value
7267 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7268}
7269
7270func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7271 // Attempt to override from 31 to 29, should be a NOOP
7272 minSdkOverride29 := "29"
7273 ctx := testApex(t, `
7274 apex {
7275 name: "myapex",
7276 key: "myapex.key",
7277 native_shared_libs: ["mylib"],
7278 updatable: true,
7279 min_sdk_version: "31"
7280 }
7281
7282 override_apex {
7283 name: "override_myapex",
7284 base: "myapex",
7285 logging_parent: "com.foo.bar",
7286 package_name: "test.overridden.package"
7287 }
7288
7289 apex_key {
7290 name: "myapex.key",
7291 public_key: "testkey.avbpubkey",
7292 private_key: "testkey.pem",
7293 }
7294
7295 cc_library {
7296 name: "mylib",
7297 srcs: ["mylib.cpp"],
7298 runtime_libs: ["libbar"],
7299 system_shared_libs: [],
7300 stl: "none",
7301 apex_available: [ "myapex" ],
7302 min_sdk_version: "apex_inherit"
7303 }
7304
7305 cc_library {
7306 name: "libbar",
7307 srcs: ["mylib.cpp"],
7308 system_shared_libs: [],
7309 stl: "none",
7310 apex_available: [ "myapex" ],
7311 min_sdk_version: "apex_inherit"
7312 }
7313
7314 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7315
7316 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7317 copyCmds := apexRule.Args["copy_commands"]
7318
7319 // Ensure that direct non-stubs dep is always included
7320 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7321
7322 // Ensure that runtime_libs dep in included
7323 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7324
7325 // Ensure libraries target the original min_sdk_version value rather than the overridden
7326 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7327}
7328
Jooyung Han214bf372019-11-12 13:03:50 +09007329func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007330 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007331 apex {
7332 name: "myapex",
7333 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007334 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007335 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007336 }
7337
7338 apex_key {
7339 name: "myapex.key",
7340 public_key: "testkey.avbpubkey",
7341 private_key: "testkey.pem",
7342 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007343
7344 cc_library {
7345 name: "mylib",
7346 srcs: ["mylib.cpp"],
7347 stl: "libc++",
7348 system_shared_libs: [],
7349 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007350 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007351 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007352 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007353
7354 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7355 args := module.Rule("apexRule").Args
7356 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007357 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007358
7359 // The copies of the libraries in the apex should have one more dependency than
7360 // the ones outside the apex, namely the unwinder. Ideally we should check
7361 // the dependency names directly here but for some reason the names are blank in
7362 // this test.
7363 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007364 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007365 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7366 if len(apexImplicits) != len(nonApexImplicits)+1 {
7367 t.Errorf("%q missing unwinder dep", lib)
7368 }
7369 }
Jooyung Han214bf372019-11-12 13:03:50 +09007370}
7371
Paul Duffine05480a2021-03-08 15:07:14 +00007372var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007373 "api/current.txt": nil,
7374 "api/removed.txt": nil,
7375 "api/system-current.txt": nil,
7376 "api/system-removed.txt": nil,
7377 "api/test-current.txt": nil,
7378 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007379
Anton Hanssondff2c782020-12-21 17:10:01 +00007380 "100/public/api/foo.txt": nil,
7381 "100/public/api/foo-removed.txt": nil,
7382 "100/system/api/foo.txt": nil,
7383 "100/system/api/foo-removed.txt": nil,
7384
Paul Duffineedc5d52020-06-12 17:46:39 +01007385 // For java_sdk_library_import
7386 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007387}
7388
Jooyung Han58f26ab2019-12-18 15:34:32 +09007389func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007390 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007391 apex {
7392 name: "myapex",
7393 key: "myapex.key",
7394 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007395 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007396 }
7397
7398 apex_key {
7399 name: "myapex.key",
7400 public_key: "testkey.avbpubkey",
7401 private_key: "testkey.pem",
7402 }
7403
7404 java_sdk_library {
7405 name: "foo",
7406 srcs: ["a.java"],
7407 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007408 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007409 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007410
7411 prebuilt_apis {
7412 name: "sdk",
7413 api_dirs: ["100"],
7414 }
Paul Duffin9b879592020-05-26 13:21:35 +01007415 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007416
7417 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007418 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007419 "javalib/foo.jar",
7420 "etc/permissions/foo.xml",
7421 })
7422 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007423 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007424 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 +09007425}
7426
Paul Duffin9b879592020-05-26 13:21:35 +01007427func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007428 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007429 apex {
7430 name: "myapex",
7431 key: "myapex.key",
7432 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007433 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007434 }
7435
7436 apex_key {
7437 name: "myapex.key",
7438 public_key: "testkey.avbpubkey",
7439 private_key: "testkey.pem",
7440 }
7441
7442 java_sdk_library {
7443 name: "foo",
7444 srcs: ["a.java"],
7445 api_packages: ["foo"],
7446 apex_available: ["myapex"],
7447 sdk_version: "none",
7448 system_modules: "none",
7449 }
7450
7451 java_library {
7452 name: "bar",
7453 srcs: ["a.java"],
7454 libs: ["foo"],
7455 apex_available: ["myapex"],
7456 sdk_version: "none",
7457 system_modules: "none",
7458 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007459
7460 prebuilt_apis {
7461 name: "sdk",
7462 api_dirs: ["100"],
7463 }
Paul Duffin9b879592020-05-26 13:21:35 +01007464 `, withFiles(filesForSdkLibrary))
7465
7466 // java_sdk_library installs both impl jar and permission XML
7467 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7468 "javalib/bar.jar",
7469 "javalib/foo.jar",
7470 "etc/permissions/foo.xml",
7471 })
7472
7473 // The bar library should depend on the implementation jar.
7474 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007475 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007476 t.Errorf("expected %q, found %#q", expected, actual)
7477 }
7478}
7479
7480func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007481 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007482 apex {
7483 name: "myapex",
7484 key: "myapex.key",
7485 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007486 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007487 }
7488
7489 apex_key {
7490 name: "myapex.key",
7491 public_key: "testkey.avbpubkey",
7492 private_key: "testkey.pem",
7493 }
7494
7495 java_sdk_library {
7496 name: "foo",
7497 srcs: ["a.java"],
7498 api_packages: ["foo"],
7499 apex_available: ["myapex"],
7500 sdk_version: "none",
7501 system_modules: "none",
7502 }
7503
7504 java_library {
7505 name: "bar",
7506 srcs: ["a.java"],
7507 libs: ["foo"],
7508 sdk_version: "none",
7509 system_modules: "none",
7510 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007511
7512 prebuilt_apis {
7513 name: "sdk",
7514 api_dirs: ["100"],
7515 }
Paul Duffin9b879592020-05-26 13:21:35 +01007516 `, withFiles(filesForSdkLibrary))
7517
7518 // java_sdk_library installs both impl jar and permission XML
7519 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7520 "javalib/foo.jar",
7521 "etc/permissions/foo.xml",
7522 })
7523
7524 // The bar library should depend on the stubs jar.
7525 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007526 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007527 t.Errorf("expected %q, found %#q", expected, actual)
7528 }
7529}
7530
Paul Duffineedc5d52020-06-12 17:46:39 +01007531func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007532 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007533 prebuilt_apis {
7534 name: "sdk",
7535 api_dirs: ["100"],
7536 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007537 withFiles(map[string][]byte{
7538 "apex/a.java": nil,
7539 "apex/apex_manifest.json": nil,
7540 "apex/Android.bp": []byte(`
7541 package {
7542 default_visibility: ["//visibility:private"],
7543 }
7544
7545 apex {
7546 name: "myapex",
7547 key: "myapex.key",
7548 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007549 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007550 }
7551
7552 apex_key {
7553 name: "myapex.key",
7554 public_key: "testkey.avbpubkey",
7555 private_key: "testkey.pem",
7556 }
7557
7558 java_library {
7559 name: "bar",
7560 srcs: ["a.java"],
7561 libs: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 }
7566`),
7567 "source/a.java": nil,
7568 "source/api/current.txt": nil,
7569 "source/api/removed.txt": nil,
7570 "source/Android.bp": []byte(`
7571 package {
7572 default_visibility: ["//visibility:private"],
7573 }
7574
7575 java_sdk_library {
7576 name: "foo",
7577 visibility: ["//apex"],
7578 srcs: ["a.java"],
7579 api_packages: ["foo"],
7580 apex_available: ["myapex"],
7581 sdk_version: "none",
7582 system_modules: "none",
7583 public: {
7584 enabled: true,
7585 },
7586 }
7587`),
7588 "prebuilt/a.jar": nil,
7589 "prebuilt/Android.bp": []byte(`
7590 package {
7591 default_visibility: ["//visibility:private"],
7592 }
7593
7594 java_sdk_library_import {
7595 name: "foo",
7596 visibility: ["//apex", "//source"],
7597 apex_available: ["myapex"],
7598 prefer: true,
7599 public: {
7600 jars: ["a.jar"],
7601 },
7602 }
7603`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007604 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007605 )
7606
7607 // java_sdk_library installs both impl jar and permission XML
7608 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7609 "javalib/bar.jar",
7610 "javalib/foo.jar",
7611 "etc/permissions/foo.xml",
7612 })
7613
7614 // The bar library should depend on the implementation jar.
7615 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007616 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007617 t.Errorf("expected %q, found %#q", expected, actual)
7618 }
7619}
7620
7621func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7622 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7623 apex {
7624 name: "myapex",
7625 key: "myapex.key",
7626 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007627 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007628 }
7629
7630 apex_key {
7631 name: "myapex.key",
7632 public_key: "testkey.avbpubkey",
7633 private_key: "testkey.pem",
7634 }
7635
7636 java_sdk_library_import {
7637 name: "foo",
7638 apex_available: ["myapex"],
7639 prefer: true,
7640 public: {
7641 jars: ["a.jar"],
7642 },
7643 }
7644
7645 `, withFiles(filesForSdkLibrary))
7646}
7647
atrost6e126252020-01-27 17:01:16 +00007648func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007649 result := android.GroupFixturePreparers(
7650 prepareForApexTest,
7651 java.PrepareForTestWithPlatformCompatConfig,
7652 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007653 apex {
7654 name: "myapex",
7655 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007656 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007657 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007658 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007659 }
7660
7661 apex_key {
7662 name: "myapex.key",
7663 public_key: "testkey.avbpubkey",
7664 private_key: "testkey.pem",
7665 }
7666
7667 platform_compat_config {
7668 name: "myjar-platform-compat-config",
7669 src: ":myjar",
7670 }
7671
7672 java_library {
7673 name: "myjar",
7674 srcs: ["foo/bar/MyClass.java"],
7675 sdk_version: "none",
7676 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007677 apex_available: [ "myapex" ],
7678 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007679
7680 // Make sure that a preferred prebuilt does not affect the apex contents.
7681 prebuilt_platform_compat_config {
7682 name: "myjar-platform-compat-config",
7683 metadata: "compat-config/metadata.xml",
7684 prefer: true,
7685 }
atrost6e126252020-01-27 17:01:16 +00007686 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007687 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7689 "etc/compatconfig/myjar-platform-compat-config.xml",
7690 "javalib/myjar.jar",
7691 })
7692}
7693
Jooyung Han862c0d62022-12-21 10:15:37 +09007694func TestNoDupeApexFiles(t *testing.T) {
7695 android.GroupFixturePreparers(
7696 android.PrepareForTestWithAndroidBuildComponents,
7697 PrepareForTestWithApexBuildComponents,
7698 prepareForTestWithMyapex,
7699 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7700 ).
7701 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7702 RunTestWithBp(t, `
7703 apex {
7704 name: "myapex",
7705 key: "myapex.key",
7706 prebuilts: ["foo", "bar"],
7707 updatable: false,
7708 }
7709
7710 apex_key {
7711 name: "myapex.key",
7712 public_key: "testkey.avbpubkey",
7713 private_key: "testkey.pem",
7714 }
7715
7716 prebuilt_etc {
7717 name: "foo",
7718 src: "myprebuilt",
7719 filename_from_src: true,
7720 }
7721
7722 prebuilt_etc {
7723 name: "bar",
7724 src: "myprebuilt",
7725 filename_from_src: true,
7726 }
7727 `)
7728}
7729
Jiyong Park479321d2019-12-16 11:47:12 +09007730func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7731 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007736 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 java_library {
7746 name: "myjar",
7747 srcs: ["foo/bar/MyClass.java"],
7748 sdk_version: "none",
7749 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007750 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007751 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007752 }
7753 `)
7754}
7755
Jiyong Park7afd1072019-12-30 16:56:33 +09007756func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007757 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007758 apex {
7759 name: "myapex",
7760 key: "myapex.key",
7761 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007762 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007763 }
7764
7765 apex_key {
7766 name: "myapex.key",
7767 public_key: "testkey.avbpubkey",
7768 private_key: "testkey.pem",
7769 }
7770
7771 cc_library {
7772 name: "mylib",
7773 srcs: ["mylib.cpp"],
7774 system_shared_libs: [],
7775 stl: "none",
7776 required: ["a", "b"],
7777 host_required: ["c", "d"],
7778 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007779 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007780 }
7781 `)
7782
7783 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007784 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007785 name := apexBundle.BaseModuleName()
7786 prefix := "TARGET_"
7787 var builder strings.Builder
7788 data.Custom(&builder, name, prefix, "", data)
7789 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007790 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007791 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7792 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007793}
7794
Jiyong Park7cd10e32020-01-14 09:22:18 +09007795func TestSymlinksFromApexToSystem(t *testing.T) {
7796 bp := `
7797 apex {
7798 name: "myapex",
7799 key: "myapex.key",
7800 native_shared_libs: ["mylib"],
7801 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007802 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007803 }
7804
Jiyong Park9d677202020-02-19 16:29:35 +09007805 apex {
7806 name: "myapex.updatable",
7807 key: "myapex.key",
7808 native_shared_libs: ["mylib"],
7809 java_libs: ["myjar"],
7810 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007811 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007812 }
7813
Jiyong Park7cd10e32020-01-14 09:22:18 +09007814 apex_key {
7815 name: "myapex.key",
7816 public_key: "testkey.avbpubkey",
7817 private_key: "testkey.pem",
7818 }
7819
7820 cc_library {
7821 name: "mylib",
7822 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007823 shared_libs: [
7824 "myotherlib",
7825 "myotherlib_ext",
7826 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007827 system_shared_libs: [],
7828 stl: "none",
7829 apex_available: [
7830 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007831 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007832 "//apex_available:platform",
7833 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007834 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007835 }
7836
7837 cc_library {
7838 name: "myotherlib",
7839 srcs: ["mylib.cpp"],
7840 system_shared_libs: [],
7841 stl: "none",
7842 apex_available: [
7843 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007844 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007845 "//apex_available:platform",
7846 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007847 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007848 }
7849
Jiyong Parkce243632023-02-17 18:22:25 +09007850 cc_library {
7851 name: "myotherlib_ext",
7852 srcs: ["mylib.cpp"],
7853 system_shared_libs: [],
7854 system_ext_specific: true,
7855 stl: "none",
7856 apex_available: [
7857 "myapex",
7858 "myapex.updatable",
7859 "//apex_available:platform",
7860 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007861 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007862 }
7863
Jiyong Park7cd10e32020-01-14 09:22:18 +09007864 java_library {
7865 name: "myjar",
7866 srcs: ["foo/bar/MyClass.java"],
7867 sdk_version: "none",
7868 system_modules: "none",
7869 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007870 apex_available: [
7871 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007872 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007873 "//apex_available:platform",
7874 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007875 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007876 }
7877
7878 java_library {
7879 name: "myotherjar",
7880 srcs: ["foo/bar/MyClass.java"],
7881 sdk_version: "none",
7882 system_modules: "none",
7883 apex_available: [
7884 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007885 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007886 "//apex_available:platform",
7887 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007888 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007889 }
7890 `
7891
7892 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7893 for _, f := range files {
7894 if f.path == file {
7895 if f.isLink {
7896 t.Errorf("%q is not a real file", file)
7897 }
7898 return
7899 }
7900 }
7901 t.Errorf("%q is not found", file)
7902 }
7903
Jiyong Parkce243632023-02-17 18:22:25 +09007904 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007905 for _, f := range files {
7906 if f.path == file {
7907 if !f.isLink {
7908 t.Errorf("%q is not a symlink", file)
7909 }
Jiyong Parkce243632023-02-17 18:22:25 +09007910 if f.src != target {
7911 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7912 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007913 return
7914 }
7915 }
7916 t.Errorf("%q is not found", file)
7917 }
7918
Jiyong Park9d677202020-02-19 16:29:35 +09007919 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7920 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007921 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007922 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007923 ensureRealfileExists(t, files, "javalib/myjar.jar")
7924 ensureRealfileExists(t, files, "lib64/mylib.so")
7925 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007926 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007927
Jiyong Park9d677202020-02-19 16:29:35 +09007928 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7929 ensureRealfileExists(t, files, "javalib/myjar.jar")
7930 ensureRealfileExists(t, files, "lib64/mylib.so")
7931 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007932 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007933
7934 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007935 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007936 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007937 ensureRealfileExists(t, files, "javalib/myjar.jar")
7938 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007939 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7940 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007941
7942 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7943 ensureRealfileExists(t, files, "javalib/myjar.jar")
7944 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007945 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7946 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007947}
7948
Yo Chiange8128052020-07-23 20:09:18 +08007949func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007950 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007951 apex {
7952 name: "myapex",
7953 key: "myapex.key",
7954 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007955 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007956 }
7957
7958 apex_key {
7959 name: "myapex.key",
7960 public_key: "testkey.avbpubkey",
7961 private_key: "testkey.pem",
7962 }
7963
7964 cc_library_shared {
7965 name: "mylib",
7966 srcs: ["mylib.cpp"],
7967 shared_libs: ["myotherlib"],
7968 system_shared_libs: [],
7969 stl: "none",
7970 apex_available: [
7971 "myapex",
7972 "//apex_available:platform",
7973 ],
7974 }
7975
7976 cc_prebuilt_library_shared {
7977 name: "myotherlib",
7978 srcs: ["prebuilt.so"],
7979 system_shared_libs: [],
7980 stl: "none",
7981 apex_available: [
7982 "myapex",
7983 "//apex_available:platform",
7984 ],
7985 }
7986 `)
7987
Prerana Patilb1896c82022-11-09 18:14:34 +00007988 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007989 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007990 var builder strings.Builder
7991 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7992 androidMk := builder.String()
7993 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007994 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007995 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7996 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7997 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007998 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007999}
8000
Jooyung Han643adc42020-02-27 13:50:06 +09008001func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008002 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008003 apex {
8004 name: "myapex",
8005 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09008006 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008007 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008008 }
8009
8010 apex_key {
8011 name: "myapex.key",
8012 public_key: "testkey.avbpubkey",
8013 private_key: "testkey.pem",
8014 }
8015
8016 cc_library {
8017 name: "mylib",
8018 srcs: ["mylib.cpp"],
8019 shared_libs: ["mylib2"],
8020 system_shared_libs: [],
8021 stl: "none",
8022 apex_available: [ "myapex" ],
8023 }
8024
8025 cc_library {
8026 name: "mylib2",
8027 srcs: ["mylib.cpp"],
8028 system_shared_libs: [],
8029 stl: "none",
8030 apex_available: [ "myapex" ],
8031 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008032
8033 rust_ffi_shared {
8034 name: "libfoo.rust",
8035 crate_name: "foo",
8036 srcs: ["foo.rs"],
8037 shared_libs: ["libfoo.shared_from_rust"],
8038 prefer_rlib: true,
8039 apex_available: ["myapex"],
8040 }
8041
8042 cc_library_shared {
8043 name: "libfoo.shared_from_rust",
8044 srcs: ["mylib.cpp"],
8045 system_shared_libs: [],
8046 stl: "none",
8047 stubs: {
8048 versions: ["10", "11", "12"],
8049 },
8050 }
8051
Jooyung Han643adc42020-02-27 13:50:06 +09008052 `)
8053
8054 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8055 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008056 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008057 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8058 "lib64/mylib.so",
8059 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008060 "lib64/libfoo.rust.so",
8061 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8062 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008063 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008064
8065 // b/220397949
8066 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008067}
8068
Jooyung Han49f67012020-04-17 13:43:10 +09008069func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008070 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008071 apex {
8072 name: "myapex",
8073 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008074 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008075 }
8076 apex_key {
8077 name: "myapex.key",
8078 public_key: "testkey.avbpubkey",
8079 private_key: "testkey.pem",
8080 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008081 `,
8082 android.FixtureModifyConfig(func(config android.Config) {
8083 delete(config.Targets, android.Android)
8084 config.AndroidCommonTarget = android.Target{}
8085 }),
8086 )
Jooyung Han49f67012020-04-17 13:43:10 +09008087
8088 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8089 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8090 }
8091}
8092
Jiyong Parkbd159612020-02-28 15:22:21 +09008093func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008094 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008095 apex {
8096 name: "myapex",
8097 key: "myapex.key",
8098 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008099 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008100 }
8101
8102 apex_key {
8103 name: "myapex.key",
8104 public_key: "testkey.avbpubkey",
8105 private_key: "testkey.pem",
8106 }
8107
8108 android_app {
8109 name: "AppFoo",
8110 srcs: ["foo/bar/MyClass.java"],
8111 sdk_version: "none",
8112 system_modules: "none",
8113 apex_available: [ "myapex" ],
8114 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008115 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008116
Colin Crosscf371cc2020-11-13 11:48:42 -08008117 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008118 content := bundleConfigRule.Args["content"]
8119
8120 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008121 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 +09008122}
8123
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008124func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008125 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008126 apex {
8127 name: "myapex",
8128 key: "myapex.key",
8129 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008130 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008131 }
8132
8133 apex_key {
8134 name: "myapex.key",
8135 public_key: "testkey.avbpubkey",
8136 private_key: "testkey.pem",
8137 }
8138
8139 android_app_set {
8140 name: "AppSet",
8141 set: "AppSet.apks",
8142 }`)
8143 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008144 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008145 content := bundleConfigRule.Args["content"]
8146 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8147 s := mod.Rule("apexRule").Args["copy_commands"]
8148 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008149 if len(copyCmds) != 4 {
8150 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008151 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008152 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8153 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008154 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8155 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008156
8157 // Ensure that canned_fs_config has an entry for the app set zip file
8158 generateFsRule := mod.Rule("generateFsConfig")
8159 cmd := generateFsRule.RuleParams.Command
8160 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008161}
8162
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008163func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008164 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008165 apex_set {
8166 name: "myapex",
8167 filename: "foo_v2.apex",
8168 sanitized: {
8169 none: { set: "myapex.apks", },
8170 hwaddress: { set: "myapex.hwasan.apks", },
8171 },
Paul Duffin24704672021-04-06 16:09:30 +01008172 }
8173 `
8174 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008175
Paul Duffin24704672021-04-06 16:09:30 +01008176 // Check that the extractor produces the correct output file from the correct input file.
8177 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008178
Paul Duffin24704672021-04-06 16:09:30 +01008179 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8180 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008181
Paul Duffin24704672021-04-06 16:09:30 +01008182 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8183
8184 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008185 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8186 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008187
8188 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008189}
8190
Pranav Guptaeba03b02022-09-27 00:27:08 +00008191func TestApexSetApksModuleAssignment(t *testing.T) {
8192 ctx := testApex(t, `
8193 apex_set {
8194 name: "myapex",
8195 set: ":myapex_apks_file",
8196 }
8197
8198 filegroup {
8199 name: "myapex_apks_file",
8200 srcs: ["myapex.apks"],
8201 }
8202 `)
8203
8204 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8205
8206 // Check that the extractor produces the correct apks file from the input module
8207 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8208 extractedApex := m.Output(extractorOutput)
8209
8210 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8211}
8212
Paul Duffin89f570a2021-06-16 01:42:33 +01008213func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008214 t.Helper()
8215
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008216 bp := `
8217 java_library {
8218 name: "some-updatable-apex-lib",
8219 srcs: ["a.java"],
8220 sdk_version: "current",
8221 apex_available: [
8222 "some-updatable-apex",
8223 ],
satayevabcd5972021-08-06 17:49:46 +01008224 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00008225 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008226 }
8227
8228 java_library {
8229 name: "some-non-updatable-apex-lib",
8230 srcs: ["a.java"],
8231 apex_available: [
8232 "some-non-updatable-apex",
8233 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01008234 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01008235 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008236 }
8237
8238 bootclasspath_fragment {
8239 name: "some-non-updatable-fragment",
8240 contents: ["some-non-updatable-apex-lib"],
8241 apex_available: [
8242 "some-non-updatable-apex",
8243 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008244 hidden_api: {
8245 split_packages: ["*"],
8246 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008247 }
8248
8249 java_library {
8250 name: "some-platform-lib",
8251 srcs: ["a.java"],
8252 sdk_version: "current",
8253 installable: true,
8254 }
8255
8256 java_library {
8257 name: "some-art-lib",
8258 srcs: ["a.java"],
8259 sdk_version: "current",
8260 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00008261 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008262 ],
8263 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01008264 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008265 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008266 }
8267
8268 apex {
8269 name: "some-updatable-apex",
8270 key: "some-updatable-apex.key",
8271 java_libs: ["some-updatable-apex-lib"],
8272 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008273 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008274 }
8275
8276 apex {
8277 name: "some-non-updatable-apex",
8278 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008279 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008280 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008281 }
8282
8283 apex_key {
8284 name: "some-updatable-apex.key",
8285 }
8286
8287 apex_key {
8288 name: "some-non-updatable-apex.key",
8289 }
8290
8291 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008292 name: "com.android.art.debug",
8293 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008294 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008295 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008296 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008297 }
8298
Paul Duffinf23bc472021-04-27 12:42:20 +01008299 bootclasspath_fragment {
8300 name: "art-bootclasspath-fragment",
8301 image_name: "art",
8302 contents: ["some-art-lib"],
8303 apex_available: [
8304 "com.android.art.debug",
8305 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008306 hidden_api: {
8307 split_packages: ["*"],
8308 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008309 }
8310
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008311 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008312 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008313 }
8314
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008315 filegroup {
8316 name: "some-updatable-apex-file_contexts",
8317 srcs: [
8318 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8319 ],
8320 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008321
8322 filegroup {
8323 name: "some-non-updatable-apex-file_contexts",
8324 srcs: [
8325 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8326 ],
8327 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008328 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008329
Paul Duffin89f570a2021-06-16 01:42:33 +01008330 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008331}
8332
Paul Duffin89f570a2021-06-16 01:42:33 +01008333func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008334 t.Helper()
8335
Paul Duffin55607122021-03-30 23:32:51 +01008336 fs := android.MockFS{
8337 "a.java": nil,
8338 "a.jar": nil,
8339 "apex_manifest.json": nil,
8340 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008341 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008342 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8343 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8344 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008345 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008346 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008347
Paul Duffin55607122021-03-30 23:32:51 +01008348 errorHandler := android.FixtureExpectsNoErrors
8349 if errmsg != "" {
8350 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008351 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008352
Paul Duffin55607122021-03-30 23:32:51 +01008353 result := android.GroupFixturePreparers(
8354 cc.PrepareForTestWithCcDefaultModules,
8355 java.PrepareForTestWithHiddenApiBuildComponents,
8356 java.PrepareForTestWithJavaDefaultModules,
8357 java.PrepareForTestWithJavaSdkLibraryFiles,
8358 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008359 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008360 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008361 android.FixtureModifyMockFS(func(fs android.MockFS) {
8362 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8363 insert := ""
8364 for _, fragment := range fragments {
8365 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8366 }
8367 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8368 platform_bootclasspath {
8369 name: "platform-bootclasspath",
8370 fragments: [
8371 %s
8372 ],
8373 }
8374 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008375 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008376 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008377 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008378 ).
8379 ExtendWithErrorHandler(errorHandler).
8380 RunTestWithBp(t, bp)
8381
8382 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008383}
8384
Paul Duffin5556c5f2022-06-09 17:32:21 +00008385func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008386 preparers := android.GroupFixturePreparers(
8387 java.PrepareForTestWithJavaDefaultModules,
8388 PrepareForTestWithApexBuildComponents,
8389 ).
8390 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8391 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8392
8393 bpBase := `
8394 apex_set {
8395 name: "com.android.myapex",
8396 installable: true,
8397 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8398 set: "myapex.apks",
8399 }
8400
8401 apex_set {
8402 name: "com.mycompany.android.myapex",
8403 apex_name: "com.android.myapex",
8404 installable: true,
8405 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8406 set: "company-myapex.apks",
8407 }
8408
8409 prebuilt_bootclasspath_fragment {
8410 name: "my-bootclasspath-fragment",
8411 apex_available: ["com.android.myapex"],
8412 %s
8413 }
8414 `
8415
8416 t.Run("java_import", func(t *testing.T) {
8417 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8418 java_import {
8419 name: "libfoo",
8420 jars: ["libfoo.jar"],
8421 apex_available: ["com.android.myapex"],
8422 }
8423 `)
8424 })
8425
8426 t.Run("java_sdk_library_import", func(t *testing.T) {
8427 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8428 java_sdk_library_import {
8429 name: "libfoo",
8430 public: {
8431 jars: ["libbar.jar"],
8432 },
8433 apex_available: ["com.android.myapex"],
8434 }
8435 `)
8436 })
8437
8438 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8439 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8440 image_name: "art",
8441 contents: ["libfoo"],
8442 `)+`
8443 java_sdk_library_import {
8444 name: "libfoo",
8445 public: {
8446 jars: ["libbar.jar"],
8447 },
8448 apex_available: ["com.android.myapex"],
8449 }
8450 `)
8451 })
8452}
8453
Paul Duffin5556c5f2022-06-09 17:32:21 +00008454func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8455 preparers := android.GroupFixturePreparers(
8456 java.PrepareForTestWithJavaDefaultModules,
8457 PrepareForTestWithApexBuildComponents,
8458 )
8459
8460 bpBase := `
8461 apex_set {
8462 name: "com.android.myapex",
8463 installable: true,
8464 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8465 set: "myapex.apks",
8466 }
8467
8468 apex_set {
8469 name: "com.android.myapex_compressed",
8470 apex_name: "com.android.myapex",
8471 installable: true,
8472 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8473 set: "myapex_compressed.apks",
8474 }
8475
8476 prebuilt_bootclasspath_fragment {
8477 name: "my-bootclasspath-fragment",
8478 apex_available: [
8479 "com.android.myapex",
8480 "com.android.myapex_compressed",
8481 ],
8482 hidden_api: {
8483 annotation_flags: "annotation-flags.csv",
8484 metadata: "metadata.csv",
8485 index: "index.csv",
8486 signature_patterns: "signature_patterns.csv",
8487 },
8488 %s
8489 }
8490 `
8491
8492 t.Run("java_import", func(t *testing.T) {
8493 result := preparers.RunTestWithBp(t,
8494 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8495 java_import {
8496 name: "libfoo",
8497 jars: ["libfoo.jar"],
8498 apex_available: [
8499 "com.android.myapex",
8500 "com.android.myapex_compressed",
8501 ],
8502 }
8503 `)
8504
8505 module := result.Module("libfoo", "android_common_com.android.myapex")
8506 usesLibraryDep := module.(java.UsesLibraryDependency)
8507 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8508 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8509 usesLibraryDep.DexJarBuildPath().Path())
8510 })
8511
8512 t.Run("java_sdk_library_import", func(t *testing.T) {
8513 result := preparers.RunTestWithBp(t,
8514 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8515 java_sdk_library_import {
8516 name: "libfoo",
8517 public: {
8518 jars: ["libbar.jar"],
8519 },
8520 apex_available: [
8521 "com.android.myapex",
8522 "com.android.myapex_compressed",
8523 ],
8524 compile_dex: true,
8525 }
8526 `)
8527
8528 module := result.Module("libfoo", "android_common_com.android.myapex")
8529 usesLibraryDep := module.(java.UsesLibraryDependency)
8530 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8531 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8532 usesLibraryDep.DexJarBuildPath().Path())
8533 })
8534
8535 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8536 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8537 image_name: "art",
8538 contents: ["libfoo"],
8539 `)+`
8540 java_sdk_library_import {
8541 name: "libfoo",
8542 public: {
8543 jars: ["libbar.jar"],
8544 },
8545 apex_available: [
8546 "com.android.myapex",
8547 "com.android.myapex_compressed",
8548 ],
8549 compile_dex: true,
8550 }
8551 `)
8552 })
8553}
8554
Jooyung Han548640b2020-04-27 12:10:30 +09008555func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8556 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8557 apex {
8558 name: "myapex",
8559 key: "myapex.key",
8560 updatable: true,
8561 }
8562
8563 apex_key {
8564 name: "myapex.key",
8565 public_key: "testkey.avbpubkey",
8566 private_key: "testkey.pem",
8567 }
8568 `)
8569}
8570
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008571func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8572 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8573 apex {
8574 name: "myapex",
8575 key: "myapex.key",
8576 }
8577
8578 apex_key {
8579 name: "myapex.key",
8580 public_key: "testkey.avbpubkey",
8581 private_key: "testkey.pem",
8582 }
8583 `)
8584}
8585
Jooyung Handfc864c2023-03-20 18:19:07 +09008586func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8587 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008588 apex {
8589 name: "myapex",
8590 key: "myapex.key",
8591 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008592 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008593 soc_specific: true,
8594 }
8595
8596 apex_key {
8597 name: "myapex.key",
8598 public_key: "testkey.avbpubkey",
8599 private_key: "testkey.pem",
8600 }
8601 `)
8602}
8603
Jooyung Han02873da2023-03-22 17:41:03 +09008604func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8605 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8606 apex {
8607 name: "myapex",
8608 key: "myapex.key",
8609 updatable: false,
8610 min_sdk_version: "29",
8611 use_vndk_as_stable: true,
8612 vendor: true,
8613 }
8614
8615 apex_key {
8616 name: "myapex.key",
8617 public_key: "testkey.avbpubkey",
8618 private_key: "testkey.pem",
8619 }
8620 `)
8621}
8622
Jooyung Handfc864c2023-03-20 18:19:07 +09008623func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8624 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8625 apex {
8626 name: "myapex",
8627 key: "myapex.key",
8628 updatable: false,
8629 use_vndk_as_stable: true,
8630 }
8631
8632 apex_key {
8633 name: "myapex.key",
8634 public_key: "testkey.avbpubkey",
8635 private_key: "testkey.pem",
8636 }
8637 `)
8638}
8639
satayevb98371c2021-06-15 16:49:50 +01008640func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8641 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8642 apex {
8643 name: "myapex",
8644 key: "myapex.key",
8645 systemserverclasspath_fragments: [
8646 "mysystemserverclasspathfragment",
8647 ],
8648 min_sdk_version: "29",
8649 updatable: true,
8650 }
8651
8652 apex_key {
8653 name: "myapex.key",
8654 public_key: "testkey.avbpubkey",
8655 private_key: "testkey.pem",
8656 }
8657
8658 java_library {
8659 name: "foo",
8660 srcs: ["b.java"],
8661 min_sdk_version: "29",
8662 installable: true,
8663 apex_available: [
8664 "myapex",
8665 ],
8666 }
8667
8668 systemserverclasspath_fragment {
8669 name: "mysystemserverclasspathfragment",
8670 generate_classpaths_proto: false,
8671 contents: [
8672 "foo",
8673 ],
8674 apex_available: [
8675 "myapex",
8676 ],
8677 }
satayevabcd5972021-08-06 17:49:46 +01008678 `,
8679 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8680 )
satayevb98371c2021-06-15 16:49:50 +01008681}
8682
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008683func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008684 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8685 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8686 // modules to be included in the BootJars.
8687 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8688 return android.GroupFixturePreparers(
8689 dexpreopt.FixtureSetBootJars(bootJars...),
8690 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8691 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8692 }),
8693 )
8694 }
8695
8696 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8697 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8698 // specified in the ArtApexJars configuration.
8699 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8700 return android.GroupFixturePreparers(
8701 dexpreopt.FixtureSetArtBootJars(bootJars...),
8702 dexpreopt.FixtureSetBootJars(bootJars...),
8703 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8704 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8705 }),
8706 )
8707 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008708
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008709 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008710 preparer := android.GroupFixturePreparers(
8711 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8712 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8713 )
8714 fragments := []java.ApexVariantReference{
8715 {
8716 Apex: proptools.StringPtr("com.android.art.debug"),
8717 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8718 },
8719 {
8720 Apex: proptools.StringPtr("some-non-updatable-apex"),
8721 Module: proptools.StringPtr("some-non-updatable-fragment"),
8722 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008723 }
satayevabcd5972021-08-06 17:49:46 +01008724 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008725 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008726
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008727 t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
8728 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the platform bootclasspath`
Paul Duffin60264a02021-04-12 20:02:36 +01008729 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008730 preparer := android.GroupFixturePreparers(
8731 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8732 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8733 )
Paul Duffin60264a02021-04-12 20:02:36 +01008734 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008735 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008736
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008737 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008738 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008739 // Update the dexpreopt ArtApexJars directly.
8740 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8741 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008742 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008743
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008744 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008745 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008746 // Update the dexpreopt ArtApexJars directly.
8747 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8748 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008749 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008750
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008751 t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
8752 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the platform bootclasspath`
satayevabcd5972021-08-06 17:49:46 +01008753 preparer := android.GroupFixturePreparers(
8754 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8755 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8756 )
Paul Duffin60264a02021-04-12 20:02:36 +01008757 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008758 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008759
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008760 t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008761 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008762 fragment := java.ApexVariantReference{
8763 Apex: proptools.StringPtr("some-non-updatable-apex"),
8764 Module: proptools.StringPtr("some-non-updatable-fragment"),
8765 }
8766 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008767 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008768
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008769 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008770 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008771 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8772 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008773 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008774
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008775 t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008776 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008777 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8778 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008779 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008780
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008781 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008782 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008783 // Update the dexpreopt ArtApexJars directly.
8784 preparer := prepareSetArtJars("platform:some-platform-lib")
8785 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008786 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008787
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008788 t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008789 preparer := android.GroupFixturePreparers(
8790 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8791 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8792 )
8793 fragments := []java.ApexVariantReference{
8794 {
8795 Apex: proptools.StringPtr("some-non-updatable-apex"),
8796 Module: proptools.StringPtr("some-non-updatable-fragment"),
8797 },
8798 }
8799 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008800 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008801}
8802
8803func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008804 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008805 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008806 fragment := java.ApexVariantReference{
8807 Apex: proptools.StringPtr("myapex"),
8808 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8809 }
8810
Paul Duffin064b70c2020-11-02 17:32:38 +00008811 testDexpreoptWithApexes(t, `
8812 prebuilt_apex {
8813 name: "myapex" ,
8814 arch: {
8815 arm64: {
8816 src: "myapex-arm64.apex",
8817 },
8818 arm: {
8819 src: "myapex-arm.apex",
8820 },
8821 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008822 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8823 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008824
Paul Duffin89f570a2021-06-16 01:42:33 +01008825 prebuilt_bootclasspath_fragment {
8826 name: "my-bootclasspath-fragment",
8827 contents: ["libfoo"],
8828 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008829 hidden_api: {
8830 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8831 metadata: "my-bootclasspath-fragment/metadata.csv",
8832 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008833 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8834 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8835 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008836 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008837 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008838
Paul Duffin89f570a2021-06-16 01:42:33 +01008839 java_import {
8840 name: "libfoo",
8841 jars: ["libfoo.jar"],
8842 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008843 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008844 }
8845 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008846 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008847}
8848
Spandan Dasf14e2542021-11-12 00:01:37 +00008849func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008850 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008851 bp += `
8852 apex_key {
8853 name: "myapex.key",
8854 public_key: "testkey.avbpubkey",
8855 private_key: "testkey.pem",
8856 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008857 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008858 "lib1/src/A.java": nil,
8859 "lib2/src/B.java": nil,
8860 "system/sepolicy/apex/myapex-file_contexts": nil,
8861 }
8862
Paul Duffin45338f02021-03-30 23:07:52 +01008863 errorHandler := android.FixtureExpectsNoErrors
8864 if errmsg != "" {
8865 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008866 }
Colin Crossae8600b2020-10-29 17:09:13 -07008867
Paul Duffin45338f02021-03-30 23:07:52 +01008868 android.GroupFixturePreparers(
8869 android.PrepareForTestWithAndroidBuildComponents,
8870 java.PrepareForTestWithJavaBuildComponents,
8871 PrepareForTestWithApexBuildComponents,
8872 android.PrepareForTestWithNeverallowRules(rules),
8873 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008874 apexBootJars := make([]string, 0, len(bootJars))
8875 for _, apexBootJar := range bootJars {
8876 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008877 }
satayevd604b212021-07-21 14:23:52 +01008878 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008879 }),
8880 fs.AddToFixture(),
8881 ).
8882 ExtendWithErrorHandler(errorHandler).
8883 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008884}
8885
8886func TestApexPermittedPackagesRules(t *testing.T) {
8887 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008888 name string
8889 expectedError string
8890 bp string
8891 bootJars []string
8892 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008893 }{
8894
8895 {
8896 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8897 expectedError: "",
8898 bp: `
8899 java_library {
8900 name: "bcp_lib1",
8901 srcs: ["lib1/src/*.java"],
8902 permitted_packages: ["foo.bar"],
8903 apex_available: ["myapex"],
8904 sdk_version: "none",
8905 system_modules: "none",
8906 }
8907 java_library {
8908 name: "nonbcp_lib2",
8909 srcs: ["lib2/src/*.java"],
8910 apex_available: ["myapex"],
8911 permitted_packages: ["a.b"],
8912 sdk_version: "none",
8913 system_modules: "none",
8914 }
8915 apex {
8916 name: "myapex",
8917 key: "myapex.key",
8918 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008919 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008920 }`,
8921 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008922 bcpPermittedPackages: map[string][]string{
8923 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008924 "foo.bar",
8925 },
8926 },
8927 },
8928 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008929 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008930 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 +01008931 bp: `
8932 java_library {
8933 name: "bcp_lib1",
8934 srcs: ["lib1/src/*.java"],
8935 apex_available: ["myapex"],
8936 permitted_packages: ["foo.bar"],
8937 sdk_version: "none",
8938 system_modules: "none",
8939 }
8940 java_library {
8941 name: "bcp_lib2",
8942 srcs: ["lib2/src/*.java"],
8943 apex_available: ["myapex"],
8944 permitted_packages: ["foo.bar", "bar.baz"],
8945 sdk_version: "none",
8946 system_modules: "none",
8947 }
8948 apex {
8949 name: "myapex",
8950 key: "myapex.key",
8951 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008952 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008953 }
8954 `,
8955 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008956 bcpPermittedPackages: map[string][]string{
8957 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008958 "foo.bar",
8959 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008960 "bcp_lib2": []string{
8961 "foo.bar",
8962 },
8963 },
8964 },
8965 {
8966 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8967 expectedError: "",
8968 bp: `
8969 java_library {
8970 name: "bcp_lib_restricted",
8971 srcs: ["lib1/src/*.java"],
8972 apex_available: ["myapex"],
8973 permitted_packages: ["foo.bar"],
8974 sdk_version: "none",
8975 min_sdk_version: "29",
8976 system_modules: "none",
8977 }
8978 java_library {
8979 name: "bcp_lib_unrestricted",
8980 srcs: ["lib2/src/*.java"],
8981 apex_available: ["myapex"],
8982 permitted_packages: ["foo.bar", "bar.baz"],
8983 sdk_version: "none",
8984 min_sdk_version: "29",
8985 system_modules: "none",
8986 }
8987 apex {
8988 name: "myapex",
8989 key: "myapex.key",
8990 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8991 updatable: true,
8992 min_sdk_version: "29",
8993 }
8994 `,
8995 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8996 bcpPermittedPackages: map[string][]string{
8997 "bcp_lib1_non_updateable": []string{
8998 "foo.bar",
8999 },
9000 // 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 +01009001 },
9002 },
9003 }
9004 for _, tc := range testcases {
9005 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009006 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9007 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009008 })
9009 }
9010}
9011
Jiyong Park62304bb2020-04-13 16:19:48 +09009012func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009013 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009014 apex {
9015 name: "myapex",
9016 key: "myapex.key",
9017 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009018 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009019 }
9020
9021 apex_key {
9022 name: "myapex.key",
9023 public_key: "testkey.avbpubkey",
9024 private_key: "testkey.pem",
9025 }
9026
9027 cc_library {
9028 name: "mylib",
9029 srcs: ["mylib.cpp"],
9030 system_shared_libs: [],
9031 stl: "none",
9032 stubs: {
9033 versions: ["1"],
9034 },
9035 apex_available: ["myapex"],
9036 }
9037
9038 cc_library {
9039 name: "myprivlib",
9040 srcs: ["mylib.cpp"],
9041 system_shared_libs: [],
9042 stl: "none",
9043 apex_available: ["myapex"],
9044 }
9045
9046
9047 cc_test {
9048 name: "mytest",
9049 gtest: false,
9050 srcs: ["mylib.cpp"],
9051 system_shared_libs: [],
9052 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009053 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009054 test_for: ["myapex"]
9055 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009056
9057 cc_library {
9058 name: "mytestlib",
9059 srcs: ["mylib.cpp"],
9060 system_shared_libs: [],
9061 shared_libs: ["mylib", "myprivlib"],
9062 stl: "none",
9063 test_for: ["myapex"],
9064 }
9065
9066 cc_benchmark {
9067 name: "mybench",
9068 srcs: ["mylib.cpp"],
9069 system_shared_libs: [],
9070 shared_libs: ["mylib", "myprivlib"],
9071 stl: "none",
9072 test_for: ["myapex"],
9073 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009074 `)
9075
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009076 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009077 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009078 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9079 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9080 }
9081
9082 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009083 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009084 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9085 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9086 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9087}
Jiyong Park46a512f2020-12-04 18:02:13 +09009088
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009089func TestIndirectTestFor(t *testing.T) {
9090 ctx := testApex(t, `
9091 apex {
9092 name: "myapex",
9093 key: "myapex.key",
9094 native_shared_libs: ["mylib", "myprivlib"],
9095 updatable: false,
9096 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009097
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009098 apex_key {
9099 name: "myapex.key",
9100 public_key: "testkey.avbpubkey",
9101 private_key: "testkey.pem",
9102 }
9103
9104 cc_library {
9105 name: "mylib",
9106 srcs: ["mylib.cpp"],
9107 system_shared_libs: [],
9108 stl: "none",
9109 stubs: {
9110 versions: ["1"],
9111 },
9112 apex_available: ["myapex"],
9113 }
9114
9115 cc_library {
9116 name: "myprivlib",
9117 srcs: ["mylib.cpp"],
9118 system_shared_libs: [],
9119 stl: "none",
9120 shared_libs: ["mylib"],
9121 apex_available: ["myapex"],
9122 }
9123
9124 cc_library {
9125 name: "mytestlib",
9126 srcs: ["mylib.cpp"],
9127 system_shared_libs: [],
9128 shared_libs: ["myprivlib"],
9129 stl: "none",
9130 test_for: ["myapex"],
9131 }
9132 `)
9133
9134 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009135 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009136 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9137 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9138 }
9139
9140 // The platform variant of mytestlib links to the platform variant of the
9141 // internal myprivlib.
9142 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9143
9144 // The platform variant of myprivlib links to the platform variant of mylib
9145 // and bypasses its stubs.
9146 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 +09009147}
9148
Martin Stjernholmec009002021-03-27 15:18:31 +00009149func TestTestForForLibInOtherApex(t *testing.T) {
9150 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9151 _ = testApex(t, `
9152 apex {
9153 name: "com.android.art",
9154 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009155 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009156 updatable: false,
9157 }
9158
9159 apex {
9160 name: "com.android.art.debug",
9161 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009162 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009163 updatable: false,
9164 }
9165
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171
9172 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009173 name: "libnativebridge",
9174 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009175 system_shared_libs: [],
9176 stl: "none",
9177 stubs: {
9178 versions: ["1"],
9179 },
9180 apex_available: ["com.android.art", "com.android.art.debug"],
9181 }
9182
9183 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009184 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009185 srcs: ["mylib.cpp"],
9186 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009187 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009188 stl: "none",
9189 apex_available: ["com.android.art.debug"],
9190 test_for: ["com.android.art"],
9191 }
9192 `,
9193 android.MockFS{
9194 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9195 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9196 }.AddToFixture())
9197}
9198
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009199// TODO(jungjw): Move this to proptools
9200func intPtr(i int) *int {
9201 return &i
9202}
9203
9204func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009205 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009206 apex_set {
9207 name: "myapex",
9208 set: "myapex.apks",
9209 filename: "foo_v2.apex",
9210 overrides: ["foo"],
9211 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009212 `,
9213 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9214 variables.Platform_sdk_version = intPtr(30)
9215 }),
9216 android.FixtureModifyConfig(func(config android.Config) {
9217 config.Targets[android.Android] = []android.Target{
9218 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9219 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9220 }
9221 }),
9222 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009223
Paul Duffin24704672021-04-06 16:09:30 +01009224 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009225
9226 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009227 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009228 actual := extractedApex.Args["abis"]
9229 expected := "ARMEABI_V7A,ARM64_V8A"
9230 if actual != expected {
9231 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9232 }
9233 actual = extractedApex.Args["sdk-version"]
9234 expected = "30"
9235 if actual != expected {
9236 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9237 }
9238
Paul Duffin6717d882021-06-15 19:09:41 +01009239 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009240 a := m.Module().(*ApexSet)
9241 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009242 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009243 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9244 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9245 }
9246}
9247
Anton Hansson805e0a52022-11-25 14:06:46 +00009248func TestApexSet_NativeBridge(t *testing.T) {
9249 ctx := testApex(t, `
9250 apex_set {
9251 name: "myapex",
9252 set: "myapex.apks",
9253 filename: "foo_v2.apex",
9254 overrides: ["foo"],
9255 }
9256 `,
9257 android.FixtureModifyConfig(func(config android.Config) {
9258 config.Targets[android.Android] = []android.Target{
9259 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9260 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9261 }
9262 }),
9263 )
9264
9265 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9266
9267 // Check extract_apks tool parameters. No native bridge arch expected
9268 extractedApex := m.Output("extracted/myapex.apks")
9269 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9270}
9271
Jiyong Park7d95a512020-05-10 15:16:24 +09009272func TestNoStaticLinkingToStubsLib(t *testing.T) {
9273 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9274 apex {
9275 name: "myapex",
9276 key: "myapex.key",
9277 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009278 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009279 }
9280
9281 apex_key {
9282 name: "myapex.key",
9283 public_key: "testkey.avbpubkey",
9284 private_key: "testkey.pem",
9285 }
9286
9287 cc_library {
9288 name: "mylib",
9289 srcs: ["mylib.cpp"],
9290 static_libs: ["otherlib"],
9291 system_shared_libs: [],
9292 stl: "none",
9293 apex_available: [ "myapex" ],
9294 }
9295
9296 cc_library {
9297 name: "otherlib",
9298 srcs: ["mylib.cpp"],
9299 system_shared_libs: [],
9300 stl: "none",
9301 stubs: {
9302 versions: ["1", "2", "3"],
9303 },
9304 apex_available: [ "myapex" ],
9305 }
9306 `)
9307}
9308
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009309func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009310 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009311 apex {
9312 name: "myapex",
9313 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009314 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009315 custom_sign_tool: "sign_myapex",
9316 }
9317
9318 apex_key {
9319 name: "myapex.key",
9320 public_key: "testkey.avbpubkey",
9321 private_key: "testkey.pem",
9322 }
9323 `)
9324
9325 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9326 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9327 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
9328}
9329
9330func TestApexKeysTxtOverrides(t *testing.T) {
9331 ctx := testApex(t, `
9332 apex {
9333 name: "myapex",
9334 key: "myapex.key",
9335 updatable: false,
9336 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009337 }
9338
9339 apex_key {
9340 name: "myapex.key",
9341 public_key: "testkey.avbpubkey",
9342 private_key: "testkey.pem",
9343 }
9344
9345 prebuilt_apex {
9346 name: "myapex",
9347 prefer: true,
9348 arch: {
9349 arm64: {
9350 src: "myapex-arm64.apex",
9351 },
9352 arm: {
9353 src: "myapex-arm.apex",
9354 },
9355 },
9356 }
9357
9358 apex_set {
9359 name: "myapex_set",
9360 set: "myapex.apks",
9361 filename: "myapex_set.apex",
9362 overrides: ["myapex"],
9363 }
9364 `)
9365
9366 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9367 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9368 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 +09009369 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 +09009370}
9371
Jooyung Han938b5932020-06-20 12:47:47 +09009372func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009373 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009374 apex {
9375 name: "myapex",
9376 key: "myapex.key",
9377 apps: ["app"],
9378 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009379 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009380 }
9381
9382 apex_key {
9383 name: "myapex.key",
9384 public_key: "testkey.avbpubkey",
9385 private_key: "testkey.pem",
9386 }
9387
9388 android_app {
9389 name: "app",
9390 srcs: ["foo/bar/MyClass.java"],
9391 package_name: "foo",
9392 sdk_version: "none",
9393 system_modules: "none",
9394 apex_available: [ "myapex" ],
9395 }
9396 `, withFiles(map[string][]byte{
9397 "sub/Android.bp": []byte(`
9398 override_apex {
9399 name: "override_myapex",
9400 base: "myapex",
9401 apps: ["override_app"],
9402 allowed_files: ":allowed",
9403 }
9404 // Overridable "path" property should be referenced indirectly
9405 filegroup {
9406 name: "allowed",
9407 srcs: ["allowed.txt"],
9408 }
9409 override_android_app {
9410 name: "override_app",
9411 base: "app",
9412 package_name: "bar",
9413 }
9414 `),
9415 }))
9416
9417 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9418 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9419 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9420 }
9421
9422 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9423 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9424 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9425 }
9426}
9427
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009428func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009429 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009430 apex {
9431 name: "myapex",
9432 key: "myapex.key",
9433 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009434 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009435 }
9436
9437 apex_key {
9438 name: "myapex.key",
9439 public_key: "testkey.avbpubkey",
9440 private_key: "testkey.pem",
9441 }
9442
9443 cc_library {
9444 name: "mylib",
9445 srcs: ["mylib.cpp"],
9446 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009447 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009448 },
9449 apex_available: ["myapex"],
9450 }
9451
9452 cc_prebuilt_library_shared {
9453 name: "mylib",
9454 prefer: false,
9455 srcs: ["prebuilt.so"],
9456 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009457 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009458 },
9459 apex_available: ["myapex"],
9460 }
9461 `)
9462}
9463
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009464func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009465 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009466 apex {
9467 name: "myapex",
9468 key: "myapex.key",
9469 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009470 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009471 }
9472 apex_key {
9473 name: "myapex.key",
9474 public_key: "testkey.avbpubkey",
9475 private_key: "testkey.pem",
9476 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009477 `,
9478 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9479 variables.CompressedApex = proptools.BoolPtr(true)
9480 }),
9481 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009482
9483 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9484 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9485
9486 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9487 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9488
9489 // Make sure output of bundle is .capex
9490 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9491 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9492
9493 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009494 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009495 var builder strings.Builder
9496 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9497 androidMk := builder.String()
9498 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9499}
9500
Martin Stjernholm2856c662020-12-02 15:03:42 +00009501func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009502 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009503 apex {
9504 name: "myapex",
9505 key: "myapex.key",
9506 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009507 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009508 }
9509
9510 apex_key {
9511 name: "myapex.key",
9512 public_key: "testkey.avbpubkey",
9513 private_key: "testkey.pem",
9514 }
9515
9516 cc_library {
9517 name: "mylib",
9518 srcs: ["mylib.cpp"],
9519 apex_available: ["myapex"],
9520 shared_libs: ["otherlib"],
9521 system_shared_libs: [],
9522 }
9523
9524 cc_library {
9525 name: "otherlib",
9526 srcs: ["mylib.cpp"],
9527 stubs: {
9528 versions: ["current"],
9529 },
9530 }
9531
9532 cc_prebuilt_library_shared {
9533 name: "otherlib",
9534 prefer: true,
9535 srcs: ["prebuilt.so"],
9536 stubs: {
9537 versions: ["current"],
9538 },
9539 }
9540 `)
9541
9542 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009543 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009544 var builder strings.Builder
9545 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9546 androidMk := builder.String()
9547
9548 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9549 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009550 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009551}
9552
Jiyong Parke3867542020-12-03 17:28:25 +09009553func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009554 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009555 apex {
9556 name: "myapex",
9557 key: "myapex.key",
9558 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009559 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009560 }
9561
9562 apex_key {
9563 name: "myapex.key",
9564 public_key: "testkey.avbpubkey",
9565 private_key: "testkey.pem",
9566 }
9567
9568 cc_library {
9569 name: "mylib",
9570 srcs: ["mylib.cpp"],
9571 system_shared_libs: [],
9572 stl: "none",
9573 apex_available: ["myapex"],
9574 shared_libs: ["mylib2"],
9575 target: {
9576 apex: {
9577 exclude_shared_libs: ["mylib2"],
9578 },
9579 },
9580 }
9581
9582 cc_library {
9583 name: "mylib2",
9584 srcs: ["mylib.cpp"],
9585 system_shared_libs: [],
9586 stl: "none",
9587 }
9588 `)
9589
9590 // Check if mylib is linked to mylib2 for the non-apex target
9591 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9592 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9593
9594 // Make sure that the link doesn't occur for the apex target
9595 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9596 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9597
9598 // It shouldn't appear in the copy cmd as well.
9599 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9600 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9601}
9602
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009603func TestPrebuiltStubLibDep(t *testing.T) {
9604 bpBase := `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009609 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009610 }
9611 apex_key {
9612 name: "myapex.key",
9613 public_key: "testkey.avbpubkey",
9614 private_key: "testkey.pem",
9615 }
9616 cc_library {
9617 name: "mylib",
9618 srcs: ["mylib.cpp"],
9619 apex_available: ["myapex"],
9620 shared_libs: ["stublib"],
9621 system_shared_libs: [],
9622 }
9623 apex {
9624 name: "otherapex",
9625 enabled: %s,
9626 key: "myapex.key",
9627 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009628 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009629 }
9630 `
9631
9632 stublibSourceBp := `
9633 cc_library {
9634 name: "stublib",
9635 srcs: ["mylib.cpp"],
9636 apex_available: ["otherapex"],
9637 system_shared_libs: [],
9638 stl: "none",
9639 stubs: {
9640 versions: ["1"],
9641 },
9642 }
9643 `
9644
9645 stublibPrebuiltBp := `
9646 cc_prebuilt_library_shared {
9647 name: "stublib",
9648 srcs: ["prebuilt.so"],
9649 apex_available: ["otherapex"],
9650 stubs: {
9651 versions: ["1"],
9652 },
9653 %s
9654 }
9655 `
9656
9657 tests := []struct {
9658 name string
9659 stublibBp string
9660 usePrebuilt bool
9661 modNames []string // Modules to collect AndroidMkEntries for
9662 otherApexEnabled []string
9663 }{
9664 {
9665 name: "only_source",
9666 stublibBp: stublibSourceBp,
9667 usePrebuilt: false,
9668 modNames: []string{"stublib"},
9669 otherApexEnabled: []string{"true", "false"},
9670 },
9671 {
9672 name: "source_preferred",
9673 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9674 usePrebuilt: false,
9675 modNames: []string{"stublib", "prebuilt_stublib"},
9676 otherApexEnabled: []string{"true", "false"},
9677 },
9678 {
9679 name: "prebuilt_preferred",
9680 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9681 usePrebuilt: true,
9682 modNames: []string{"stublib", "prebuilt_stublib"},
9683 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9684 },
9685 {
9686 name: "only_prebuilt",
9687 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9688 usePrebuilt: true,
9689 modNames: []string{"stublib"},
9690 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9691 },
9692 }
9693
9694 for _, test := range tests {
9695 t.Run(test.name, func(t *testing.T) {
9696 for _, otherApexEnabled := range test.otherApexEnabled {
9697 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009698 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009699
9700 type modAndMkEntries struct {
9701 mod *cc.Module
9702 mkEntries android.AndroidMkEntries
9703 }
9704 entries := []*modAndMkEntries{}
9705
9706 // Gather shared lib modules that are installable
9707 for _, modName := range test.modNames {
9708 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9709 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9710 continue
9711 }
9712 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009713 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009714 continue
9715 }
Colin Crossaa255532020-07-03 13:18:24 -07009716 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009717 if ent.Disabled {
9718 continue
9719 }
9720 entries = append(entries, &modAndMkEntries{
9721 mod: mod,
9722 mkEntries: ent,
9723 })
9724 }
9725 }
9726 }
9727
9728 var entry *modAndMkEntries = nil
9729 for _, ent := range entries {
9730 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9731 if entry != nil {
9732 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9733 } else {
9734 entry = ent
9735 }
9736 }
9737 }
9738
9739 if entry == nil {
9740 t.Errorf("AndroidMk entry for \"stublib\" missing")
9741 } else {
9742 isPrebuilt := entry.mod.Prebuilt() != nil
9743 if isPrebuilt != test.usePrebuilt {
9744 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9745 }
9746 if !entry.mod.IsStubs() {
9747 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9748 }
9749 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9750 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9751 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009752 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009753 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009754 if !android.InList(expected, cflags) {
9755 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9756 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009757 }
9758 })
9759 }
9760 })
9761 }
9762}
9763
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009764func TestHostApexInHostOnlyBuild(t *testing.T) {
9765 testApex(t, `
9766 apex {
9767 name: "myapex",
9768 host_supported: true,
9769 key: "myapex.key",
9770 updatable: false,
9771 payload_type: "zip",
9772 }
9773 apex_key {
9774 name: "myapex.key",
9775 public_key: "testkey.avbpubkey",
9776 private_key: "testkey.pem",
9777 }
9778 `,
9779 android.FixtureModifyConfig(func(config android.Config) {
9780 // We may not have device targets in all builds, e.g. in
9781 // prebuilts/build-tools/build-prebuilts.sh
9782 config.Targets[android.Android] = []android.Target{}
9783 }))
9784}
9785
Colin Crossc33e5212021-05-25 18:16:02 -07009786func TestApexJavaCoverage(t *testing.T) {
9787 bp := `
9788 apex {
9789 name: "myapex",
9790 key: "myapex.key",
9791 java_libs: ["mylib"],
9792 bootclasspath_fragments: ["mybootclasspathfragment"],
9793 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9794 updatable: false,
9795 }
9796
9797 apex_key {
9798 name: "myapex.key",
9799 public_key: "testkey.avbpubkey",
9800 private_key: "testkey.pem",
9801 }
9802
9803 java_library {
9804 name: "mylib",
9805 srcs: ["mylib.java"],
9806 apex_available: ["myapex"],
9807 compile_dex: true,
9808 }
9809
9810 bootclasspath_fragment {
9811 name: "mybootclasspathfragment",
9812 contents: ["mybootclasspathlib"],
9813 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009814 hidden_api: {
9815 split_packages: ["*"],
9816 },
Colin Crossc33e5212021-05-25 18:16:02 -07009817 }
9818
9819 java_library {
9820 name: "mybootclasspathlib",
9821 srcs: ["mybootclasspathlib.java"],
9822 apex_available: ["myapex"],
9823 compile_dex: true,
9824 }
9825
9826 systemserverclasspath_fragment {
9827 name: "mysystemserverclasspathfragment",
9828 contents: ["mysystemserverclasspathlib"],
9829 apex_available: ["myapex"],
9830 }
9831
9832 java_library {
9833 name: "mysystemserverclasspathlib",
9834 srcs: ["mysystemserverclasspathlib.java"],
9835 apex_available: ["myapex"],
9836 compile_dex: true,
9837 }
9838 `
9839
9840 result := android.GroupFixturePreparers(
9841 PrepareForTestWithApexBuildComponents,
9842 prepareForTestWithMyapex,
9843 java.PrepareForTestWithJavaDefaultModules,
9844 android.PrepareForTestWithAndroidBuildComponents,
9845 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009846 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9847 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009848 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009849 ).RunTest(t)
9850
9851 // Make sure jacoco ran on both mylib and mybootclasspathlib
9852 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9853 t.Errorf("Failed to find jacoco rule for mylib")
9854 }
9855 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9856 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9857 }
9858 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9859 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9860 }
9861}
9862
Jiyong Park192600a2021-08-03 07:52:17 +00009863func TestProhibitStaticExecutable(t *testing.T) {
9864 testApexError(t, `executable mybin is static`, `
9865 apex {
9866 name: "myapex",
9867 key: "myapex.key",
9868 binaries: ["mybin"],
9869 min_sdk_version: "29",
9870 }
9871
9872 apex_key {
9873 name: "myapex.key",
9874 public_key: "testkey.avbpubkey",
9875 private_key: "testkey.pem",
9876 }
9877
9878 cc_binary {
9879 name: "mybin",
9880 srcs: ["mylib.cpp"],
9881 relative_install_path: "foo/bar",
9882 static_executable: true,
9883 system_shared_libs: [],
9884 stl: "none",
9885 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009886 min_sdk_version: "29",
9887 }
9888 `)
9889
9890 testApexError(t, `executable mybin.rust is static`, `
9891 apex {
9892 name: "myapex",
9893 key: "myapex.key",
9894 binaries: ["mybin.rust"],
9895 min_sdk_version: "29",
9896 }
9897
9898 apex_key {
9899 name: "myapex.key",
9900 public_key: "testkey.avbpubkey",
9901 private_key: "testkey.pem",
9902 }
9903
9904 rust_binary {
9905 name: "mybin.rust",
9906 srcs: ["foo.rs"],
9907 static_executable: true,
9908 apex_available: ["myapex"],
9909 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009910 }
9911 `)
9912}
9913
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009914func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9915 ctx := testApex(t, `
9916 apex {
9917 name: "myapex",
9918 key: "myapex.key",
9919 updatable: false,
9920 java_libs: ["foo"],
9921 }
9922
9923 apex_key {
9924 name: "myapex.key",
9925 public_key: "testkey.avbpubkey",
9926 private_key: "testkey.pem",
9927 }
9928
9929 java_library {
9930 name: "foo",
9931 srcs: ["foo.java"],
9932 apex_available: ["myapex"],
9933 installable: true,
9934 }
9935 `,
9936 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9937 )
9938
9939 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9940 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9941 var builder strings.Builder
9942 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9943 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009944 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009945}
9946
9947func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9948 ctx := testApex(t, `
9949 prebuilt_apex {
9950 name: "myapex",
9951 arch: {
9952 arm64: {
9953 src: "myapex-arm64.apex",
9954 },
9955 arm: {
9956 src: "myapex-arm.apex",
9957 },
9958 },
9959 exported_java_libs: ["foo"],
9960 }
9961
9962 java_import {
9963 name: "foo",
9964 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009965 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009966 }
9967 `,
9968 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9969 )
9970
9971 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9972 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9973 mainModuleEntries := entriesList[0]
9974 android.AssertArrayString(t,
9975 "LOCAL_REQUIRED_MODULES",
9976 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9977 []string{
9978 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9979 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9980 })
9981}
9982
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009983func TestAndroidMk_RequiredModules(t *testing.T) {
9984 ctx := testApex(t, `
9985 apex {
9986 name: "myapex",
9987 key: "myapex.key",
9988 updatable: false,
9989 java_libs: ["foo"],
9990 required: ["otherapex"],
9991 }
9992
9993 apex {
9994 name: "otherapex",
9995 key: "myapex.key",
9996 updatable: false,
9997 java_libs: ["foo"],
9998 required: ["otherapex"],
9999 }
10000
10001 apex_key {
10002 name: "myapex.key",
10003 public_key: "testkey.avbpubkey",
10004 private_key: "testkey.pem",
10005 }
10006
10007 java_library {
10008 name: "foo",
10009 srcs: ["foo.java"],
10010 apex_available: ["myapex", "otherapex"],
10011 installable: true,
10012 }
10013 `)
10014
10015 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
10016 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10017 var builder strings.Builder
10018 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10019 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +000010020 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010021}
10022
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010023func TestAndroidMk_RequiredDeps(t *testing.T) {
10024 ctx := testApex(t, `
10025 apex {
10026 name: "myapex",
10027 key: "myapex.key",
10028 updatable: false,
10029 }
10030
10031 apex_key {
10032 name: "myapex.key",
10033 public_key: "testkey.avbpubkey",
10034 private_key: "testkey.pem",
10035 }
10036 `)
10037
10038 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010039 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010040 data := android.AndroidMkDataForTest(t, ctx, bundle)
10041 var builder strings.Builder
10042 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10043 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +000010044 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010045
10046 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010047 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010048 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
10049 var flattenedBuilder strings.Builder
10050 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
10051 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -080010052 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010053}
10054
Jooyung Hana6d36672022-02-24 13:58:07 +090010055func TestApexOutputFileProducer(t *testing.T) {
10056 for _, tc := range []struct {
10057 name string
10058 ref string
10059 expected_data []string
10060 }{
10061 {
10062 name: "test_using_output",
10063 ref: ":myapex",
10064 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
10065 },
10066 {
10067 name: "test_using_apex",
10068 ref: ":myapex{.apex}",
10069 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
10070 },
10071 } {
10072 t.Run(tc.name, func(t *testing.T) {
10073 ctx := testApex(t, `
10074 apex {
10075 name: "myapex",
10076 key: "myapex.key",
10077 compressible: true,
10078 updatable: false,
10079 }
10080
10081 apex_key {
10082 name: "myapex.key",
10083 public_key: "testkey.avbpubkey",
10084 private_key: "testkey.pem",
10085 }
10086
10087 java_test {
10088 name: "`+tc.name+`",
10089 srcs: ["a.java"],
10090 data: ["`+tc.ref+`"],
10091 }
10092 `,
10093 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10094 variables.CompressedApex = proptools.BoolPtr(true)
10095 }))
10096 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10097 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10098 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10099 })
10100 }
10101}
10102
satayev758968a2021-12-06 11:42:40 +000010103func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10104 preparer := android.GroupFixturePreparers(
10105 PrepareForTestWithApexBuildComponents,
10106 prepareForTestWithMyapex,
10107 java.PrepareForTestWithJavaSdkLibraryFiles,
10108 java.PrepareForTestWithJavaDefaultModules,
10109 android.PrepareForTestWithAndroidBuildComponents,
10110 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10111 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10112 )
10113
10114 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10115 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10116 preparer.RunTestWithBp(t, `
10117 apex {
10118 name: "myapex",
10119 key: "myapex.key",
10120 bootclasspath_fragments: ["mybootclasspathfragment"],
10121 min_sdk_version: "30",
10122 updatable: false,
10123 }
10124
10125 apex_key {
10126 name: "myapex.key",
10127 public_key: "testkey.avbpubkey",
10128 private_key: "testkey.pem",
10129 }
10130
10131 bootclasspath_fragment {
10132 name: "mybootclasspathfragment",
10133 contents: ["mybootclasspathlib"],
10134 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010135 hidden_api: {
10136 split_packages: ["*"],
10137 },
satayev758968a2021-12-06 11:42:40 +000010138 }
10139
10140 java_sdk_library {
10141 name: "mybootclasspathlib",
10142 srcs: ["mybootclasspathlib.java"],
10143 apex_available: ["myapex"],
10144 compile_dex: true,
10145 unsafe_ignore_missing_latest_api: true,
10146 min_sdk_version: "31",
10147 static_libs: ["util"],
10148 }
10149
10150 java_library {
10151 name: "util",
10152 srcs: ["a.java"],
10153 apex_available: ["myapex"],
10154 min_sdk_version: "31",
10155 static_libs: ["another_util"],
10156 }
10157
10158 java_library {
10159 name: "another_util",
10160 srcs: ["a.java"],
10161 min_sdk_version: "31",
10162 apex_available: ["myapex"],
10163 }
10164 `)
10165 })
10166
10167 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10168 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10169 preparer.RunTestWithBp(t, `
10170 apex {
10171 name: "myapex",
10172 key: "myapex.key",
10173 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10174 min_sdk_version: "30",
10175 updatable: false,
10176 }
10177
10178 apex_key {
10179 name: "myapex.key",
10180 public_key: "testkey.avbpubkey",
10181 private_key: "testkey.pem",
10182 }
10183
10184 systemserverclasspath_fragment {
10185 name: "mysystemserverclasspathfragment",
10186 contents: ["mysystemserverclasspathlib"],
10187 apex_available: ["myapex"],
10188 }
10189
10190 java_sdk_library {
10191 name: "mysystemserverclasspathlib",
10192 srcs: ["mysystemserverclasspathlib.java"],
10193 apex_available: ["myapex"],
10194 compile_dex: true,
10195 min_sdk_version: "32",
10196 unsafe_ignore_missing_latest_api: true,
10197 static_libs: ["util"],
10198 }
10199
10200 java_library {
10201 name: "util",
10202 srcs: ["a.java"],
10203 apex_available: ["myapex"],
10204 min_sdk_version: "31",
10205 static_libs: ["another_util"],
10206 }
10207
10208 java_library {
10209 name: "another_util",
10210 srcs: ["a.java"],
10211 min_sdk_version: "31",
10212 apex_available: ["myapex"],
10213 }
10214 `)
10215 })
10216
10217 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10218 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10219 RunTestWithBp(t, `
10220 apex {
10221 name: "myapex",
10222 key: "myapex.key",
10223 bootclasspath_fragments: ["mybootclasspathfragment"],
10224 min_sdk_version: "30",
10225 updatable: false,
10226 }
10227
10228 apex_key {
10229 name: "myapex.key",
10230 public_key: "testkey.avbpubkey",
10231 private_key: "testkey.pem",
10232 }
10233
10234 bootclasspath_fragment {
10235 name: "mybootclasspathfragment",
10236 contents: ["mybootclasspathlib"],
10237 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010238 hidden_api: {
10239 split_packages: ["*"],
10240 },
satayev758968a2021-12-06 11:42:40 +000010241 }
10242
10243 java_sdk_library {
10244 name: "mybootclasspathlib",
10245 srcs: ["mybootclasspathlib.java"],
10246 apex_available: ["myapex"],
10247 compile_dex: true,
10248 unsafe_ignore_missing_latest_api: true,
10249 }
10250 `)
10251 })
10252
10253 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10254 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10255 RunTestWithBp(t, `
10256 apex {
10257 name: "myapex",
10258 key: "myapex.key",
10259 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10260 min_sdk_version: "30",
10261 updatable: false,
10262 }
10263
10264 apex_key {
10265 name: "myapex.key",
10266 public_key: "testkey.avbpubkey",
10267 private_key: "testkey.pem",
10268 }
10269
10270 systemserverclasspath_fragment {
10271 name: "mysystemserverclasspathfragment",
10272 contents: ["mysystemserverclasspathlib"],
10273 apex_available: ["myapex"],
10274 }
10275
10276 java_sdk_library {
10277 name: "mysystemserverclasspathlib",
10278 srcs: ["mysystemserverclasspathlib.java"],
10279 apex_available: ["myapex"],
10280 compile_dex: true,
10281 unsafe_ignore_missing_latest_api: true,
10282 }
10283 `)
10284 })
10285}
10286
Jiakai Zhang6decef92022-01-12 17:56:19 +000010287// Verifies that the APEX depends on all the Make modules in the list.
10288func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10289 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10290 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010291 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010292 }
10293}
10294
10295// Verifies that the APEX does not depend on any of the Make modules in the list.
10296func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10297 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10298 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010299 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010300 }
10301}
10302
Cole Faust1021ccd2023-02-26 21:15:25 -080010303// TODO(b/193460475): Re-enable this test
10304//func TestApexStrictUpdtabilityLint(t *testing.T) {
10305// bpTemplate := `
10306// apex {
10307// name: "myapex",
10308// key: "myapex.key",
10309// java_libs: ["myjavalib"],
10310// updatable: %v,
10311// min_sdk_version: "29",
10312// }
10313// apex_key {
10314// name: "myapex.key",
10315// }
10316// java_library {
10317// name: "myjavalib",
10318// srcs: ["MyClass.java"],
10319// apex_available: [ "myapex" ],
10320// lint: {
10321// strict_updatability_linting: %v,
10322// },
10323// sdk_version: "current",
10324// min_sdk_version: "29",
10325// }
10326// `
10327// fs := android.MockFS{
10328// "lint-baseline.xml": nil,
10329// }
10330//
10331// testCases := []struct {
10332// testCaseName string
10333// apexUpdatable bool
10334// javaStrictUpdtabilityLint bool
10335// lintFileExists bool
10336// disallowedFlagExpected bool
10337// }{
10338// {
10339// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10340// apexUpdatable: true,
10341// javaStrictUpdtabilityLint: true,
10342// lintFileExists: false,
10343// disallowedFlagExpected: false,
10344// },
10345// {
10346// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10347// apexUpdatable: false,
10348// javaStrictUpdtabilityLint: false,
10349// lintFileExists: true,
10350// disallowedFlagExpected: false,
10351// },
10352// {
10353// testCaseName: "non-updatable apex respects strict updatability of javalib",
10354// apexUpdatable: false,
10355// javaStrictUpdtabilityLint: true,
10356// lintFileExists: true,
10357// disallowedFlagExpected: true,
10358// },
10359// {
10360// testCaseName: "updatable apex sets strict updatability of javalib to true",
10361// apexUpdatable: true,
10362// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10363// lintFileExists: true,
10364// disallowedFlagExpected: true,
10365// },
10366// }
10367//
10368// for _, testCase := range testCases {
10369// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10370// fixtures := []android.FixturePreparer{}
10371// if testCase.lintFileExists {
10372// fixtures = append(fixtures, fs.AddToFixture())
10373// }
10374//
10375// result := testApex(t, bp, fixtures...)
10376// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10377// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10378// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10379//
10380// if disallowedFlagActual != testCase.disallowedFlagExpected {
10381// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10382// }
10383// }
10384//}
10385//
10386//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10387// bp := `
10388// apex {
10389// name: "myapex",
10390// key: "myapex.key",
10391// java_libs: ["myjavalib"],
10392// updatable: true,
10393// min_sdk_version: "29",
10394// }
10395// apex_key {
10396// name: "myapex.key",
10397// }
10398// java_library {
10399// name: "myjavalib",
10400// srcs: ["MyClass.java"],
10401// apex_available: [ "myapex" ],
10402// sdk_version: "current",
10403// min_sdk_version: "29",
10404// }
10405// `
10406//
10407// testCases := []struct {
10408// testCaseName string
10409// moduleDirectory string
10410// disallowedFlagExpected bool
10411// }{
10412// {
10413// testCaseName: "lintable module defined outside libcore",
10414// moduleDirectory: "",
10415// disallowedFlagExpected: true,
10416// },
10417// {
10418// testCaseName: "lintable module defined in libcore root directory",
10419// moduleDirectory: "libcore/",
10420// disallowedFlagExpected: false,
10421// },
10422// {
10423// testCaseName: "lintable module defined in libcore child directory",
10424// moduleDirectory: "libcore/childdir/",
10425// disallowedFlagExpected: true,
10426// },
10427// }
10428//
10429// for _, testCase := range testCases {
10430// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10431// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10432// result := testApex(t, "", lintFileCreator, bpFileCreator)
10433// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10434// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10435// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10436// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10437//
10438// if disallowedFlagActual != testCase.disallowedFlagExpected {
10439// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10440// }
10441// }
10442//}
10443//
10444//// checks transtive deps of an apex coming from bootclasspath_fragment
10445//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10446// bp := `
10447// apex {
10448// name: "myapex",
10449// key: "myapex.key",
10450// bootclasspath_fragments: ["mybootclasspathfragment"],
10451// updatable: true,
10452// min_sdk_version: "29",
10453// }
10454// apex_key {
10455// name: "myapex.key",
10456// }
10457// bootclasspath_fragment {
10458// name: "mybootclasspathfragment",
10459// contents: ["myjavalib"],
10460// apex_available: ["myapex"],
10461// hidden_api: {
10462// split_packages: ["*"],
10463// },
10464// }
10465// java_library {
10466// name: "myjavalib",
10467// srcs: ["MyClass.java"],
10468// apex_available: [ "myapex" ],
10469// sdk_version: "current",
10470// min_sdk_version: "29",
10471// compile_dex: true,
10472// }
10473// `
10474// fs := android.MockFS{
10475// "lint-baseline.xml": nil,
10476// }
10477//
10478// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10479// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10480// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10481// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10482// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10483// }
10484//}
Spandan Das66773252022-01-15 00:23:18 +000010485
Spandan Das42e89502022-05-06 22:12:55 +000010486// updatable apexes should propagate updatable=true to its apps
10487func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10488 bp := `
10489 apex {
10490 name: "myapex",
10491 key: "myapex.key",
10492 updatable: %v,
10493 apps: [
10494 "myapp",
10495 ],
10496 min_sdk_version: "30",
10497 }
10498 apex_key {
10499 name: "myapex.key",
10500 }
10501 android_app {
10502 name: "myapp",
10503 updatable: %v,
10504 apex_available: [
10505 "myapex",
10506 ],
10507 sdk_version: "current",
10508 min_sdk_version: "30",
10509 }
10510 `
10511 testCases := []struct {
10512 name string
10513 apex_is_updatable_bp bool
10514 app_is_updatable_bp bool
10515 app_is_updatable_expected bool
10516 }{
10517 {
10518 name: "Non-updatable apex respects updatable property of non-updatable app",
10519 apex_is_updatable_bp: false,
10520 app_is_updatable_bp: false,
10521 app_is_updatable_expected: false,
10522 },
10523 {
10524 name: "Non-updatable apex respects updatable property of updatable app",
10525 apex_is_updatable_bp: false,
10526 app_is_updatable_bp: true,
10527 app_is_updatable_expected: true,
10528 },
10529 {
10530 name: "Updatable apex respects updatable property of updatable app",
10531 apex_is_updatable_bp: true,
10532 app_is_updatable_bp: true,
10533 app_is_updatable_expected: true,
10534 },
10535 {
10536 name: "Updatable apex sets updatable=true on non-updatable app",
10537 apex_is_updatable_bp: true,
10538 app_is_updatable_bp: false,
10539 app_is_updatable_expected: true,
10540 },
10541 }
10542 for _, testCase := range testCases {
10543 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10544 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10545 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10546 }
10547}
10548
Kiyoung Kim487689e2022-07-26 09:48:22 +090010549func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10550 bp := `
10551 apex {
10552 name: "myapex",
10553 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010554 native_shared_libs: ["libbaz"],
10555 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010556 min_sdk_version: "29",
10557 }
10558 apex_key {
10559 name: "myapex.key",
10560 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010561 cc_binary {
10562 name: "binfoo",
10563 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010564 apex_available: ["myapex"],
10565 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010566 recovery_available: false,
10567 }
10568 cc_library {
10569 name: "libbar",
10570 srcs: ["libbar.cc"],
10571 stubs: {
10572 symbol_file: "libbar.map.txt",
10573 versions: [
10574 "29",
10575 ],
10576 },
10577 }
10578 cc_library {
10579 name: "libbaz",
10580 srcs: ["libbaz.cc"],
10581 apex_available: ["myapex"],
10582 min_sdk_version: "29",
10583 stubs: {
10584 symbol_file: "libbaz.map.txt",
10585 versions: [
10586 "29",
10587 ],
10588 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010589 }
10590 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010591 name: "libbar",
10592 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010593 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010594 variants: ["apex.29"],
10595 }
10596 cc_api_variant {
10597 name: "libbar",
10598 variant: "apex",
10599 version: "29",
10600 src: "libbar_apex_29.so",
10601 }
10602 cc_api_library {
10603 name: "libbaz",
10604 src: "libbaz_stub.so",
10605 min_sdk_version: "29",
10606 variants: ["apex.29"],
10607 }
10608 cc_api_variant {
10609 name: "libbaz",
10610 variant: "apex",
10611 version: "29",
10612 src: "libbaz_apex_29.so",
10613 }
10614 cc_api_library {
10615 name: "libqux",
10616 src: "libqux_stub.so",
10617 min_sdk_version: "29",
10618 variants: ["apex.29"],
10619 }
10620 cc_api_variant {
10621 name: "libqux",
10622 variant: "apex",
10623 version: "29",
10624 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010625 }
10626 api_imports {
10627 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010628 apex_shared_libs: [
10629 "libbar",
10630 "libbaz",
10631 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010632 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010633 }
10634 `
10635 result := testApex(t, bp)
10636
10637 hasDep := func(m android.Module, wantDep android.Module) bool {
10638 t.Helper()
10639 var found bool
10640 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10641 if dep == wantDep {
10642 found = true
10643 }
10644 })
10645 return found
10646 }
10647
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010648 // Library defines stubs and cc_api_library should be used with cc_api_library
10649 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10650 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10651 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010652
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010653 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10654 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010655
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010656 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10657 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10658 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10659 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10660
10661 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10662 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10663 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10664 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10665 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10666
10667 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10668 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10669 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10670
10671 // cc_api_library defined without original library should be linked with cc_api_library
10672 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10673 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10674 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10675}
10676
10677func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10678 bp := `
10679 apex {
10680 name: "myapex",
10681 key: "myapex.key",
10682 native_shared_libs: ["libbar"],
10683 min_sdk_version: "29",
10684 }
10685 apex_key {
10686 name: "myapex.key",
10687 }
10688 cc_binary {
10689 name: "binfoo",
10690 shared_libs: ["libbar"],
10691 recovery_available: false,
10692 }
10693 cc_library {
10694 name: "libbar",
10695 srcs: ["libbar.cc"],
10696 apex_available: ["myapex"],
10697 min_sdk_version: "29",
10698 stubs: {
10699 symbol_file: "libbar.map.txt",
10700 versions: [
10701 "29",
10702 ],
10703 },
10704 }
10705 cc_api_library {
10706 name: "libbar",
10707 src: "libbar_stub.so",
10708 variants: ["apex.29"],
10709 }
10710 cc_api_variant {
10711 name: "libbar",
10712 variant: "apex",
10713 version: "29",
10714 src: "libbar_apex_29.so",
10715 }
10716 api_imports {
10717 name: "api_imports",
10718 apex_shared_libs: [
10719 "libbar",
10720 ],
10721 }
10722 `
10723
10724 result := testApex(t, bp)
10725
10726 hasDep := func(m android.Module, wantDep android.Module) bool {
10727 t.Helper()
10728 var found bool
10729 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10730 if dep == wantDep {
10731 found = true
10732 }
10733 })
10734 return found
10735 }
10736
10737 // Library defines stubs and cc_api_library should be used with cc_api_library
10738 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10739 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10740 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10741
10742 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10743 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10744
10745 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10746 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10747 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10748 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010749}
Dennis Shend4f5d932023-01-31 20:27:21 +000010750
10751func TestTrimmedApex(t *testing.T) {
10752 bp := `
10753 apex {
10754 name: "myapex",
10755 key: "myapex.key",
10756 native_shared_libs: ["libfoo","libbaz"],
10757 min_sdk_version: "29",
10758 trim_against: "mydcla",
10759 }
10760 apex {
10761 name: "mydcla",
10762 key: "myapex.key",
10763 native_shared_libs: ["libfoo","libbar"],
10764 min_sdk_version: "29",
10765 file_contexts: ":myapex-file_contexts",
10766 dynamic_common_lib_apex: true,
10767 }
10768 apex_key {
10769 name: "myapex.key",
10770 }
10771 cc_library {
10772 name: "libfoo",
10773 shared_libs: ["libc"],
10774 apex_available: ["myapex","mydcla"],
10775 min_sdk_version: "29",
10776 }
10777 cc_library {
10778 name: "libbar",
10779 shared_libs: ["libc"],
10780 apex_available: ["myapex","mydcla"],
10781 min_sdk_version: "29",
10782 }
10783 cc_library {
10784 name: "libbaz",
10785 shared_libs: ["libc"],
10786 apex_available: ["myapex","mydcla"],
10787 min_sdk_version: "29",
10788 }
10789 cc_api_library {
10790 name: "libc",
10791 src: "libc.so",
10792 min_sdk_version: "29",
10793 recovery_available: true,
10794 }
10795 api_imports {
10796 name: "api_imports",
10797 shared_libs: [
10798 "libc",
10799 ],
10800 header_libs: [],
10801 }
10802 `
10803 ctx := testApex(t, bp)
10804 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10805 apexRule := module.MaybeRule("apexRule")
10806 if apexRule.Rule == nil {
10807 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10808 }
10809
10810 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10811 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10812 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10813 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10814 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10815 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10816}
Jingwen Chendea7a642023-03-28 11:30:50 +000010817
10818func TestCannedFsConfig(t *testing.T) {
10819 ctx := testApex(t, `
10820 apex {
10821 name: "myapex",
10822 key: "myapex.key",
10823 updatable: false,
10824 }
10825
10826 apex_key {
10827 name: "myapex.key",
10828 public_key: "testkey.avbpubkey",
10829 private_key: "testkey.pem",
10830 }`)
10831 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10832 generateFsRule := mod.Rule("generateFsConfig")
10833 cmd := generateFsRule.RuleParams.Command
10834
10835 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10836}
10837
10838func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10839 ctx := testApex(t, `
10840 apex {
10841 name: "myapex",
10842 key: "myapex.key",
10843 canned_fs_config: "my_config",
10844 updatable: false,
10845 }
10846
10847 apex_key {
10848 name: "myapex.key",
10849 public_key: "testkey.avbpubkey",
10850 private_key: "testkey.pem",
10851 }`)
10852 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10853 generateFsRule := mod.Rule("generateFsConfig")
10854 cmd := generateFsRule.RuleParams.Command
10855
10856 // Ensure that canned_fs_config has "cat my_config" at the end
10857 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10858}
Spandan Das20fce2d2023-04-12 17:21:39 +000010859
10860func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10861 testCases := []struct {
10862 desc string
10863 hasStubs bool
10864 apexAvailable string
10865 expectedError string
10866 }{
10867 {
10868 desc: "non-stub library can have multiple apex_available",
10869 hasStubs: false,
10870 apexAvailable: `["myapex", "otherapex"]`,
10871 },
10872 {
10873 desc: "stub library should not be available to anyapex",
10874 hasStubs: true,
10875 apexAvailable: `["//apex_available:anyapex"]`,
10876 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10877 },
10878 {
10879 desc: "stub library should not be available to multiple apexes",
10880 hasStubs: true,
10881 apexAvailable: `["myapex", "otherapex"]`,
10882 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10883 },
10884 {
10885 desc: "stub library can be available to a core apex and a test apex",
10886 hasStubs: true,
10887 apexAvailable: `["myapex", "test_myapex"]`,
10888 },
10889 }
10890 bpTemplate := `
10891 cc_library {
10892 name: "libfoo",
10893 %v
10894 apex_available: %v,
10895 }
10896 apex {
10897 name: "myapex",
10898 key: "apex.key",
10899 updatable: false,
10900 native_shared_libs: ["libfoo"],
10901 }
10902 apex {
10903 name: "otherapex",
10904 key: "apex.key",
10905 updatable: false,
10906 }
10907 apex_test {
10908 name: "test_myapex",
10909 key: "apex.key",
10910 updatable: false,
10911 native_shared_libs: ["libfoo"],
10912 }
10913 apex_key {
10914 name: "apex.key",
10915 }
10916 `
10917 for _, tc := range testCases {
10918 stubs := ""
10919 if tc.hasStubs {
10920 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10921 }
10922 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10923 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10924 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10925 })
10926 if tc.expectedError == "" {
10927 testApex(t, bp, mockFsFixturePreparer)
10928 } else {
10929 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10930 }
10931 }
10932}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010933
10934func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10935 context := android.GroupFixturePreparers(
10936 android.PrepareForIntegrationTestWithAndroid,
10937 cc.PrepareForIntegrationTestWithCc,
10938 PrepareForTestWithApexBuildComponents,
10939 prepareForTestWithMyapex,
10940 filesystem.PrepareForTestWithFilesystemBuildComponents,
10941 )
10942 result := context.RunTestWithBp(t, `
10943 android_system_image {
10944 name: "myfilesystem",
10945 deps: [
10946 "libfoo",
10947 ],
10948 linker_config_src: "linker.config.json",
10949 }
10950
10951 cc_library {
10952 name: "libfoo",
10953 shared_libs: [
10954 "libbar",
10955 ],
10956 stl: "none",
10957 }
10958
10959 cc_library {
10960 name: "libbar",
10961 stl: "none",
10962 apex_available: ["myapex"],
10963 }
10964
10965 apex {
10966 name: "myapex",
10967 native_shared_libs: ["libbar"],
10968 key: "myapex.key",
10969 updatable: false,
10970 }
10971
10972 apex_key {
10973 name: "myapex.key",
10974 public_key: "testkey.avbpubkey",
10975 private_key: "testkey.pem",
10976 }
10977 `)
10978
10979 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10980 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10981 inputs.Strings(),
10982 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10983}