blob: d0d4d0d93748a4700c4ea8408e57c27a15c99831 [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,
150 java.PrepareForTestWithJavaDefaultModules,
151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
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"],
1371 runtime_libs: ["libfoo", "libbar"],
1372 system_shared_libs: [],
1373 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001374 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001375 }
1376
1377 cc_library {
1378 name: "libfoo",
1379 srcs: ["mylib.cpp"],
1380 system_shared_libs: [],
1381 stl: "none",
1382 stubs: {
1383 versions: ["10", "20", "30"],
1384 },
1385 }
1386
1387 cc_library {
1388 name: "libbar",
1389 srcs: ["mylib.cpp"],
1390 system_shared_libs: [],
1391 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001392 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001393 }
1394
1395 `)
1396
Sundong Ahnabb64432019-10-22 13:58:29 +09001397 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001398 copyCmds := apexRule.Args["copy_commands"]
1399
1400 // Ensure that direct non-stubs dep is always included
1401 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1402
1403 // Ensure that indirect stubs dep is not included
1404 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1405
1406 // Ensure that runtime_libs dep in included
1407 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1408
Sundong Ahnabb64432019-10-22 13:58:29 +09001409 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001410 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1411 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001412
1413}
1414
Paul Duffina02cae32021-03-09 01:44:06 +00001415var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1416 cc.PrepareForTestWithCcBuildComponents,
1417 PrepareForTestWithApexBuildComponents,
1418 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001419 apex {
1420 name: "com.android.runtime",
1421 key: "com.android.runtime.key",
1422 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001423 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001424 }
1425
1426 apex_key {
1427 name: "com.android.runtime.key",
1428 public_key: "testkey.avbpubkey",
1429 private_key: "testkey.pem",
1430 }
Paul Duffina02cae32021-03-09 01:44:06 +00001431 `),
1432 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1433)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001434
Paul Duffina02cae32021-03-09 01:44:06 +00001435func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001436 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437 cc_library {
1438 name: "libc",
1439 no_libcrt: true,
1440 nocrt: true,
1441 stl: "none",
1442 system_shared_libs: [],
1443 stubs: { versions: ["1"] },
1444 apex_available: ["com.android.runtime"],
1445
1446 sanitize: {
1447 hwaddress: true,
1448 }
1449 }
1450
1451 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001452 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 srcs: [""],
1458 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001459 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001460
1461 sanitize: {
1462 never: true,
1463 },
Paul Duffina02cae32021-03-09 01:44:06 +00001464 } `)
1465 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001466
1467 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1468 "lib64/bionic/libc.so",
1469 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1470 })
1471
Colin Cross4c4c1be2022-02-10 11:41:18 -08001472 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001473
1474 installed := hwasan.Description("install libclang_rt.hwasan")
1475 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1476
1477 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1478 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1479 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1480}
1481
1482func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001483 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001484 prepareForTestOfRuntimeApexWithHwasan,
1485 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1486 variables.SanitizeDevice = []string{"hwaddress"}
1487 }),
1488 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 cc_library {
1490 name: "libc",
1491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 stubs: { versions: ["1"] },
1496 apex_available: ["com.android.runtime"],
1497 }
1498
1499 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001500 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001501 no_libcrt: true,
1502 nocrt: true,
1503 stl: "none",
1504 system_shared_libs: [],
1505 srcs: [""],
1506 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001507 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508
1509 sanitize: {
1510 never: true,
1511 },
1512 }
Paul Duffina02cae32021-03-09 01:44:06 +00001513 `)
1514 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515
1516 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1517 "lib64/bionic/libc.so",
1518 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1519 })
1520
Colin Cross4c4c1be2022-02-10 11:41:18 -08001521 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522
1523 installed := hwasan.Description("install libclang_rt.hwasan")
1524 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1525
1526 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1527 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1528 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1529}
1530
Jooyung Han61b66e92020-03-21 14:21:46 +00001531func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1532 testcases := []struct {
1533 name string
1534 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001535 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001536 shouldLink string
1537 shouldNotLink []string
1538 }{
1539 {
Jiyong Park55549df2021-02-26 23:57:23 +09001540 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001541 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001542 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001543 shouldLink: "current",
1544 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 },
1546 {
Jiyong Park55549df2021-02-26 23:57:23 +09001547 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001548 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001549 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001550 shouldLink: "current",
1551 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 },
1553 }
1554 for _, tc := range testcases {
1555 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001556 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 apex {
1558 name: "myapex",
1559 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001560 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001561 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001562 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 apex_key {
1566 name: "myapex.key",
1567 public_key: "testkey.avbpubkey",
1568 private_key: "testkey.pem",
1569 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001570
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 cc_library {
1572 name: "mylib",
1573 srcs: ["mylib.cpp"],
1574 vendor_available: true,
1575 shared_libs: ["libbar"],
1576 system_shared_libs: [],
1577 stl: "none",
1578 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001579 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001581
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 cc_library {
1583 name: "libbar",
1584 srcs: ["mylib.cpp"],
1585 system_shared_libs: [],
1586 stl: "none",
1587 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001588 llndk: {
1589 symbol_file: "libbar.map.txt",
1590 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001591 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001592 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001593 withUnbundledBuild,
1594 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001595
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 // Ensure that LLNDK dep is not included
1597 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1598 "lib64/mylib.so",
1599 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001600
Jooyung Han61b66e92020-03-21 14:21:46 +00001601 // Ensure that LLNDK dep is required
1602 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1603 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1604 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001605
Steven Moreland2c4000c2021-04-27 02:08:49 +00001606 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1607 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001609 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001610 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001611
Steven Moreland2c4000c2021-04-27 02:08:49 +00001612 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001613 ver := tc.shouldLink
1614 if tc.shouldLink == "current" {
1615 ver = strconv.Itoa(android.FutureApiLevelInt)
1616 }
1617 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001618 })
1619 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001620}
1621
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001623 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 apex {
1625 name: "myapex",
1626 key: "myapex.key",
1627 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001628 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001629 }
1630
1631 apex_key {
1632 name: "myapex.key",
1633 public_key: "testkey.avbpubkey",
1634 private_key: "testkey.pem",
1635 }
1636
1637 cc_library {
1638 name: "mylib",
1639 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001640 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 shared_libs: ["libdl#27"],
1642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001643 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 }
1645
1646 cc_library_shared {
1647 name: "mylib_shared",
1648 srcs: ["mylib.cpp"],
1649 shared_libs: ["libdl#27"],
1650 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001651 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 }
1653
1654 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001655 name: "libBootstrap",
1656 srcs: ["mylib.cpp"],
1657 stl: "none",
1658 bootstrap: true,
1659 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 `)
1661
Sundong Ahnabb64432019-10-22 13:58:29 +09001662 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 copyCmds := apexRule.Args["copy_commands"]
1664
1665 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001666 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001667 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1668 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001669
1670 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001671 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672
Colin Crossaede88c2020-08-11 12:17:01 -07001673 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1674 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1675 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676
1677 // For dependency to libc
1678 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001679 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001680 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001681 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001682 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1684 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685
1686 // For dependency to libm
1687 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001688 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001690 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001691 // ... and is not compiling with the stub
1692 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1693 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1694
1695 // For dependency to libdl
1696 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001697 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001699 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1700 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001702 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001703 // ... Cflags from stub is correctly exported to mylib
1704 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1705 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001706
1707 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001708 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1709 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1710 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1711 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001712}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001713
Jooyung Han749dc692020-04-15 11:03:39 +09001714func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001715 // there are three links between liba --> libz.
1716 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001717 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001718 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001719 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001720 apex {
1721 name: "myapex",
1722 key: "myapex.key",
1723 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001724 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001725 }
1726
1727 apex {
1728 name: "otherapex",
1729 key: "myapex.key",
1730 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001731 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001732 }
1733
1734 apex_key {
1735 name: "myapex.key",
1736 public_key: "testkey.avbpubkey",
1737 private_key: "testkey.pem",
1738 }
1739
1740 cc_library {
1741 name: "libx",
1742 shared_libs: ["liba"],
1743 system_shared_libs: [],
1744 stl: "none",
1745 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001746 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001747 }
1748
1749 cc_library {
1750 name: "liby",
1751 shared_libs: ["liba"],
1752 system_shared_libs: [],
1753 stl: "none",
1754 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001755 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001756 }
1757
1758 cc_library {
1759 name: "liba",
1760 shared_libs: ["libz"],
1761 system_shared_libs: [],
1762 stl: "none",
1763 apex_available: [
1764 "//apex_available:anyapex",
1765 "//apex_available:platform",
1766 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001767 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001768 }
1769
1770 cc_library {
1771 name: "libz",
1772 system_shared_libs: [],
1773 stl: "none",
1774 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001775 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001776 },
1777 }
Jooyung Han749dc692020-04-15 11:03:39 +09001778 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001779
1780 expectLink := func(from, from_variant, to, to_variant string) {
1781 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1782 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1783 }
1784 expectNoLink := func(from, from_variant, to, to_variant string) {
1785 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1786 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1787 }
1788 // platform liba is linked to non-stub version
1789 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001790 // liba in myapex is linked to current
1791 expectLink("liba", "shared_apex29", "libz", "shared_current")
1792 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001793 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001794 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001795 // liba in otherapex is linked to current
1796 expectLink("liba", "shared_apex30", "libz", "shared_current")
1797 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001798 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1799 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001800}
1801
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001803 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001804 apex {
1805 name: "myapex",
1806 key: "myapex.key",
1807 native_shared_libs: ["libx"],
1808 min_sdk_version: "R",
1809 }
1810
1811 apex_key {
1812 name: "myapex.key",
1813 public_key: "testkey.avbpubkey",
1814 private_key: "testkey.pem",
1815 }
1816
1817 cc_library {
1818 name: "libx",
1819 shared_libs: ["libz"],
1820 system_shared_libs: [],
1821 stl: "none",
1822 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001823 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001824 }
1825
1826 cc_library {
1827 name: "libz",
1828 system_shared_libs: [],
1829 stl: "none",
1830 stubs: {
1831 versions: ["29", "R"],
1832 },
1833 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001834 `,
1835 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1836 variables.Platform_version_active_codenames = []string{"R"}
1837 }),
1838 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001839
1840 expectLink := func(from, from_variant, to, to_variant string) {
1841 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1842 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1843 }
1844 expectNoLink := func(from, from_variant, to, to_variant string) {
1845 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1846 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1847 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001848 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1849 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001850 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1851 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001852}
1853
Jooyung Han4c4da062021-06-23 10:23:16 +09001854func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1855 testApex(t, `
1856 apex {
1857 name: "myapex",
1858 key: "myapex.key",
1859 java_libs: ["libx"],
1860 min_sdk_version: "S",
1861 }
1862
1863 apex_key {
1864 name: "myapex.key",
1865 public_key: "testkey.avbpubkey",
1866 private_key: "testkey.pem",
1867 }
1868
1869 java_library {
1870 name: "libx",
1871 srcs: ["a.java"],
1872 apex_available: [ "myapex" ],
1873 sdk_version: "current",
1874 min_sdk_version: "S", // should be okay
1875 }
1876 `,
1877 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1878 variables.Platform_version_active_codenames = []string{"S"}
1879 variables.Platform_sdk_codename = proptools.StringPtr("S")
1880 }),
1881 )
1882}
1883
Jooyung Han749dc692020-04-15 11:03:39 +09001884func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001885 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001886 apex {
1887 name: "myapex",
1888 key: "myapex.key",
1889 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001890 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001891 }
1892
1893 apex_key {
1894 name: "myapex.key",
1895 public_key: "testkey.avbpubkey",
1896 private_key: "testkey.pem",
1897 }
1898
1899 cc_library {
1900 name: "libx",
1901 shared_libs: ["libz"],
1902 system_shared_libs: [],
1903 stl: "none",
1904 apex_available: [ "myapex" ],
1905 }
1906
1907 cc_library {
1908 name: "libz",
1909 system_shared_libs: [],
1910 stl: "none",
1911 stubs: {
1912 versions: ["1", "2"],
1913 },
1914 }
1915 `)
1916
1917 expectLink := func(from, from_variant, to, to_variant string) {
1918 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1919 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1920 }
1921 expectNoLink := func(from, from_variant, to, to_variant string) {
1922 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1923 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1924 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001925 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001927 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001928 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001929}
1930
Jooyung Handfc864c2023-03-20 18:19:07 +09001931func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001932 ctx := testApex(t, `
1933 apex {
1934 name: "myapex",
1935 key: "myapex.key",
1936 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001937 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001938 vendor: true,
1939 min_sdk_version: "29",
1940 }
1941
1942 apex_key {
1943 name: "myapex.key",
1944 public_key: "testkey.avbpubkey",
1945 private_key: "testkey.pem",
1946 }
1947
1948 cc_library {
1949 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001950 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001951 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001952 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001953 shared_libs: ["libbar"],
1954 }
1955
1956 cc_library {
1957 name: "libbar",
1958 stubs: { versions: ["29", "30"] },
1959 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001960 }
1961 `)
1962
1963 vendorVariant := "android_vendor.29_arm64_armv8-a"
1964
Jooyung Handfc864c2023-03-20 18:19:07 +09001965 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1966
1967 // Ensure that mylib links with "current" LLNDK
1968 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1969 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1970
1971 // Ensure that mylib is targeting 29
1972 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1973 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1974
1975 // Ensure that the correct variant of crtbegin_so is used.
1976 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1977 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001978
1979 // Ensure that the crtbegin_so used by the APEX is targeting 29
1980 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1981 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1982}
1983
Jooyung Han4495f842023-04-25 16:39:59 +09001984func TestTrackAllowedDeps(t *testing.T) {
1985 ctx := testApex(t, `
1986 apex {
1987 name: "myapex",
1988 key: "myapex.key",
1989 updatable: true,
1990 native_shared_libs: [
1991 "mylib",
1992 "yourlib",
1993 ],
1994 min_sdk_version: "29",
1995 }
1996
1997 apex {
1998 name: "myapex2",
1999 key: "myapex.key",
2000 updatable: false,
2001 native_shared_libs: ["yourlib"],
2002 }
2003
2004 apex_key {
2005 name: "myapex.key",
2006 public_key: "testkey.avbpubkey",
2007 private_key: "testkey.pem",
2008 }
2009
2010 cc_library {
2011 name: "mylib",
2012 srcs: ["mylib.cpp"],
2013 shared_libs: ["libbar"],
2014 min_sdk_version: "29",
2015 apex_available: ["myapex"],
2016 }
2017
2018 cc_library {
2019 name: "libbar",
2020 stubs: { versions: ["29", "30"] },
2021 }
2022
2023 cc_library {
2024 name: "yourlib",
2025 srcs: ["mylib.cpp"],
2026 min_sdk_version: "29",
2027 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2028 }
2029 `, withFiles(android.MockFS{
2030 "packages/modules/common/build/allowed_deps.txt": nil,
2031 }))
2032
2033 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2034 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2035 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2036 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2037 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2038 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2039
2040 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2041 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2042 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2043 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2044 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2045 flatlist, "mylib:(minSdkVersion:29)")
2046 android.AssertStringListContains(t, "track platform-available lib",
2047 flatlist, "yourlib(minSdkVersion:29)")
2048}
2049
2050func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2051 ctx := testApex(t, `
2052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
2055 updatable: true,
2056 min_sdk_version: "29",
2057 }
2058
2059 apex_key {
2060 name: "myapex.key",
2061 public_key: "testkey.avbpubkey",
2062 private_key: "testkey.pem",
2063 }
2064 `)
2065 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2066 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2067 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2068 }
2069}
2070
Jooyung Han03b51852020-02-26 22:45:42 +09002071func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002072 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002073 apex {
2074 name: "myapex",
2075 key: "myapex.key",
2076 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002077 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002078 }
2079
2080 apex_key {
2081 name: "myapex.key",
2082 public_key: "testkey.avbpubkey",
2083 private_key: "testkey.pem",
2084 }
2085
2086 cc_library {
2087 name: "libx",
2088 system_shared_libs: [],
2089 stl: "none",
2090 apex_available: [ "myapex" ],
2091 stubs: {
2092 versions: ["1", "2"],
2093 },
2094 }
2095
2096 cc_library {
2097 name: "libz",
2098 shared_libs: ["libx"],
2099 system_shared_libs: [],
2100 stl: "none",
2101 }
2102 `)
2103
2104 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002105 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002106 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2107 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2108 }
2109 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002110 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002111 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2112 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2113 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002114 expectLink("libz", "shared", "libx", "shared_current")
2115 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002116 expectNoLink("libz", "shared", "libz", "shared_1")
2117 expectNoLink("libz", "shared", "libz", "shared")
2118}
2119
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002120var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2121 func(variables android.FixtureProductVariables) {
2122 variables.SanitizeDevice = []string{"hwaddress"}
2123 },
2124)
2125
Jooyung Han75568392020-03-20 04:29:24 +09002126func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002127 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002128 apex {
2129 name: "myapex",
2130 key: "myapex.key",
2131 native_shared_libs: ["libx"],
2132 min_sdk_version: "29",
2133 }
2134
2135 apex_key {
2136 name: "myapex.key",
2137 public_key: "testkey.avbpubkey",
2138 private_key: "testkey.pem",
2139 }
2140
2141 cc_library {
2142 name: "libx",
2143 shared_libs: ["libbar"],
2144 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002145 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002146 }
2147
2148 cc_library {
2149 name: "libbar",
2150 stubs: {
2151 versions: ["29", "30"],
2152 },
2153 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002154 `,
2155 prepareForTestWithSantitizeHwaddress,
2156 )
Jooyung Han03b51852020-02-26 22:45:42 +09002157 expectLink := func(from, from_variant, to, to_variant string) {
2158 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2159 libFlags := ld.Args["libFlags"]
2160 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2161 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002162 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002163}
2164
Jooyung Han75568392020-03-20 04:29:24 +09002165func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002166 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002167 apex {
2168 name: "myapex",
2169 key: "myapex.key",
2170 native_shared_libs: ["libx"],
2171 min_sdk_version: "29",
2172 }
2173
2174 apex_key {
2175 name: "myapex.key",
2176 public_key: "testkey.avbpubkey",
2177 private_key: "testkey.pem",
2178 }
2179
2180 cc_library {
2181 name: "libx",
2182 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002183 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002184 }
Jooyung Han75568392020-03-20 04:29:24 +09002185 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002186
2187 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002188 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002189 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002190 // note that platform variant is not.
2191 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002192 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002193}
2194
Jooyung Han749dc692020-04-15 11:03:39 +09002195func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2196 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002197 apex {
2198 name: "myapex",
2199 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002200 native_shared_libs: ["mylib"],
2201 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002202 }
2203
2204 apex_key {
2205 name: "myapex.key",
2206 public_key: "testkey.avbpubkey",
2207 private_key: "testkey.pem",
2208 }
Jooyung Han749dc692020-04-15 11:03:39 +09002209
2210 cc_library {
2211 name: "mylib",
2212 srcs: ["mylib.cpp"],
2213 system_shared_libs: [],
2214 stl: "none",
2215 apex_available: [
2216 "myapex",
2217 ],
2218 min_sdk_version: "30",
2219 }
2220 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002221
2222 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
2226 native_shared_libs: ["libfoo.ffi"],
2227 min_sdk_version: "29",
2228 }
2229
2230 apex_key {
2231 name: "myapex.key",
2232 public_key: "testkey.avbpubkey",
2233 private_key: "testkey.pem",
2234 }
2235
2236 rust_ffi_shared {
2237 name: "libfoo.ffi",
2238 srcs: ["foo.rs"],
2239 crate_name: "foo",
2240 apex_available: [
2241 "myapex",
2242 ],
2243 min_sdk_version: "30",
2244 }
2245 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002246
2247 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2248 apex {
2249 name: "myapex",
2250 key: "myapex.key",
2251 java_libs: ["libfoo"],
2252 min_sdk_version: "29",
2253 }
2254
2255 apex_key {
2256 name: "myapex.key",
2257 public_key: "testkey.avbpubkey",
2258 private_key: "testkey.pem",
2259 }
2260
2261 java_import {
2262 name: "libfoo",
2263 jars: ["libfoo.jar"],
2264 apex_available: [
2265 "myapex",
2266 ],
2267 min_sdk_version: "30",
2268 }
2269 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002270
2271 // Skip check for modules compiling against core API surface
2272 testApex(t, `
2273 apex {
2274 name: "myapex",
2275 key: "myapex.key",
2276 java_libs: ["libfoo"],
2277 min_sdk_version: "29",
2278 }
2279
2280 apex_key {
2281 name: "myapex.key",
2282 public_key: "testkey.avbpubkey",
2283 private_key: "testkey.pem",
2284 }
2285
2286 java_library {
2287 name: "libfoo",
2288 srcs: ["Foo.java"],
2289 apex_available: [
2290 "myapex",
2291 ],
2292 // Compile against core API surface
2293 sdk_version: "core_current",
2294 min_sdk_version: "30",
2295 }
2296 `)
2297
Jooyung Han749dc692020-04-15 11:03:39 +09002298}
2299
2300func TestApexMinSdkVersion_Okay(t *testing.T) {
2301 testApex(t, `
2302 apex {
2303 name: "myapex",
2304 key: "myapex.key",
2305 native_shared_libs: ["libfoo"],
2306 java_libs: ["libbar"],
2307 min_sdk_version: "29",
2308 }
2309
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315
2316 cc_library {
2317 name: "libfoo",
2318 srcs: ["mylib.cpp"],
2319 shared_libs: ["libfoo_dep"],
2320 apex_available: ["myapex"],
2321 min_sdk_version: "29",
2322 }
2323
2324 cc_library {
2325 name: "libfoo_dep",
2326 srcs: ["mylib.cpp"],
2327 apex_available: ["myapex"],
2328 min_sdk_version: "29",
2329 }
2330
2331 java_library {
2332 name: "libbar",
2333 sdk_version: "current",
2334 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002335 static_libs: [
2336 "libbar_dep",
2337 "libbar_import_dep",
2338 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002339 apex_available: ["myapex"],
2340 min_sdk_version: "29",
2341 }
2342
2343 java_library {
2344 name: "libbar_dep",
2345 sdk_version: "current",
2346 srcs: ["a.java"],
2347 apex_available: ["myapex"],
2348 min_sdk_version: "29",
2349 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002350
2351 java_import {
2352 name: "libbar_import_dep",
2353 jars: ["libbar.jar"],
2354 apex_available: ["myapex"],
2355 min_sdk_version: "29",
2356 }
Jooyung Han03b51852020-02-26 22:45:42 +09002357 `)
2358}
2359
Colin Cross8ca61c12022-10-06 21:00:14 -07002360func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2361 // Tests that an apex dependency with min_sdk_version higher than the
2362 // min_sdk_version of the apex is allowed as long as the dependency's
2363 // min_sdk_version is less than or equal to the api level that the
2364 // architecture was introduced in. In this case, arm64 didn't exist
2365 // until api level 21, so the arm64 code will never need to run on
2366 // an api level 20 device, even if other architectures of the apex
2367 // will.
2368 testApex(t, `
2369 apex {
2370 name: "myapex",
2371 key: "myapex.key",
2372 native_shared_libs: ["libfoo"],
2373 min_sdk_version: "20",
2374 }
2375
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381
2382 cc_library {
2383 name: "libfoo",
2384 srcs: ["mylib.cpp"],
2385 apex_available: ["myapex"],
2386 min_sdk_version: "21",
2387 stl: "none",
2388 }
2389 `)
2390}
2391
Artur Satayev8cf899a2020-04-15 17:29:42 +01002392func TestJavaStableSdkVersion(t *testing.T) {
2393 testCases := []struct {
2394 name string
2395 expectedError string
2396 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002397 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002398 }{
2399 {
2400 name: "Non-updatable apex with non-stable dep",
2401 bp: `
2402 apex {
2403 name: "myapex",
2404 java_libs: ["myjar"],
2405 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002406 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002407 }
2408 apex_key {
2409 name: "myapex.key",
2410 public_key: "testkey.avbpubkey",
2411 private_key: "testkey.pem",
2412 }
2413 java_library {
2414 name: "myjar",
2415 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002416 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002417 apex_available: ["myapex"],
2418 }
2419 `,
2420 },
2421 {
2422 name: "Updatable apex with stable dep",
2423 bp: `
2424 apex {
2425 name: "myapex",
2426 java_libs: ["myjar"],
2427 key: "myapex.key",
2428 updatable: true,
2429 min_sdk_version: "29",
2430 }
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436 java_library {
2437 name: "myjar",
2438 srcs: ["foo/bar/MyClass.java"],
2439 sdk_version: "current",
2440 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002441 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002442 }
2443 `,
2444 },
2445 {
2446 name: "Updatable apex with non-stable dep",
2447 expectedError: "cannot depend on \"myjar\"",
2448 bp: `
2449 apex {
2450 name: "myapex",
2451 java_libs: ["myjar"],
2452 key: "myapex.key",
2453 updatable: true,
2454 }
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460 java_library {
2461 name: "myjar",
2462 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002463 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002464 apex_available: ["myapex"],
2465 }
2466 `,
2467 },
2468 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002469 name: "Updatable apex with non-stable legacy core platform dep",
2470 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2471 bp: `
2472 apex {
2473 name: "myapex",
2474 java_libs: ["myjar-uses-legacy"],
2475 key: "myapex.key",
2476 updatable: true,
2477 }
2478 apex_key {
2479 name: "myapex.key",
2480 public_key: "testkey.avbpubkey",
2481 private_key: "testkey.pem",
2482 }
2483 java_library {
2484 name: "myjar-uses-legacy",
2485 srcs: ["foo/bar/MyClass.java"],
2486 sdk_version: "core_platform",
2487 apex_available: ["myapex"],
2488 }
2489 `,
2490 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2491 },
2492 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002493 name: "Updatable apex with non-stable transitive dep",
2494 // This is not actually detecting that the transitive dependency is unstable, rather it is
2495 // detecting that the transitive dependency is building against a wider API surface than the
2496 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002497 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002498 bp: `
2499 apex {
2500 name: "myapex",
2501 java_libs: ["myjar"],
2502 key: "myapex.key",
2503 updatable: true,
2504 }
2505 apex_key {
2506 name: "myapex.key",
2507 public_key: "testkey.avbpubkey",
2508 private_key: "testkey.pem",
2509 }
2510 java_library {
2511 name: "myjar",
2512 srcs: ["foo/bar/MyClass.java"],
2513 sdk_version: "current",
2514 apex_available: ["myapex"],
2515 static_libs: ["transitive-jar"],
2516 }
2517 java_library {
2518 name: "transitive-jar",
2519 srcs: ["foo/bar/MyClass.java"],
2520 sdk_version: "core_platform",
2521 apex_available: ["myapex"],
2522 }
2523 `,
2524 },
2525 }
2526
2527 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002528 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2529 continue
2530 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002531 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002532 errorHandler := android.FixtureExpectsNoErrors
2533 if test.expectedError != "" {
2534 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002535 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002536 android.GroupFixturePreparers(
2537 java.PrepareForTestWithJavaDefaultModules,
2538 PrepareForTestWithApexBuildComponents,
2539 prepareForTestWithMyapex,
2540 android.OptionalFixturePreparer(test.preparer),
2541 ).
2542 ExtendWithErrorHandler(errorHandler).
2543 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002544 })
2545 }
2546}
2547
Jooyung Han749dc692020-04-15 11:03:39 +09002548func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2549 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 native_shared_libs: ["mylib"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 cc_library {
2564 name: "mylib",
2565 srcs: ["mylib.cpp"],
2566 shared_libs: ["mylib2"],
2567 system_shared_libs: [],
2568 stl: "none",
2569 apex_available: [
2570 "myapex",
2571 ],
2572 min_sdk_version: "29",
2573 }
2574
2575 // indirect part of the apex
2576 cc_library {
2577 name: "mylib2",
2578 srcs: ["mylib.cpp"],
2579 system_shared_libs: [],
2580 stl: "none",
2581 apex_available: [
2582 "myapex",
2583 ],
2584 min_sdk_version: "30",
2585 }
2586 `)
2587}
2588
2589func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2590 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2591 apex {
2592 name: "myapex",
2593 key: "myapex.key",
2594 apps: ["AppFoo"],
2595 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002596 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 android_app {
2606 name: "AppFoo",
2607 srcs: ["foo/bar/MyClass.java"],
2608 sdk_version: "current",
2609 min_sdk_version: "29",
2610 system_modules: "none",
2611 stl: "none",
2612 static_libs: ["bar"],
2613 apex_available: [ "myapex" ],
2614 }
2615
2616 java_library {
2617 name: "bar",
2618 sdk_version: "current",
2619 srcs: ["a.java"],
2620 apex_available: [ "myapex" ],
2621 }
2622 `)
2623}
2624
2625func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002626 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002627 apex {
2628 name: "myapex",
2629 key: "myapex.key",
2630 native_shared_libs: ["mylib"],
2631 min_sdk_version: "29",
2632 }
2633
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002640 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002641 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2642 cc_library {
2643 name: "mylib",
2644 srcs: ["mylib.cpp"],
2645 shared_libs: ["mylib2"],
2646 system_shared_libs: [],
2647 stl: "none",
2648 apex_available: ["myapex", "otherapex"],
2649 min_sdk_version: "29",
2650 }
2651
2652 cc_library {
2653 name: "mylib2",
2654 srcs: ["mylib.cpp"],
2655 system_shared_libs: [],
2656 stl: "none",
2657 apex_available: ["otherapex"],
2658 stubs: { versions: ["29", "30"] },
2659 min_sdk_version: "30",
2660 }
2661
2662 apex {
2663 name: "otherapex",
2664 key: "myapex.key",
2665 native_shared_libs: ["mylib", "mylib2"],
2666 min_sdk_version: "30",
2667 }
2668 `)
2669 expectLink := func(from, from_variant, to, to_variant string) {
2670 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2671 libFlags := ld.Args["libFlags"]
2672 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2673 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002674 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002675 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002676}
2677
Jooyung Haned124c32021-01-26 11:43:46 +09002678func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002679 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2680 func(variables android.FixtureProductVariables) {
2681 variables.Platform_sdk_codename = proptools.StringPtr("S")
2682 variables.Platform_version_active_codenames = []string{"S"}
2683 },
2684 )
Jooyung Haned124c32021-01-26 11:43:46 +09002685 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2686 apex {
2687 name: "myapex",
2688 key: "myapex.key",
2689 native_shared_libs: ["libfoo"],
2690 min_sdk_version: "S",
2691 }
2692 apex_key {
2693 name: "myapex.key",
2694 public_key: "testkey.avbpubkey",
2695 private_key: "testkey.pem",
2696 }
2697 cc_library {
2698 name: "libfoo",
2699 shared_libs: ["libbar"],
2700 apex_available: ["myapex"],
2701 min_sdk_version: "29",
2702 }
2703 cc_library {
2704 name: "libbar",
2705 apex_available: ["myapex"],
2706 }
2707 `, withSAsActiveCodeNames)
2708}
2709
2710func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002711 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2712 variables.Platform_sdk_codename = proptools.StringPtr("S")
2713 variables.Platform_version_active_codenames = []string{"S", "T"}
2714 })
Colin Cross1c460562021-02-16 17:55:47 -08002715 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002716 apex {
2717 name: "myapex",
2718 key: "myapex.key",
2719 native_shared_libs: ["libfoo"],
2720 min_sdk_version: "S",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 cc_library {
2728 name: "libfoo",
2729 shared_libs: ["libbar"],
2730 apex_available: ["myapex"],
2731 min_sdk_version: "S",
2732 }
2733 cc_library {
2734 name: "libbar",
2735 stubs: {
2736 symbol_file: "libbar.map.txt",
2737 versions: ["30", "S", "T"],
2738 },
2739 }
2740 `, withSAsActiveCodeNames)
2741
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002742 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002743 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2744 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002745 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002746}
2747
Jiyong Park7c2ee712018-12-07 00:42:25 +09002748func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002749 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002750 apex {
2751 name: "myapex",
2752 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002753 native_shared_libs: ["mylib"],
2754 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002755 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002756 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002757 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002758 }
2759
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765
2766 prebuilt_etc {
2767 name: "myetc",
2768 src: "myprebuilt",
2769 sub_dir: "foo/bar",
2770 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002771
2772 cc_library {
2773 name: "mylib",
2774 srcs: ["mylib.cpp"],
2775 relative_install_path: "foo/bar",
2776 system_shared_libs: [],
2777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002778 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002779 }
2780
2781 cc_binary {
2782 name: "mybin",
2783 srcs: ["mylib.cpp"],
2784 relative_install_path: "foo/bar",
2785 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002787 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002788 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002789 `)
2790
Sundong Ahnabb64432019-10-22 13:58:29 +09002791 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002792 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002794 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002795 ensureContains(t, cmd, "/etc ")
2796 ensureContains(t, cmd, "/etc/foo ")
2797 ensureContains(t, cmd, "/etc/foo/bar ")
2798 ensureContains(t, cmd, "/lib64 ")
2799 ensureContains(t, cmd, "/lib64/foo ")
2800 ensureContains(t, cmd, "/lib64/foo/bar ")
2801 ensureContains(t, cmd, "/lib ")
2802 ensureContains(t, cmd, "/lib/foo ")
2803 ensureContains(t, cmd, "/lib/foo/bar ")
2804 ensureContains(t, cmd, "/bin ")
2805 ensureContains(t, cmd, "/bin/foo ")
2806 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002807}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002808
Jooyung Han35155c42020-02-06 17:33:20 +09002809func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002810 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002811 apex {
2812 name: "myapex",
2813 key: "myapex.key",
2814 multilib: {
2815 both: {
2816 native_shared_libs: ["mylib"],
2817 binaries: ["mybin"],
2818 },
2819 },
2820 compile_multilib: "both",
2821 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002822 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002823 }
2824
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830
2831 cc_library {
2832 name: "mylib",
2833 relative_install_path: "foo/bar",
2834 system_shared_libs: [],
2835 stl: "none",
2836 apex_available: [ "myapex" ],
2837 native_bridge_supported: true,
2838 }
2839
2840 cc_binary {
2841 name: "mybin",
2842 relative_install_path: "foo/bar",
2843 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002844 stl: "none",
2845 apex_available: [ "myapex" ],
2846 native_bridge_supported: true,
2847 compile_multilib: "both", // default is "first" for binary
2848 multilib: {
2849 lib64: {
2850 suffix: "64",
2851 },
2852 },
2853 }
2854 `, withNativeBridgeEnabled)
2855 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2856 "bin/foo/bar/mybin",
2857 "bin/foo/bar/mybin64",
2858 "bin/arm/foo/bar/mybin",
2859 "bin/arm64/foo/bar/mybin64",
2860 "lib/foo/bar/mylib.so",
2861 "lib/arm/foo/bar/mylib.so",
2862 "lib64/foo/bar/mylib.so",
2863 "lib64/arm64/foo/bar/mylib.so",
2864 })
2865}
2866
Jooyung Han85d61762020-06-24 23:50:26 +09002867func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002868 result := android.GroupFixturePreparers(
2869 prepareForApexTest,
2870 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2871 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002872 apex {
2873 name: "myapex",
2874 key: "myapex.key",
2875 binaries: ["mybin"],
2876 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002877 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002878 }
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884 cc_binary {
2885 name: "mybin",
2886 vendor: true,
2887 shared_libs: ["libfoo"],
2888 }
2889 cc_library {
2890 name: "libfoo",
2891 proprietary: true,
2892 }
2893 `)
2894
Colin Crossc68db4b2021-11-11 18:59:15 -08002895 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002896 "bin/mybin",
2897 "lib64/libfoo.so",
2898 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2899 "lib64/libc++.so",
2900 })
2901
Colin Crossc68db4b2021-11-11 18:59:15 -08002902 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2903 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002904 name := apexBundle.BaseModuleName()
2905 prefix := "TARGET_"
2906 var builder strings.Builder
2907 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002908 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002909 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002910 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002911
Colin Crossc68db4b2021-11-11 18:59:15 -08002912 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2914 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002915}
2916
Jooyung Hanc5a96762022-02-04 11:54:50 +09002917func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2918 testApexError(t, `Trying to include a VNDK library`, `
2919 apex {
2920 name: "myapex",
2921 key: "myapex.key",
2922 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2923 vendor: true,
2924 use_vndk_as_stable: true,
2925 updatable: false,
2926 }
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }`)
2932}
2933
Jooyung Handf78e212020-07-22 15:54:47 +09002934func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002935 // myapex myapex2
2936 // | |
2937 // mybin ------. mybin2
2938 // \ \ / |
2939 // (stable) .---\--------` |
2940 // \ / \ |
2941 // \ / \ /
2942 // libvndk libvendor
2943 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 binaries: ["mybin"],
2949 vendor: true,
2950 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002951 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002952 }
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958 cc_binary {
2959 name: "mybin",
2960 vendor: true,
2961 shared_libs: ["libvndk", "libvendor"],
2962 }
2963 cc_library {
2964 name: "libvndk",
2965 vndk: {
2966 enabled: true,
2967 },
2968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002969 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002970 }
2971 cc_library {
2972 name: "libvendor",
2973 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002974 stl: "none",
2975 }
2976 apex {
2977 name: "myapex2",
2978 key: "myapex.key",
2979 binaries: ["mybin2"],
2980 vendor: true,
2981 use_vndk_as_stable: false,
2982 updatable: false,
2983 }
2984 cc_binary {
2985 name: "mybin2",
2986 vendor: true,
2987 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002988 }
2989 `)
2990
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002991 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002992
Jooyung Han91f92032022-02-04 12:36:33 +09002993 for _, tc := range []struct {
2994 name string
2995 apexName string
2996 moduleName string
2997 moduleVariant string
2998 libs []string
2999 contents []string
3000 requireVndkNamespace bool
3001 }{
3002 {
3003 name: "use_vndk_as_stable",
3004 apexName: "myapex",
3005 moduleName: "mybin",
3006 moduleVariant: vendorVariant + "_apex10000",
3007 libs: []string{
3008 // should link with vendor variants of VNDK libs(libvndk/libc++)
3009 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3010 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3011 // unstable Vendor libs as APEX variant
3012 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3013 },
3014 contents: []string{
3015 "bin/mybin",
3016 "lib64/libvendor.so",
3017 // VNDK libs (libvndk/libc++) are not included
3018 },
3019 requireVndkNamespace: true,
3020 },
3021 {
3022 name: "!use_vndk_as_stable",
3023 apexName: "myapex2",
3024 moduleName: "mybin2",
3025 moduleVariant: vendorVariant + "_myapex2",
3026 libs: []string{
3027 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3028 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3029 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3030 // unstable vendor libs have "merged" APEX variants
3031 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3032 },
3033 contents: []string{
3034 "bin/mybin2",
3035 "lib64/libvendor.so",
3036 // VNDK libs are included as well
3037 "lib64/libvndk.so",
3038 "lib64/libc++.so",
3039 },
3040 requireVndkNamespace: false,
3041 },
3042 } {
3043 t.Run(tc.name, func(t *testing.T) {
3044 // Check linked libs
3045 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3046 libs := names(ldRule.Args["libFlags"])
3047 for _, lib := range tc.libs {
3048 ensureListContains(t, libs, lib)
3049 }
3050 // Check apex contents
3051 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003052
Jooyung Han91f92032022-02-04 12:36:33 +09003053 // Check "requireNativeLibs"
3054 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3055 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3056 if tc.requireVndkNamespace {
3057 ensureListContains(t, requireNativeLibs, ":vndk")
3058 } else {
3059 ensureListNotContains(t, requireNativeLibs, ":vndk")
3060 }
3061 })
3062 }
Jooyung Handf78e212020-07-22 15:54:47 +09003063}
3064
Justin Yun13decfb2021-03-08 19:25:55 +09003065func TestProductVariant(t *testing.T) {
3066 ctx := testApex(t, `
3067 apex {
3068 name: "myapex",
3069 key: "myapex.key",
3070 updatable: false,
3071 product_specific: true,
3072 binaries: ["foo"],
3073 }
3074
3075 apex_key {
3076 name: "myapex.key",
3077 public_key: "testkey.avbpubkey",
3078 private_key: "testkey.pem",
3079 }
3080
3081 cc_binary {
3082 name: "foo",
3083 product_available: true,
3084 apex_available: ["myapex"],
3085 srcs: ["foo.cpp"],
3086 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003087 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3088 variables.ProductVndkVersion = proptools.StringPtr("current")
3089 }),
3090 )
Justin Yun13decfb2021-03-08 19:25:55 +09003091
3092 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003093 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003094 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3095 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3096 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3097 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3098}
3099
Jooyung Han8e5685d2020-09-21 11:02:57 +09003100func TestApex_withPrebuiltFirmware(t *testing.T) {
3101 testCases := []struct {
3102 name string
3103 additionalProp string
3104 }{
3105 {"system apex with prebuilt_firmware", ""},
3106 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3107 }
3108 for _, tc := range testCases {
3109 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003110 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003111 apex {
3112 name: "myapex",
3113 key: "myapex.key",
3114 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003115 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003116 `+tc.additionalProp+`
3117 }
3118 apex_key {
3119 name: "myapex.key",
3120 public_key: "testkey.avbpubkey",
3121 private_key: "testkey.pem",
3122 }
3123 prebuilt_firmware {
3124 name: "myfirmware",
3125 src: "myfirmware.bin",
3126 filename_from_src: true,
3127 `+tc.additionalProp+`
3128 }
3129 `)
3130 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3131 "etc/firmware/myfirmware.bin",
3132 })
3133 })
3134 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003135}
3136
Jooyung Hanefb184e2020-06-25 17:14:25 +09003137func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003138 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003139 apex {
3140 name: "myapex",
3141 key: "myapex.key",
3142 vendor: true,
3143 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003144 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003145 }
3146
3147 apex_key {
3148 name: "myapex.key",
3149 public_key: "testkey.avbpubkey",
3150 private_key: "testkey.pem",
3151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 vendor_available: true,
3156 }
3157 `)
3158
3159 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003160 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003161 name := apexBundle.BaseModuleName()
3162 prefix := "TARGET_"
3163 var builder strings.Builder
3164 data.Custom(&builder, name, prefix, "", data)
3165 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003166 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 +09003167}
3168
Jooyung Han2ed99d02020-06-24 23:26:26 +09003169func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003170 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003171 apex {
3172 name: "myapex",
3173 key: "myapex.key",
3174 vintf_fragments: ["fragment.xml"],
3175 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003176 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003177 }
3178 apex_key {
3179 name: "myapex.key",
3180 public_key: "testkey.avbpubkey",
3181 private_key: "testkey.pem",
3182 }
3183 cc_binary {
3184 name: "mybin",
3185 }
3186 `)
3187
3188 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003189 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003190 name := apexBundle.BaseModuleName()
3191 prefix := "TARGET_"
3192 var builder strings.Builder
3193 data.Custom(&builder, name, prefix, "", data)
3194 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003195 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003196 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003197}
3198
Jiyong Park16e91a02018-12-20 18:18:08 +09003199func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003201 apex {
3202 name: "myapex",
3203 key: "myapex.key",
3204 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003206 }
3207
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213
3214 cc_library {
3215 name: "mylib",
3216 srcs: ["mylib.cpp"],
3217 system_shared_libs: [],
3218 stl: "none",
3219 stubs: {
3220 versions: ["1", "2", "3"],
3221 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003222 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003223 }
3224
3225 cc_binary {
3226 name: "not_in_apex",
3227 srcs: ["mylib.cpp"],
3228 static_libs: ["mylib"],
3229 static_executable: true,
3230 system_shared_libs: [],
3231 stl: "none",
3232 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003233 `)
3234
Colin Cross7113d202019-11-20 16:39:12 -08003235 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003236
3237 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003238 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003239}
Jiyong Park9335a262018-12-24 11:31:58 +09003240
3241func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003242 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003243 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003244 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003245 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003246 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003247 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003248 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 srcs: ["mylib.cpp"],
3255 system_shared_libs: [],
3256 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003257 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003258 }
3259
3260 apex_key {
3261 name: "myapex.key",
3262 public_key: "testkey.avbpubkey",
3263 private_key: "testkey.pem",
3264 }
3265
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003266 android_app_certificate {
3267 name: "myapex.certificate",
3268 certificate: "testkey",
3269 }
3270
3271 android_app_certificate {
3272 name: "myapex.certificate.override",
3273 certificate: "testkey.override",
3274 }
3275
Jiyong Park9335a262018-12-24 11:31:58 +09003276 `)
3277
3278 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003279 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003280
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003281 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3282 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003283 "vendor/foo/devkeys/testkey.avbpubkey")
3284 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003285 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3286 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003287 "vendor/foo/devkeys/testkey.pem")
3288 }
3289
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003290 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003291 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003292 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003293 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003294 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003295 }
3296}
Jiyong Park58e364a2019-01-19 19:24:06 +09003297
Jooyung Hanf121a652019-12-17 14:30:11 +09003298func TestCertificate(t *testing.T) {
3299 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003300 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003301 apex {
3302 name: "myapex",
3303 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 }
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }`)
3311 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3312 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3313 if actual := rule.Args["certificates"]; actual != expected {
3314 t.Errorf("certificates should be %q, not %q", expected, actual)
3315 }
3316 })
3317 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003318 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003319 apex {
3320 name: "myapex_keytest",
3321 key: "myapex.key",
3322 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003323 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003324 }
3325 apex_key {
3326 name: "myapex.key",
3327 public_key: "testkey.avbpubkey",
3328 private_key: "testkey.pem",
3329 }
3330 android_app_certificate {
3331 name: "myapex.certificate.override",
3332 certificate: "testkey.override",
3333 }`)
3334 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3335 expected := "testkey.override.x509.pem testkey.override.pk8"
3336 if actual := rule.Args["certificates"]; actual != expected {
3337 t.Errorf("certificates should be %q, not %q", expected, actual)
3338 }
3339 })
3340 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003341 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003342 apex {
3343 name: "myapex",
3344 key: "myapex.key",
3345 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003346 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 }
3348 apex_key {
3349 name: "myapex.key",
3350 public_key: "testkey.avbpubkey",
3351 private_key: "testkey.pem",
3352 }
3353 android_app_certificate {
3354 name: "myapex.certificate",
3355 certificate: "testkey",
3356 }`)
3357 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3358 expected := "testkey.x509.pem testkey.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 specifiec as <:module>", 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",
3369 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003370 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003371 }
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377 android_app_certificate {
3378 name: "myapex.certificate.override",
3379 certificate: "testkey.override",
3380 }`)
3381 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3382 expected := "testkey.override.x509.pem testkey.override.pk8"
3383 if actual := rule.Args["certificates"]; actual != expected {
3384 t.Errorf("certificates should be %q, not %q", expected, actual)
3385 }
3386 })
3387 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003388 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003389 apex {
3390 name: "myapex",
3391 key: "myapex.key",
3392 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003393 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003394 }
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }`)
3400 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3401 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3402 if actual := rule.Args["certificates"]; actual != expected {
3403 t.Errorf("certificates should be %q, not %q", expected, actual)
3404 }
3405 })
3406 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003407 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003408 apex {
3409 name: "myapex_keytest",
3410 key: "myapex.key",
3411 file_contexts: ":myapex-file_contexts",
3412 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003413 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003414 }
3415 apex_key {
3416 name: "myapex.key",
3417 public_key: "testkey.avbpubkey",
3418 private_key: "testkey.pem",
3419 }
3420 android_app_certificate {
3421 name: "myapex.certificate.override",
3422 certificate: "testkey.override",
3423 }`)
3424 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3425 expected := "testkey.override.x509.pem testkey.override.pk8"
3426 if actual := rule.Args["certificates"]; actual != expected {
3427 t.Errorf("certificates should be %q, not %q", expected, actual)
3428 }
3429 })
3430}
3431
Jiyong Park58e364a2019-01-19 19:24:06 +09003432func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003433 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003434 apex {
3435 name: "myapex",
3436 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003437 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003438 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003439 }
3440
3441 apex {
3442 name: "otherapex",
3443 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003444 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003445 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003446 }
3447
3448 apex_key {
3449 name: "myapex.key",
3450 public_key: "testkey.avbpubkey",
3451 private_key: "testkey.pem",
3452 }
3453
3454 cc_library {
3455 name: "mylib",
3456 srcs: ["mylib.cpp"],
3457 system_shared_libs: [],
3458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003459 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 "myapex",
3461 "otherapex",
3462 ],
Jooyung Han24282772020-03-21 23:20:55 +09003463 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003464 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003465 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003466 cc_library {
3467 name: "mylib2",
3468 srcs: ["mylib.cpp"],
3469 system_shared_libs: [],
3470 stl: "none",
3471 apex_available: [
3472 "myapex",
3473 "otherapex",
3474 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003475 static_libs: ["mylib3"],
3476 recovery_available: true,
3477 min_sdk_version: "29",
3478 }
3479 cc_library {
3480 name: "mylib3",
3481 srcs: ["mylib.cpp"],
3482 system_shared_libs: [],
3483 stl: "none",
3484 apex_available: [
3485 "myapex",
3486 "otherapex",
3487 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003488 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003489 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003490 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003491 `)
3492
Jooyung Hanc87a0592020-03-02 17:44:33 +09003493 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003494 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003495 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003496
Vinh Tranf9754732023-01-19 22:41:46 -05003497 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003498 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500
Vinh Tranf9754732023-01-19 22:41:46 -05003501 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003502 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003504
Colin Crossaede88c2020-08-11 12:17:01 -07003505 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3506 // each variant defines additional macros to distinguish which apex variant it is built for
3507
3508 // non-APEX variant does not have __ANDROID_APEX__ defined
3509 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3510 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3511
Vinh Tranf9754732023-01-19 22:41:46 -05003512 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003513 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3514 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003515
Jooyung Hanc87a0592020-03-02 17:44:33 +09003516 // non-APEX variant does not have __ANDROID_APEX__ defined
3517 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3519
Vinh Tranf9754732023-01-19 22:41:46 -05003520 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003521 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003523}
Jiyong Park7e636d02019-01-28 16:16:54 +09003524
3525func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003526 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003527 apex {
3528 name: "myapex",
3529 key: "myapex.key",
3530 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003531 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003532 }
3533
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539
3540 cc_library_headers {
3541 name: "mylib_headers",
3542 export_include_dirs: ["my_include"],
3543 system_shared_libs: [],
3544 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003545 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003546 }
3547
3548 cc_library {
3549 name: "mylib",
3550 srcs: ["mylib.cpp"],
3551 system_shared_libs: [],
3552 stl: "none",
3553 header_libs: ["mylib_headers"],
3554 export_header_lib_headers: ["mylib_headers"],
3555 stubs: {
3556 versions: ["1", "2", "3"],
3557 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003558 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003559 }
3560
3561 cc_library {
3562 name: "otherlib",
3563 srcs: ["mylib.cpp"],
3564 system_shared_libs: [],
3565 stl: "none",
3566 shared_libs: ["mylib"],
3567 }
3568 `)
3569
Colin Cross7113d202019-11-20 16:39:12 -08003570 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003571
3572 // Ensure that the include path of the header lib is exported to 'otherlib'
3573 ensureContains(t, cFlags, "-Imy_include")
3574}
Alex Light9670d332019-01-29 18:07:33 -08003575
Jiyong Park7cd10e32020-01-14 09:22:18 +09003576type fileInApex struct {
3577 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003578 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579 isLink bool
3580}
3581
Jooyung Han1724d582022-12-21 10:17:44 +09003582func (f fileInApex) String() string {
3583 return f.src + ":" + f.path
3584}
3585
3586func (f fileInApex) match(expectation string) bool {
3587 parts := strings.Split(expectation, ":")
3588 if len(parts) == 1 {
3589 match, _ := path.Match(parts[0], f.path)
3590 return match
3591 }
3592 if len(parts) == 2 {
3593 matchSrc, _ := path.Match(parts[0], f.src)
3594 matchDst, _ := path.Match(parts[1], f.path)
3595 return matchSrc && matchDst
3596 }
3597 panic("invalid expected file specification: " + expectation)
3598}
3599
Jooyung Hana57af4a2020-01-23 05:36:59 +00003600func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003602 module := ctx.ModuleForTests(moduleName, variant)
3603 apexRule := module.MaybeRule("apexRule")
3604 apexDir := "/image.apex/"
3605 if apexRule.Rule == nil {
3606 apexRule = module.Rule("zipApexRule")
3607 apexDir = "/image.zipapex/"
3608 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003610 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003611 for _, cmd := range strings.Split(copyCmds, "&&") {
3612 cmd = strings.TrimSpace(cmd)
3613 if cmd == "" {
3614 continue
3615 }
3616 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003619 switch terms[0] {
3620 case "mkdir":
3621 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 t.Fatal("copyCmds contains invalid cp command", cmd)
3624 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003626 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003627 isLink = false
3628 case "ln":
3629 if len(terms) != 3 && len(terms) != 4 {
3630 // ln LINK TARGET or ln -s LINK TARGET
3631 t.Fatal("copyCmds contains invalid ln command", cmd)
3632 }
3633 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003634 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003635 isLink = true
3636 default:
3637 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3638 }
3639 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003640 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003641 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003642 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 }
Jooyung Han1724d582022-12-21 10:17:44 +09003644 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003645 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003646 }
3647 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003648 return ret
3649}
3650
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003651func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var failed bool
3654 var surplus []string
3655 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003656 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003657 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003659 if file.match(expected) {
3660 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003661 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003662 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 }
3664 }
Jooyung Han1724d582022-12-21 10:17:44 +09003665 if !matchFound {
3666 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003667 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003669
Jooyung Han31c470b2019-10-18 16:26:59 +09003670 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003671 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 t.Log("surplus files", surplus)
3673 failed = true
3674 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003675
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003676 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003678 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 if !filesMatched[expected] {
3680 missing = append(missing, expected)
3681 }
3682 }
3683 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 t.Log("missing files", missing)
3685 failed = true
3686 }
3687 if failed {
3688 t.Fail()
3689 }
3690}
3691
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003692func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3693 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3694}
3695
3696func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3697 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3698 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3699 if deapexer.Output != nil {
3700 outputs = append(outputs, deapexer.Output.String())
3701 }
3702 for _, output := range deapexer.ImplicitOutputs {
3703 outputs = append(outputs, output.String())
3704 }
3705 actualFiles := make([]fileInApex, 0, len(outputs))
3706 for _, output := range outputs {
3707 dir := "/deapexer/"
3708 pos := strings.LastIndex(output, dir)
3709 if pos == -1 {
3710 t.Fatal("Unknown deapexer output ", output)
3711 }
3712 path := output[pos+len(dir):]
3713 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3714 }
3715 assertFileListEquals(t, files, actualFiles)
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003719 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003721 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003722 "etc/llndk.libraries.29.txt",
3723 "etc/vndkcore.libraries.29.txt",
3724 "etc/vndksp.libraries.29.txt",
3725 "etc/vndkprivate.libraries.29.txt",
3726 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003727 }
3728 testCases := []struct {
3729 vndkVersion string
3730 expectedFiles []string
3731 }{
3732 {
3733 vndkVersion: "current",
3734 expectedFiles: append(commonFiles,
3735 "lib/libvndk.so",
3736 "lib/libvndksp.so",
3737 "lib64/libvndk.so",
3738 "lib64/libvndksp.so"),
3739 },
3740 {
3741 vndkVersion: "",
3742 expectedFiles: append(commonFiles,
3743 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3744 "lib/libvndksp.so",
3745 "lib64/libvndksp.so"),
3746 },
3747 }
3748 for _, tc := range testCases {
3749 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3750 ctx := testApex(t, `
3751 apex_vndk {
3752 name: "com.android.vndk.current",
3753 key: "com.android.vndk.current.key",
3754 updatable: false,
3755 }
3756
3757 apex_key {
3758 name: "com.android.vndk.current.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
3763 cc_library {
3764 name: "libvndk",
3765 srcs: ["mylib.cpp"],
3766 vendor_available: true,
3767 product_available: true,
3768 vndk: {
3769 enabled: true,
3770 },
3771 system_shared_libs: [],
3772 stl: "none",
3773 apex_available: [ "com.android.vndk.current" ],
3774 }
3775
3776 cc_library {
3777 name: "libvndksp",
3778 srcs: ["mylib.cpp"],
3779 vendor_available: true,
3780 product_available: true,
3781 vndk: {
3782 enabled: true,
3783 support_system_process: true,
3784 },
3785 system_shared_libs: [],
3786 stl: "none",
3787 apex_available: [ "com.android.vndk.current" ],
3788 }
3789
3790 // VNDK-Ext should not cause any problems
3791
3792 cc_library {
3793 name: "libvndk.ext",
3794 srcs: ["mylib2.cpp"],
3795 vendor: true,
3796 vndk: {
3797 enabled: true,
3798 extends: "libvndk",
3799 },
3800 system_shared_libs: [],
3801 stl: "none",
3802 }
3803
3804 cc_library {
3805 name: "libvndksp.ext",
3806 srcs: ["mylib2.cpp"],
3807 vendor: true,
3808 vndk: {
3809 enabled: true,
3810 support_system_process: true,
3811 extends: "libvndksp",
3812 },
3813 system_shared_libs: [],
3814 stl: "none",
3815 }
3816 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3817 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3818 }))
3819 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3820 })
3821 }
Jooyung Han344d5432019-08-23 11:17:39 +09003822}
3823
3824func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003825 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003827 name: "com.android.vndk.current",
3828 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
3831
3832 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003833 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
3837
3838 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 name: "libvndk",
3840 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003842 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003843 vndk: {
3844 enabled: true,
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003848 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003849 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003850
3851 cc_prebuilt_library_shared {
3852 name: "libvndk.arm",
3853 srcs: ["libvndk.arm.so"],
3854 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003855 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 vndk: {
3857 enabled: true,
3858 },
3859 enabled: false,
3860 arch: {
3861 arm: {
3862 enabled: true,
3863 },
3864 },
3865 system_shared_libs: [],
3866 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003867 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 `+vndkLibrariesTxtFiles("current"),
3870 withFiles(map[string][]byte{
3871 "libvndk.so": nil,
3872 "libvndk.arm.so": nil,
3873 }))
Colin Cross2807f002021-03-02 10:15:29 -08003874 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 "lib/libvndk.so",
3876 "lib/libvndk.arm.so",
3877 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003878 "lib/libc++.so",
3879 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003880 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 })
Jooyung Han344d5432019-08-23 11:17:39 +09003882}
3883
Jooyung Han39edb6c2019-11-06 16:53:07 +09003884func vndkLibrariesTxtFiles(vers ...string) (result string) {
3885 for _, v := range vers {
3886 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003887 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003889 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 name: "` + txt + `.libraries.txt",
3891 }
3892 `
3893 }
3894 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003895 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003896 result += `
3897 prebuilt_etc {
3898 name: "` + txt + `.libraries.` + v + `.txt",
3899 src: "dummy.txt",
3900 }
3901 `
3902 }
3903 }
3904 }
3905 return
3906}
3907
Jooyung Han344d5432019-08-23 11:17:39 +09003908func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003909 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003910 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003911 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003912 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003913 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003914 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003916 }
3917
3918 apex_key {
3919 name: "myapex.key",
3920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 vndk_prebuilt_shared {
3925 name: "libvndk27",
3926 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 vndk: {
3930 enabled: true,
3931 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003932 target_arch: "arm64",
3933 arch: {
3934 arm: {
3935 srcs: ["libvndk27_arm.so"],
3936 },
3937 arm64: {
3938 srcs: ["libvndk27_arm64.so"],
3939 },
3940 },
Colin Cross2807f002021-03-02 10:15:29 -08003941 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003942 }
3943
3944 vndk_prebuilt_shared {
3945 name: "libvndk27",
3946 version: "27",
3947 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003948 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003949 vndk: {
3950 enabled: true,
3951 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003952 target_arch: "x86_64",
3953 arch: {
3954 x86: {
3955 srcs: ["libvndk27_x86.so"],
3956 },
3957 x86_64: {
3958 srcs: ["libvndk27_x86_64.so"],
3959 },
3960 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003961 }
3962 `+vndkLibrariesTxtFiles("27"),
3963 withFiles(map[string][]byte{
3964 "libvndk27_arm.so": nil,
3965 "libvndk27_arm64.so": nil,
3966 "libvndk27_x86.so": nil,
3967 "libvndk27_x86_64.so": nil,
3968 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003969
Colin Cross2807f002021-03-02 10:15:29 -08003970 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003971 "lib/libvndk27_arm.so",
3972 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003973 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003974 })
Jooyung Han344d5432019-08-23 11:17:39 +09003975}
3976
Jooyung Han90eee022019-10-01 20:02:42 +09003977func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003979 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003980 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003981 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003984 }
3985 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003986 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003987 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003988 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003989 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003990 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003991 }
3992 apex_key {
3993 name: "myapex.key",
3994 public_key: "testkey.avbpubkey",
3995 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003996 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003997
3998 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003999 module := ctx.ModuleForTests(moduleName, "android_common_image")
4000 apexManifestRule := module.Rule("apexManifestRule")
4001 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004002 }
4003
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004004 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004005 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004006}
4007
Jooyung Han344d5432019-08-23 11:17:39 +09004008func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004009 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004010 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004011 name: "com.android.vndk.current",
4012 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004015 }
4016
4017 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004018 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "libvndk",
4025 srcs: ["mylib.cpp"],
4026 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004027 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004028 native_bridge_supported: true,
4029 host_supported: true,
4030 vndk: {
4031 enabled: true,
4032 },
4033 system_shared_libs: [],
4034 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004035 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004036 }
Colin Cross2807f002021-03-02 10:15:29 -08004037 `+vndkLibrariesTxtFiles("current"),
4038 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004039
Colin Cross2807f002021-03-02 10:15:29 -08004040 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004041 "lib/libvndk.so",
4042 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004043 "lib/libc++.so",
4044 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004045 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004046 })
Jooyung Han344d5432019-08-23 11:17:39 +09004047}
4048
4049func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004050 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004051 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004052 name: "com.android.vndk.current",
4053 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004054 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004055 native_bridge_supported: true,
4056 }
4057
4058 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004059 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004060 public_key: "testkey.avbpubkey",
4061 private_key: "testkey.pem",
4062 }
4063
4064 cc_library {
4065 name: "libvndk",
4066 srcs: ["mylib.cpp"],
4067 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004068 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004069 native_bridge_supported: true,
4070 host_supported: true,
4071 vndk: {
4072 enabled: true,
4073 },
4074 system_shared_libs: [],
4075 stl: "none",
4076 }
4077 `)
4078}
4079
Jooyung Han31c470b2019-10-18 16:26:59 +09004080func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004081 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004083 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004085 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004086 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004087 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004088 }
4089
4090 apex_key {
4091 name: "myapex.key",
4092 public_key: "testkey.avbpubkey",
4093 private_key: "testkey.pem",
4094 }
4095
4096 vndk_prebuilt_shared {
4097 name: "libvndk27",
4098 version: "27",
4099 target_arch: "arm",
4100 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004101 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 vndk: {
4103 enabled: true,
4104 },
4105 arch: {
4106 arm: {
4107 srcs: ["libvndk27.so"],
4108 }
4109 },
4110 }
4111
4112 vndk_prebuilt_shared {
4113 name: "libvndk27",
4114 version: "27",
4115 target_arch: "arm",
4116 binder32bit: true,
4117 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004118 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004119 vndk: {
4120 enabled: true,
4121 },
4122 arch: {
4123 arm: {
4124 srcs: ["libvndk27binder32.so"],
4125 }
4126 },
Colin Cross2807f002021-03-02 10:15:29 -08004127 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004129 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 withFiles(map[string][]byte{
4131 "libvndk27.so": nil,
4132 "libvndk27binder32.so": nil,
4133 }),
4134 withBinder32bit,
4135 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004136 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004137 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4138 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 },
4140 }),
4141 )
4142
Colin Cross2807f002021-03-02 10:15:29 -08004143 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004145 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004146 })
4147}
4148
Jooyung Han45a96772020-06-15 14:59:42 +09004149func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004150 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004151 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004152 name: "com.android.vndk.current",
4153 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004154 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004155 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004156 }
4157
4158 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004159 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004160 public_key: "testkey.avbpubkey",
4161 private_key: "testkey.pem",
4162 }
4163
4164 cc_library {
4165 name: "libz",
4166 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004167 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004168 vndk: {
4169 enabled: true,
4170 },
4171 stubs: {
4172 symbol_file: "libz.map.txt",
4173 versions: ["30"],
4174 }
4175 }
4176 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4177 "libz.map.txt": nil,
4178 }))
4179
Colin Cross2807f002021-03-02 10:15:29 -08004180 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004181 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4182 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004183 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4184 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4185 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4186 "*/*",
4187 })
Jooyung Han45a96772020-06-15 14:59:42 +09004188}
4189
Jooyung Hane1633032019-08-01 17:41:43 +09004190func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004191 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004192 apex {
4193 name: "myapex_nodep",
4194 key: "myapex.key",
4195 native_shared_libs: ["lib_nodep"],
4196 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004197 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004198 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004199 }
4200
4201 apex {
4202 name: "myapex_dep",
4203 key: "myapex.key",
4204 native_shared_libs: ["lib_dep"],
4205 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004206 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004207 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004208 }
4209
4210 apex {
4211 name: "myapex_provider",
4212 key: "myapex.key",
4213 native_shared_libs: ["libfoo"],
4214 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004215 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004216 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004217 }
4218
4219 apex {
4220 name: "myapex_selfcontained",
4221 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004222 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004223 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004224 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004225 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004226 }
4227
4228 apex_key {
4229 name: "myapex.key",
4230 public_key: "testkey.avbpubkey",
4231 private_key: "testkey.pem",
4232 }
4233
4234 cc_library {
4235 name: "lib_nodep",
4236 srcs: ["mylib.cpp"],
4237 system_shared_libs: [],
4238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004239 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004240 }
4241
4242 cc_library {
4243 name: "lib_dep",
4244 srcs: ["mylib.cpp"],
4245 shared_libs: ["libfoo"],
4246 system_shared_libs: [],
4247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004248 apex_available: [
4249 "myapex_dep",
4250 "myapex_provider",
4251 "myapex_selfcontained",
4252 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004253 }
4254
4255 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004256 name: "lib_dep_on_bar",
4257 srcs: ["mylib.cpp"],
4258 shared_libs: ["libbar"],
4259 system_shared_libs: [],
4260 stl: "none",
4261 apex_available: [
4262 "myapex_selfcontained",
4263 ],
4264 }
4265
4266
4267 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004268 name: "libfoo",
4269 srcs: ["mytest.cpp"],
4270 stubs: {
4271 versions: ["1"],
4272 },
4273 system_shared_libs: [],
4274 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004275 apex_available: [
4276 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004277 ],
4278 }
4279
4280 cc_library {
4281 name: "libbar",
4282 srcs: ["mytest.cpp"],
4283 stubs: {
4284 versions: ["1"],
4285 },
4286 system_shared_libs: [],
4287 stl: "none",
4288 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004289 "myapex_selfcontained",
4290 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004291 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004292
Jooyung Hane1633032019-08-01 17:41:43 +09004293 `)
4294
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004295 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004296 var provideNativeLibs, requireNativeLibs []string
4297
Sundong Ahnabb64432019-10-22 13:58:29 +09004298 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004299 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4300 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004301 ensureListEmpty(t, provideNativeLibs)
4302 ensureListEmpty(t, requireNativeLibs)
4303
Sundong Ahnabb64432019-10-22 13:58:29 +09004304 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004305 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4306 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004307 ensureListEmpty(t, provideNativeLibs)
4308 ensureListContains(t, requireNativeLibs, "libfoo.so")
4309
Sundong Ahnabb64432019-10-22 13:58:29 +09004310 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004311 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4312 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004313 ensureListContains(t, provideNativeLibs, "libfoo.so")
4314 ensureListEmpty(t, requireNativeLibs)
4315
Sundong Ahnabb64432019-10-22 13:58:29 +09004316 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004317 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4318 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004319 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004320 ensureListEmpty(t, requireNativeLibs)
4321}
4322
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004323func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4324 ctx := testApex(t, `
4325 apex {
4326 name: "myapex",
4327 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004328 native_shared_libs: ["mylib"],
4329 updatable: false,
4330 }
4331
4332 apex_key {
4333 name: "myapex.key",
4334 public_key: "testkey.avbpubkey",
4335 private_key: "testkey.pem",
4336 }
4337
4338 cc_library {
4339 name: "mylib",
4340 srcs: ["mylib.cpp"],
4341 system_shared_libs: [],
4342 stl: "none",
4343 apex_available: [
4344 "//apex_available:platform",
4345 "myapex",
4346 ],
4347 }
4348 `, android.FixtureMergeEnv(map[string]string{
4349 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4350 }))
4351
Jooyung Han63dff462023-02-09 00:11:27 +00004352 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004353 apexManifestRule := module.Rule("apexManifestRule")
4354 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4355}
4356
Vinh Tran8f5310f2022-10-07 18:16:47 -04004357func TestCompileMultilibProp(t *testing.T) {
4358 testCases := []struct {
4359 compileMultiLibProp string
4360 containedLibs []string
4361 notContainedLibs []string
4362 }{
4363 {
4364 containedLibs: []string{
4365 "image.apex/lib64/mylib.so",
4366 "image.apex/lib/mylib.so",
4367 },
4368 compileMultiLibProp: `compile_multilib: "both",`,
4369 },
4370 {
4371 containedLibs: []string{"image.apex/lib64/mylib.so"},
4372 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4373 compileMultiLibProp: `compile_multilib: "first",`,
4374 },
4375 {
4376 containedLibs: []string{"image.apex/lib64/mylib.so"},
4377 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4378 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4379 },
4380 {
4381 containedLibs: []string{"image.apex/lib64/mylib.so"},
4382 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4383 compileMultiLibProp: `compile_multilib: "64",`,
4384 },
4385 {
4386 containedLibs: []string{"image.apex/lib/mylib.so"},
4387 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4388 compileMultiLibProp: `compile_multilib: "32",`,
4389 },
4390 }
4391 for _, testCase := range testCases {
4392 ctx := testApex(t, fmt.Sprintf(`
4393 apex {
4394 name: "myapex",
4395 key: "myapex.key",
4396 %s
4397 native_shared_libs: ["mylib"],
4398 updatable: false,
4399 }
4400 apex_key {
4401 name: "myapex.key",
4402 public_key: "testkey.avbpubkey",
4403 private_key: "testkey.pem",
4404 }
4405 cc_library {
4406 name: "mylib",
4407 srcs: ["mylib.cpp"],
4408 apex_available: [
4409 "//apex_available:platform",
4410 "myapex",
4411 ],
4412 }
4413 `, testCase.compileMultiLibProp),
4414 )
4415 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4416 apexRule := module.Rule("apexRule")
4417 copyCmds := apexRule.Args["copy_commands"]
4418 for _, containedLib := range testCase.containedLibs {
4419 ensureContains(t, copyCmds, containedLib)
4420 }
4421 for _, notContainedLib := range testCase.notContainedLibs {
4422 ensureNotContains(t, copyCmds, notContainedLib)
4423 }
4424 }
4425}
4426
Alex Light0851b882019-02-07 13:20:53 -08004427func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004428 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004429 apex {
4430 name: "myapex",
4431 key: "myapex.key",
4432 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004433 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004434 }
4435
4436 apex_key {
4437 name: "myapex.key",
4438 public_key: "testkey.avbpubkey",
4439 private_key: "testkey.pem",
4440 }
4441
4442 cc_library {
4443 name: "mylib_common",
4444 srcs: ["mylib.cpp"],
4445 system_shared_libs: [],
4446 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004447 apex_available: [
4448 "//apex_available:platform",
4449 "myapex",
4450 ],
Alex Light0851b882019-02-07 13:20:53 -08004451 }
4452 `)
4453
Sundong Ahnabb64432019-10-22 13:58:29 +09004454 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004455 apexRule := module.Rule("apexRule")
4456 copyCmds := apexRule.Args["copy_commands"]
4457
4458 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4459 t.Log("Apex was a test apex!")
4460 t.Fail()
4461 }
4462 // Ensure that main rule creates an output
4463 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4464
4465 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004466 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004467
4468 // Ensure that both direct and indirect deps are copied into apex
4469 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4470
Colin Cross7113d202019-11-20 16:39:12 -08004471 // Ensure that the platform variant ends with _shared
4472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004473
Colin Cross56a83212020-09-15 18:30:11 -07004474 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004475 t.Log("Found mylib_common not in any apex!")
4476 t.Fail()
4477 }
4478}
4479
4480func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004481 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004482 apex_test {
4483 name: "myapex",
4484 key: "myapex.key",
4485 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004487 }
4488
4489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
4494
4495 cc_library {
4496 name: "mylib_common_test",
4497 srcs: ["mylib.cpp"],
4498 system_shared_libs: [],
4499 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004500 // TODO: remove //apex_available:platform
4501 apex_available: [
4502 "//apex_available:platform",
4503 "myapex",
4504 ],
Alex Light0851b882019-02-07 13:20:53 -08004505 }
4506 `)
4507
Sundong Ahnabb64432019-10-22 13:58:29 +09004508 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004509 apexRule := module.Rule("apexRule")
4510 copyCmds := apexRule.Args["copy_commands"]
4511
4512 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4513 t.Log("Apex was not a test apex!")
4514 t.Fail()
4515 }
4516 // Ensure that main rule creates an output
4517 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4518
4519 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004520 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004521
4522 // Ensure that both direct and indirect deps are copied into apex
4523 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4524
Colin Cross7113d202019-11-20 16:39:12 -08004525 // Ensure that the platform variant ends with _shared
4526 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004527}
4528
Alex Light9670d332019-01-29 18:07:33 -08004529func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004530 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004531 apex {
4532 name: "myapex",
4533 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004534 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004535 multilib: {
4536 first: {
4537 native_shared_libs: ["mylib_common"],
4538 }
4539 },
4540 target: {
4541 android: {
4542 multilib: {
4543 first: {
4544 native_shared_libs: ["mylib"],
4545 }
4546 }
4547 },
4548 host: {
4549 multilib: {
4550 first: {
4551 native_shared_libs: ["mylib2"],
4552 }
4553 }
4554 }
4555 }
4556 }
4557
4558 apex_key {
4559 name: "myapex.key",
4560 public_key: "testkey.avbpubkey",
4561 private_key: "testkey.pem",
4562 }
4563
4564 cc_library {
4565 name: "mylib",
4566 srcs: ["mylib.cpp"],
4567 system_shared_libs: [],
4568 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004569 // TODO: remove //apex_available:platform
4570 apex_available: [
4571 "//apex_available:platform",
4572 "myapex",
4573 ],
Alex Light9670d332019-01-29 18:07:33 -08004574 }
4575
4576 cc_library {
4577 name: "mylib_common",
4578 srcs: ["mylib.cpp"],
4579 system_shared_libs: [],
4580 stl: "none",
4581 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004582 // TODO: remove //apex_available:platform
4583 apex_available: [
4584 "//apex_available:platform",
4585 "myapex",
4586 ],
Alex Light9670d332019-01-29 18:07:33 -08004587 }
4588
4589 cc_library {
4590 name: "mylib2",
4591 srcs: ["mylib.cpp"],
4592 system_shared_libs: [],
4593 stl: "none",
4594 compile_multilib: "first",
4595 }
4596 `)
4597
Sundong Ahnabb64432019-10-22 13:58:29 +09004598 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004599 copyCmds := apexRule.Args["copy_commands"]
4600
4601 // Ensure that main rule creates an output
4602 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4603
4604 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004605 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4606 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4607 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004608
4609 // Ensure that both direct and indirect deps are copied into apex
4610 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4611 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4612 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4613
Colin Cross7113d202019-11-20 16:39:12 -08004614 // Ensure that the platform variant ends with _shared
4615 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4616 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4617 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004618}
Jiyong Park04480cf2019-02-06 00:16:29 +09004619
Jiyong Park59140302020-12-14 18:44:04 +09004620func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004621 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004622 apex {
4623 name: "myapex",
4624 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004625 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004626 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004627 arch: {
4628 arm64: {
4629 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004630 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004631 },
4632 x86_64: {
4633 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004634 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004635 },
4636 }
4637 }
4638
4639 apex_key {
4640 name: "myapex.key",
4641 public_key: "testkey.avbpubkey",
4642 private_key: "testkey.pem",
4643 }
4644
4645 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004646 name: "mylib.generic",
4647 srcs: ["mylib.cpp"],
4648 system_shared_libs: [],
4649 stl: "none",
4650 // TODO: remove //apex_available:platform
4651 apex_available: [
4652 "//apex_available:platform",
4653 "myapex",
4654 ],
4655 }
4656
4657 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004658 name: "mylib.arm64",
4659 srcs: ["mylib.cpp"],
4660 system_shared_libs: [],
4661 stl: "none",
4662 // TODO: remove //apex_available:platform
4663 apex_available: [
4664 "//apex_available:platform",
4665 "myapex",
4666 ],
4667 }
4668
4669 cc_library {
4670 name: "mylib.x64",
4671 srcs: ["mylib.cpp"],
4672 system_shared_libs: [],
4673 stl: "none",
4674 // TODO: remove //apex_available:platform
4675 apex_available: [
4676 "//apex_available:platform",
4677 "myapex",
4678 ],
4679 }
4680 `)
4681
4682 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4683 copyCmds := apexRule.Args["copy_commands"]
4684
4685 // Ensure that apex variant is created for the direct dep
4686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004687 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004688 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4689
4690 // Ensure that both direct and indirect deps are copied into apex
4691 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4692 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4693}
4694
Jiyong Park04480cf2019-02-06 00:16:29 +09004695func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004696 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004697 apex {
4698 name: "myapex",
4699 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004700 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004701 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004702 }
4703
4704 apex_key {
4705 name: "myapex.key",
4706 public_key: "testkey.avbpubkey",
4707 private_key: "testkey.pem",
4708 }
4709
4710 sh_binary {
4711 name: "myscript",
4712 src: "mylib.cpp",
4713 filename: "myscript.sh",
4714 sub_dir: "script",
4715 }
4716 `)
4717
Sundong Ahnabb64432019-10-22 13:58:29 +09004718 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004719 copyCmds := apexRule.Args["copy_commands"]
4720
4721 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4722}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004723
Jooyung Han91df2082019-11-20 01:49:42 +09004724func TestApexInVariousPartition(t *testing.T) {
4725 testcases := []struct {
4726 propName, parition, flattenedPartition string
4727 }{
4728 {"", "system", "system_ext"},
4729 {"product_specific: true", "product", "product"},
4730 {"soc_specific: true", "vendor", "vendor"},
4731 {"proprietary: true", "vendor", "vendor"},
4732 {"vendor: true", "vendor", "vendor"},
4733 {"system_ext_specific: true", "system_ext", "system_ext"},
4734 }
4735 for _, tc := range testcases {
4736 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004737 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004738 apex {
4739 name: "myapex",
4740 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004741 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004742 `+tc.propName+`
4743 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004744
Jooyung Han91df2082019-11-20 01:49:42 +09004745 apex_key {
4746 name: "myapex.key",
4747 public_key: "testkey.avbpubkey",
4748 private_key: "testkey.pem",
4749 }
4750 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004751
Jooyung Han91df2082019-11-20 01:49:42 +09004752 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004753 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4754 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004755 if actual != expected {
4756 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4757 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004758
Jooyung Han91df2082019-11-20 01:49:42 +09004759 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004760 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4761 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004762 if actual != expected {
4763 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4764 }
4765 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004766 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004767}
Jiyong Park67882562019-03-21 01:11:21 +09004768
Jooyung Han580eb4f2020-06-24 19:33:06 +09004769func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004770 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004771 apex {
4772 name: "myapex",
4773 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004774 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004775 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004776
Jooyung Han580eb4f2020-06-24 19:33:06 +09004777 apex_key {
4778 name: "myapex.key",
4779 public_key: "testkey.avbpubkey",
4780 private_key: "testkey.pem",
4781 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004782 `)
4783 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004784 rule := module.Output("file_contexts")
4785 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4786}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004787
Jooyung Han580eb4f2020-06-24 19:33:06 +09004788func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004789 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 apex {
4791 name: "myapex",
4792 key: "myapex.key",
4793 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004794 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004795 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004796
Jooyung Han580eb4f2020-06-24 19:33:06 +09004797 apex_key {
4798 name: "myapex.key",
4799 public_key: "testkey.avbpubkey",
4800 private_key: "testkey.pem",
4801 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004802 `, withFiles(map[string][]byte{
4803 "my_own_file_contexts": nil,
4804 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004805}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806
Jooyung Han580eb4f2020-06-24 19:33:06 +09004807func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004808 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004809 apex {
4810 name: "myapex",
4811 key: "myapex.key",
4812 product_specific: true,
4813 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004814 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004816
Jooyung Han580eb4f2020-06-24 19:33:06 +09004817 apex_key {
4818 name: "myapex.key",
4819 public_key: "testkey.avbpubkey",
4820 private_key: "testkey.pem",
4821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822 `)
4823
Colin Cross1c460562021-02-16 17:55:47 -08004824 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004825 apex {
4826 name: "myapex",
4827 key: "myapex.key",
4828 product_specific: true,
4829 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004830 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004831 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004832
Jooyung Han580eb4f2020-06-24 19:33:06 +09004833 apex_key {
4834 name: "myapex.key",
4835 public_key: "testkey.avbpubkey",
4836 private_key: "testkey.pem",
4837 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004838 `, withFiles(map[string][]byte{
4839 "product_specific_file_contexts": nil,
4840 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004841 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4842 rule := module.Output("file_contexts")
4843 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4844}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004845
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004847 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004848 apex {
4849 name: "myapex",
4850 key: "myapex.key",
4851 product_specific: true,
4852 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004853 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004855
Jooyung Han580eb4f2020-06-24 19:33:06 +09004856 apex_key {
4857 name: "myapex.key",
4858 public_key: "testkey.avbpubkey",
4859 private_key: "testkey.pem",
4860 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004861
Jooyung Han580eb4f2020-06-24 19:33:06 +09004862 filegroup {
4863 name: "my-file-contexts",
4864 srcs: ["product_specific_file_contexts"],
4865 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004866 `, withFiles(map[string][]byte{
4867 "product_specific_file_contexts": nil,
4868 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004869 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4870 rule := module.Output("file_contexts")
4871 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004872}
4873
Jiyong Park67882562019-03-21 01:11:21 +09004874func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004875 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004876 apex_key {
4877 name: "myapex.key",
4878 public_key: ":my.avbpubkey",
4879 private_key: ":my.pem",
4880 product_specific: true,
4881 }
4882
4883 filegroup {
4884 name: "my.avbpubkey",
4885 srcs: ["testkey2.avbpubkey"],
4886 }
4887
4888 filegroup {
4889 name: "my.pem",
4890 srcs: ["testkey2.pem"],
4891 }
4892 `)
4893
4894 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4895 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004896 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004897 if actual_pubkey != expected_pubkey {
4898 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4899 }
4900 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004901 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004902 if actual_privkey != expected_privkey {
4903 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4904 }
4905}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004906
4907func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004908 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004909 prebuilt_apex {
4910 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004911 arch: {
4912 arm64: {
4913 src: "myapex-arm64.apex",
4914 },
4915 arm: {
4916 src: "myapex-arm.apex",
4917 },
4918 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004919 }
4920 `)
4921
Wei Li340ee8e2022-03-18 17:33:24 -07004922 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4923 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004924
Jiyong Parkc95714e2019-03-29 14:23:10 +09004925 expectedInput := "myapex-arm64.apex"
4926 if prebuilt.inputApex.String() != expectedInput {
4927 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4928 }
Wei Li340ee8e2022-03-18 17:33:24 -07004929 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4930 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4931 rule := testingModule.Rule("genProvenanceMetaData")
4932 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4933 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4934 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4935 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004936
4937 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4938 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004940
Paul Duffinc0609c62021-03-01 17:27:16 +00004941func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004942 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004943 prebuilt_apex {
4944 name: "myapex",
4945 }
4946 `)
4947}
4948
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004949func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004950 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004951 prebuilt_apex {
4952 name: "myapex",
4953 src: "myapex-arm.apex",
4954 filename: "notmyapex.apex",
4955 }
4956 `)
4957
Wei Li340ee8e2022-03-18 17:33:24 -07004958 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4959 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004960
4961 expected := "notmyapex.apex"
4962 if p.installFilename != expected {
4963 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4964 }
Wei Li340ee8e2022-03-18 17:33:24 -07004965 rule := testingModule.Rule("genProvenanceMetaData")
4966 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4967 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4968 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4969 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004970}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004971
Samiul Islam7c02e262021-09-08 17:48:28 +01004972func TestApexSetFilenameOverride(t *testing.T) {
4973 testApex(t, `
4974 apex_set {
4975 name: "com.company.android.myapex",
4976 apex_name: "com.android.myapex",
4977 set: "company-myapex.apks",
4978 filename: "com.company.android.myapex.apex"
4979 }
4980 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4981
4982 testApex(t, `
4983 apex_set {
4984 name: "com.company.android.myapex",
4985 apex_name: "com.android.myapex",
4986 set: "company-myapex.apks",
4987 filename: "com.company.android.myapex.capex"
4988 }
4989 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4990
4991 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4992 apex_set {
4993 name: "com.company.android.myapex",
4994 apex_name: "com.android.myapex",
4995 set: "company-myapex.apks",
4996 filename: "some-random-suffix"
4997 }
4998 `)
4999}
5000
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005001func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005002 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005003 prebuilt_apex {
5004 name: "myapex.prebuilt",
5005 src: "myapex-arm.apex",
5006 overrides: [
5007 "myapex",
5008 ],
5009 }
5010 `)
5011
Wei Li340ee8e2022-03-18 17:33:24 -07005012 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5013 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005014
5015 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005016 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005017 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005018 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005019 }
Wei Li340ee8e2022-03-18 17:33:24 -07005020 rule := testingModule.Rule("genProvenanceMetaData")
5021 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5022 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5023 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5024 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005025}
5026
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005027func TestPrebuiltApexName(t *testing.T) {
5028 testApex(t, `
5029 prebuilt_apex {
5030 name: "com.company.android.myapex",
5031 apex_name: "com.android.myapex",
5032 src: "company-myapex-arm.apex",
5033 }
5034 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5035
5036 testApex(t, `
5037 apex_set {
5038 name: "com.company.android.myapex",
5039 apex_name: "com.android.myapex",
5040 set: "company-myapex.apks",
5041 }
5042 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5043}
5044
5045func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5046 _ = android.GroupFixturePreparers(
5047 java.PrepareForTestWithJavaDefaultModules,
5048 PrepareForTestWithApexBuildComponents,
5049 android.FixtureWithRootAndroidBp(`
5050 platform_bootclasspath {
5051 name: "platform-bootclasspath",
5052 fragments: [
5053 {
5054 apex: "com.android.art",
5055 module: "art-bootclasspath-fragment",
5056 },
5057 ],
5058 }
5059
5060 prebuilt_apex {
5061 name: "com.company.android.art",
5062 apex_name: "com.android.art",
5063 src: "com.company.android.art-arm.apex",
5064 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5065 }
5066
5067 prebuilt_bootclasspath_fragment {
5068 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005069 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005070 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005071 hidden_api: {
5072 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5073 metadata: "my-bootclasspath-fragment/metadata.csv",
5074 index: "my-bootclasspath-fragment/index.csv",
5075 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5076 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5077 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005078 }
5079
5080 java_import {
5081 name: "core-oj",
5082 jars: ["prebuilt.jar"],
5083 }
5084 `),
5085 ).RunTest(t)
5086}
5087
Paul Duffin092153d2021-01-26 11:42:39 +00005088// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5089// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005090func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005091 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005092
Paul Duffin89886cb2021-02-05 16:44:03 +00005093 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005094 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005095 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005096 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005097 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005098 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005099 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5100 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5101 android.NormalizePathForTesting(dexJarBuildPath))
5102 }
5103
5104 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005105 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005106 // Make sure the import has been given the correct path to the dex jar.
5107 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5108 dexJarBuildPath := p.DexJarInstallPath()
5109 stem := android.RemoveOptionalPrebuiltPrefix(name)
5110 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5111 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5112 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005113 }
5114
Paul Duffin39853512021-02-26 11:09:39 +00005115 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005116 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005117 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005118 android.AssertArrayString(t, "Check if there is no source variant",
5119 []string{"android_common"},
5120 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005121 }
5122
5123 t.Run("prebuilt only", func(t *testing.T) {
5124 bp := `
5125 prebuilt_apex {
5126 name: "myapex",
5127 arch: {
5128 arm64: {
5129 src: "myapex-arm64.apex",
5130 },
5131 arm: {
5132 src: "myapex-arm.apex",
5133 },
5134 },
Paul Duffin39853512021-02-26 11:09:39 +00005135 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005136 }
5137
5138 java_import {
5139 name: "libfoo",
5140 jars: ["libfoo.jar"],
5141 }
Paul Duffin39853512021-02-26 11:09:39 +00005142
5143 java_sdk_library_import {
5144 name: "libbar",
5145 public: {
5146 jars: ["libbar.jar"],
5147 },
5148 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005149 `
5150
5151 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5152 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5153
Martin Stjernholm44825602021-09-17 01:44:12 +01005154 deapexerName := deapexerModuleName("myapex")
5155 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5156
Paul Duffinf6932af2021-02-26 18:21:56 +00005157 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005158 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005159 rule := deapexer.Rule("deapexer")
5160 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5161 t.Errorf("expected: %q, found: %q", expected, actual)
5162 }
5163
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005164 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005165 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005166 rule = prebuiltApex.Rule("android/soong/android.Cp")
5167 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5168 t.Errorf("expected: %q, found: %q", expected, actual)
5169 }
5170
Paul Duffin89886cb2021-02-05 16:44:03 +00005171 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005172 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005173
5174 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005175 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005176 })
5177
5178 t.Run("prebuilt with source preferred", func(t *testing.T) {
5179
5180 bp := `
5181 prebuilt_apex {
5182 name: "myapex",
5183 arch: {
5184 arm64: {
5185 src: "myapex-arm64.apex",
5186 },
5187 arm: {
5188 src: "myapex-arm.apex",
5189 },
5190 },
Paul Duffin39853512021-02-26 11:09:39 +00005191 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005192 }
5193
5194 java_import {
5195 name: "libfoo",
5196 jars: ["libfoo.jar"],
5197 }
5198
5199 java_library {
5200 name: "libfoo",
5201 }
Paul Duffin39853512021-02-26 11:09:39 +00005202
5203 java_sdk_library_import {
5204 name: "libbar",
5205 public: {
5206 jars: ["libbar.jar"],
5207 },
5208 }
5209
5210 java_sdk_library {
5211 name: "libbar",
5212 srcs: ["foo/bar/MyClass.java"],
5213 unsafe_ignore_missing_latest_api: true,
5214 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005215 `
5216
5217 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5218 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5219
Paul Duffin89886cb2021-02-05 16:44:03 +00005220 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005221 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005222 ensureNoSourceVariant(t, ctx, "libfoo")
5223
5224 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005225 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005226 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005227 })
5228
5229 t.Run("prebuilt preferred with source", func(t *testing.T) {
5230 bp := `
5231 prebuilt_apex {
5232 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005233 arch: {
5234 arm64: {
5235 src: "myapex-arm64.apex",
5236 },
5237 arm: {
5238 src: "myapex-arm.apex",
5239 },
5240 },
Paul Duffin39853512021-02-26 11:09:39 +00005241 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005242 }
5243
5244 java_import {
5245 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005246 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005247 jars: ["libfoo.jar"],
5248 }
5249
5250 java_library {
5251 name: "libfoo",
5252 }
Paul Duffin39853512021-02-26 11:09:39 +00005253
5254 java_sdk_library_import {
5255 name: "libbar",
5256 prefer: true,
5257 public: {
5258 jars: ["libbar.jar"],
5259 },
5260 }
5261
5262 java_sdk_library {
5263 name: "libbar",
5264 srcs: ["foo/bar/MyClass.java"],
5265 unsafe_ignore_missing_latest_api: true,
5266 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005267 `
5268
5269 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5270 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5271
Paul Duffin89886cb2021-02-05 16:44:03 +00005272 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005273 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005274 ensureNoSourceVariant(t, ctx, "libfoo")
5275
5276 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005277 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005278 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005279 })
5280}
5281
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005282func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005283 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005284 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005285 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5286 // is disabled.
5287 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5288 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005289
Paul Duffin37856732021-02-26 14:24:15 +00005290 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5291 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005292 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005293 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005294 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005295 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005296 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005297 foundLibfooJar = true
5298 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005299 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 }
5301 }
5302 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005303 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 +00005304 }
5305 }
5306
Paul Duffin40a3f652021-07-19 13:11:24 +01005307 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005308 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005309 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005310 var rule android.TestingBuildParams
5311
5312 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5313 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005314 }
5315
Paul Duffin40a3f652021-07-19 13:11:24 +01005316 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5317 t.Helper()
5318 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5319 var rule android.TestingBuildParams
5320
5321 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5322 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5323 }
5324
Paul Duffin89f570a2021-06-16 01:42:33 +01005325 fragment := java.ApexVariantReference{
5326 Apex: proptools.StringPtr("myapex"),
5327 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5328 }
5329
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005330 t.Run("prebuilt only", func(t *testing.T) {
5331 bp := `
5332 prebuilt_apex {
5333 name: "myapex",
5334 arch: {
5335 arm64: {
5336 src: "myapex-arm64.apex",
5337 },
5338 arm: {
5339 src: "myapex-arm.apex",
5340 },
5341 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005342 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5343 }
5344
5345 prebuilt_bootclasspath_fragment {
5346 name: "my-bootclasspath-fragment",
5347 contents: ["libfoo", "libbar"],
5348 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005349 hidden_api: {
5350 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5351 metadata: "my-bootclasspath-fragment/metadata.csv",
5352 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005353 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5354 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5355 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005356 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005357 }
5358
5359 java_import {
5360 name: "libfoo",
5361 jars: ["libfoo.jar"],
5362 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005363 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
Paul Duffin37856732021-02-26 14:24:15 +00005365
5366 java_sdk_library_import {
5367 name: "libbar",
5368 public: {
5369 jars: ["libbar.jar"],
5370 },
5371 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005372 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005373 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005374 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005375 `
5376
Paul Duffin89f570a2021-06-16 01:42:33 +01005377 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005378 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5379 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005380
Paul Duffin537ea3d2021-05-14 10:38:00 +01005381 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005382 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005383 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005384 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005385 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5386 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005387 })
5388
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005389 t.Run("apex_set only", func(t *testing.T) {
5390 bp := `
5391 apex_set {
5392 name: "myapex",
5393 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005394 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005395 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005396 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5397 }
5398
5399 java_import {
5400 name: "myjavalib",
5401 jars: ["myjavalib.jar"],
5402 apex_available: ["myapex"],
5403 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005404 }
5405
5406 prebuilt_bootclasspath_fragment {
5407 name: "my-bootclasspath-fragment",
5408 contents: ["libfoo", "libbar"],
5409 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005410 hidden_api: {
5411 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5412 metadata: "my-bootclasspath-fragment/metadata.csv",
5413 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005414 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5415 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5416 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005417 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005418 }
5419
Liz Kammer2dc72442023-04-20 10:10:48 -04005420 prebuilt_systemserverclasspath_fragment {
5421 name: "my-systemserverclasspath-fragment",
5422 contents: ["libbaz"],
5423 apex_available: ["myapex"],
5424 }
5425
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005426 java_import {
5427 name: "libfoo",
5428 jars: ["libfoo.jar"],
5429 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005430 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005431 }
5432
5433 java_sdk_library_import {
5434 name: "libbar",
5435 public: {
5436 jars: ["libbar.jar"],
5437 },
5438 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005440 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005441 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005442
5443 java_sdk_library_import {
5444 name: "libbaz",
5445 public: {
5446 jars: ["libbaz.jar"],
5447 },
5448 apex_available: ["myapex"],
5449 shared_library: false,
5450 permitted_packages: ["baz"],
5451 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005452 `
5453
Paul Duffin89f570a2021-06-16 01:42:33 +01005454 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005455 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5456 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5457
Paul Duffin537ea3d2021-05-14 10:38:00 +01005458 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005459 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005460 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005461 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005462 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5463 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005464
5465 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5466
5467 overrideNames := []string{
5468 "",
5469 "myjavalib.myapex",
5470 "libfoo.myapex",
5471 "libbar.myapex",
5472 "libbaz.myapex",
5473 }
5474 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5475 for i, e := range mkEntries {
5476 g := e.OverrideName
5477 if w := overrideNames[i]; w != g {
5478 t.Errorf("Expected override name %q, got %q", w, g)
5479 }
5480 }
5481
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005482 })
5483
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5485 bp := `
5486 prebuilt_apex {
5487 name: "myapex",
5488 arch: {
5489 arm64: {
5490 src: "myapex-arm64.apex",
5491 },
5492 arm: {
5493 src: "myapex-arm.apex",
5494 },
5495 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005496 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5497 }
5498
5499 prebuilt_bootclasspath_fragment {
5500 name: "my-bootclasspath-fragment",
5501 contents: ["libfoo", "libbar"],
5502 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005503 hidden_api: {
5504 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5505 metadata: "my-bootclasspath-fragment/metadata.csv",
5506 index: "my-bootclasspath-fragment/index.csv",
5507 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5508 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5509 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005510 }
5511
5512 java_import {
5513 name: "libfoo",
5514 jars: ["libfoo.jar"],
5515 apex_available: ["myapex"],
5516 }
5517
5518 java_library {
5519 name: "libfoo",
5520 srcs: ["foo/bar/MyClass.java"],
5521 apex_available: ["myapex"],
5522 }
Paul Duffin37856732021-02-26 14:24:15 +00005523
5524 java_sdk_library_import {
5525 name: "libbar",
5526 public: {
5527 jars: ["libbar.jar"],
5528 },
5529 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005530 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005531 }
5532
5533 java_sdk_library {
5534 name: "libbar",
5535 srcs: ["foo/bar/MyClass.java"],
5536 unsafe_ignore_missing_latest_api: true,
5537 apex_available: ["myapex"],
5538 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 `
5540
5541 // In this test the source (java_library) libfoo is active since the
5542 // prebuilt (java_import) defaults to prefer:false. However the
5543 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5544 // find the dex boot jar in it. We either need to disable the source libfoo
5545 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005546 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005547 // dexbootjar check is skipped if AllowMissingDependencies is true
5548 preparerAllowMissingDeps := android.GroupFixturePreparers(
5549 preparer,
5550 android.PrepareForTestWithAllowMissingDependencies,
5551 )
5552 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005553 })
5554
5555 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5556 bp := `
5557 prebuilt_apex {
5558 name: "myapex",
5559 arch: {
5560 arm64: {
5561 src: "myapex-arm64.apex",
5562 },
5563 arm: {
5564 src: "myapex-arm.apex",
5565 },
5566 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5568 }
5569
5570 prebuilt_bootclasspath_fragment {
5571 name: "my-bootclasspath-fragment",
5572 contents: ["libfoo", "libbar"],
5573 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005574 hidden_api: {
5575 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5576 metadata: "my-bootclasspath-fragment/metadata.csv",
5577 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005578 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5579 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5580 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005581 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005582 }
5583
5584 java_import {
5585 name: "libfoo",
5586 prefer: true,
5587 jars: ["libfoo.jar"],
5588 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005589 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005590 }
5591
5592 java_library {
5593 name: "libfoo",
5594 srcs: ["foo/bar/MyClass.java"],
5595 apex_available: ["myapex"],
5596 }
Paul Duffin37856732021-02-26 14:24:15 +00005597
5598 java_sdk_library_import {
5599 name: "libbar",
5600 prefer: true,
5601 public: {
5602 jars: ["libbar.jar"],
5603 },
5604 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005605 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005606 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005607 }
5608
5609 java_sdk_library {
5610 name: "libbar",
5611 srcs: ["foo/bar/MyClass.java"],
5612 unsafe_ignore_missing_latest_api: true,
5613 apex_available: ["myapex"],
5614 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005615 `
5616
Paul Duffin89f570a2021-06-16 01:42:33 +01005617 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005618 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5619 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005620
Paul Duffin537ea3d2021-05-14 10:38:00 +01005621 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005622 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005623 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005624 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005625 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5626 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005627 })
5628
5629 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5630 bp := `
5631 apex {
5632 name: "myapex",
5633 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005634 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005635 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005636 }
5637
5638 apex_key {
5639 name: "myapex.key",
5640 public_key: "testkey.avbpubkey",
5641 private_key: "testkey.pem",
5642 }
5643
5644 prebuilt_apex {
5645 name: "myapex",
5646 arch: {
5647 arm64: {
5648 src: "myapex-arm64.apex",
5649 },
5650 arm: {
5651 src: "myapex-arm.apex",
5652 },
5653 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005654 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5655 }
5656
5657 prebuilt_bootclasspath_fragment {
5658 name: "my-bootclasspath-fragment",
5659 contents: ["libfoo", "libbar"],
5660 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005661 hidden_api: {
5662 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5663 metadata: "my-bootclasspath-fragment/metadata.csv",
5664 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005665 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5666 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5667 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005668 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005669 }
5670
5671 java_import {
5672 name: "libfoo",
5673 jars: ["libfoo.jar"],
5674 apex_available: ["myapex"],
5675 }
5676
5677 java_library {
5678 name: "libfoo",
5679 srcs: ["foo/bar/MyClass.java"],
5680 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005681 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
Paul Duffin37856732021-02-26 14:24:15 +00005683
5684 java_sdk_library_import {
5685 name: "libbar",
5686 public: {
5687 jars: ["libbar.jar"],
5688 },
5689 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005691 }
5692
5693 java_sdk_library {
5694 name: "libbar",
5695 srcs: ["foo/bar/MyClass.java"],
5696 unsafe_ignore_missing_latest_api: true,
5697 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005698 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005699 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005700 `
5701
Paul Duffin89f570a2021-06-16 01:42:33 +01005702 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005703 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5704 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005705
Paul Duffin537ea3d2021-05-14 10:38:00 +01005706 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005707 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005708 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005709 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005710 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5711 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005712 })
5713
5714 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5715 bp := `
5716 apex {
5717 name: "myapex",
5718 enabled: false,
5719 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005720 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 prebuilt_apex {
5730 name: "myapex",
5731 arch: {
5732 arm64: {
5733 src: "myapex-arm64.apex",
5734 },
5735 arm: {
5736 src: "myapex-arm.apex",
5737 },
5738 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005739 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5740 }
5741
5742 prebuilt_bootclasspath_fragment {
5743 name: "my-bootclasspath-fragment",
5744 contents: ["libfoo", "libbar"],
5745 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005746 hidden_api: {
5747 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5748 metadata: "my-bootclasspath-fragment/metadata.csv",
5749 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005750 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5751 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5752 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005753 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005754 }
5755
5756 java_import {
5757 name: "libfoo",
5758 prefer: true,
5759 jars: ["libfoo.jar"],
5760 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005761 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005762 }
5763
5764 java_library {
5765 name: "libfoo",
5766 srcs: ["foo/bar/MyClass.java"],
5767 apex_available: ["myapex"],
5768 }
Paul Duffin37856732021-02-26 14:24:15 +00005769
5770 java_sdk_library_import {
5771 name: "libbar",
5772 prefer: true,
5773 public: {
5774 jars: ["libbar.jar"],
5775 },
5776 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005777 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005778 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005779 }
5780
5781 java_sdk_library {
5782 name: "libbar",
5783 srcs: ["foo/bar/MyClass.java"],
5784 unsafe_ignore_missing_latest_api: true,
5785 apex_available: ["myapex"],
5786 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005787 `
5788
Paul Duffin89f570a2021-06-16 01:42:33 +01005789 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005790 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5791 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005792
Paul Duffin537ea3d2021-05-14 10:38:00 +01005793 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005794 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005795 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005796 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005797 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5798 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005799 })
5800}
5801
Roland Levillain630846d2019-06-26 12:48:34 +01005802func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005803 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005804 apex_test {
5805 name: "myapex",
5806 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005807 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005808 tests: [
5809 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005810 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005811 ],
5812 }
5813
5814 apex_key {
5815 name: "myapex.key",
5816 public_key: "testkey.avbpubkey",
5817 private_key: "testkey.pem",
5818 }
5819
Liz Kammer1c14a212020-05-12 15:26:55 -07005820 filegroup {
5821 name: "fg",
5822 srcs: [
5823 "baz",
5824 "bar/baz"
5825 ],
5826 }
5827
Roland Levillain630846d2019-06-26 12:48:34 +01005828 cc_test {
5829 name: "mytest",
5830 gtest: false,
5831 srcs: ["mytest.cpp"],
5832 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005833 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005834 system_shared_libs: [],
5835 static_executable: true,
5836 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005837 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005838 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005839
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005840 cc_library {
5841 name: "mylib",
5842 srcs: ["mylib.cpp"],
5843 system_shared_libs: [],
5844 stl: "none",
5845 }
5846
Liz Kammer5bd365f2020-05-27 15:15:11 -07005847 filegroup {
5848 name: "fg2",
5849 srcs: [
5850 "testdata/baz"
5851 ],
5852 }
5853
Roland Levillain9b5fde92019-06-28 15:41:19 +01005854 cc_test {
5855 name: "mytests",
5856 gtest: false,
5857 srcs: [
5858 "mytest1.cpp",
5859 "mytest2.cpp",
5860 "mytest3.cpp",
5861 ],
5862 test_per_src: true,
5863 relative_install_path: "test",
5864 system_shared_libs: [],
5865 static_executable: true,
5866 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005867 data: [
5868 ":fg",
5869 ":fg2",
5870 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005871 }
Roland Levillain630846d2019-06-26 12:48:34 +01005872 `)
5873
Sundong Ahnabb64432019-10-22 13:58:29 +09005874 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005875 copyCmds := apexRule.Args["copy_commands"]
5876
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005877 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005878 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005879 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005880
Liz Kammer1c14a212020-05-12 15:26:55 -07005881 //Ensure that test data are copied into apex.
5882 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5883 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5884
Roland Levillain9b5fde92019-06-28 15:41:19 +01005885 // Ensure that test deps built with `test_per_src` are copied into apex.
5886 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5887 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5888 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005889
5890 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005891 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005892 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005893 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005894 prefix := "TARGET_"
5895 var builder strings.Builder
5896 data.Custom(&builder, name, prefix, "", data)
5897 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005898 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5899 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5900 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5901 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5902 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5903 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005904 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005905
5906 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005907 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005908 data.Custom(&builder, name, prefix, "", data)
5909 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005910 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5911 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005912}
5913
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005914func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005915 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005916 apex {
5917 name: "myapex",
5918 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005919 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005920 }
5921 apex_key {
5922 name: "myapex.key",
5923 public_key: "testkey.avbpubkey",
5924 private_key: "testkey.pem",
5925 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005926 `,
5927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5928 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5929 }),
5930 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005931 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005932 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005933 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005934 var builder strings.Builder
5935 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5936 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005937 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005938}
5939
Jooyung Hand48f3c32019-08-23 11:18:57 +09005940func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5941 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5942 apex {
5943 name: "myapex",
5944 key: "myapex.key",
5945 native_shared_libs: ["libfoo"],
5946 }
5947
5948 apex_key {
5949 name: "myapex.key",
5950 public_key: "testkey.avbpubkey",
5951 private_key: "testkey.pem",
5952 }
5953
5954 cc_library {
5955 name: "libfoo",
5956 stl: "none",
5957 system_shared_libs: [],
5958 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005959 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005960 }
5961 `)
5962 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5963 apex {
5964 name: "myapex",
5965 key: "myapex.key",
5966 java_libs: ["myjar"],
5967 }
5968
5969 apex_key {
5970 name: "myapex.key",
5971 public_key: "testkey.avbpubkey",
5972 private_key: "testkey.pem",
5973 }
5974
5975 java_library {
5976 name: "myjar",
5977 srcs: ["foo/bar/MyClass.java"],
5978 sdk_version: "none",
5979 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005980 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005981 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005982 }
5983 `)
5984}
5985
Bill Peckhama41a6962021-01-11 10:58:54 -08005986func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005987 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005988 apex {
5989 name: "myapex",
5990 key: "myapex.key",
5991 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005992 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005993 }
5994
5995 apex_key {
5996 name: "myapex.key",
5997 public_key: "testkey.avbpubkey",
5998 private_key: "testkey.pem",
5999 }
6000
6001 java_import {
6002 name: "myjavaimport",
6003 apex_available: ["myapex"],
6004 jars: ["my.jar"],
6005 compile_dex: true,
6006 }
6007 `)
6008
6009 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6010 apexRule := module.Rule("apexRule")
6011 copyCmds := apexRule.Args["copy_commands"]
6012 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6013}
6014
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006015func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006016 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006017 apex {
6018 name: "myapex",
6019 key: "myapex.key",
6020 apps: [
6021 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006022 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006023 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006024 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006025 }
6026
6027 apex_key {
6028 name: "myapex.key",
6029 public_key: "testkey.avbpubkey",
6030 private_key: "testkey.pem",
6031 }
6032
6033 android_app {
6034 name: "AppFoo",
6035 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006036 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006037 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006038 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006039 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006040 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006041 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006042
6043 android_app {
6044 name: "AppFooPriv",
6045 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006046 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006047 system_modules: "none",
6048 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08006049 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006050 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006051 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006052
6053 cc_library_shared {
6054 name: "libjni",
6055 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006056 shared_libs: ["libfoo"],
6057 stl: "none",
6058 system_shared_libs: [],
6059 apex_available: [ "myapex" ],
6060 sdk_version: "current",
6061 }
6062
6063 cc_library_shared {
6064 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006065 stl: "none",
6066 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006067 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006068 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006069 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006070 `)
6071
Sundong Ahnabb64432019-10-22 13:58:29 +09006072 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006073 apexRule := module.Rule("apexRule")
6074 copyCmds := apexRule.Args["copy_commands"]
6075
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006076 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6077 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006078
Colin Crossaede88c2020-08-11 12:17:01 -07006079 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006080 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006081 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006082 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006083 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006084 // JNI libraries including transitive deps are
6085 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006086 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006087 // ... embedded inside APK (jnilibs.zip)
6088 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6089 // ... and not directly inside the APEX
6090 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6091 }
Dario Frenicde2a032019-10-27 00:29:22 +01006092}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006093
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006094func TestApexWithAppImportBuildId(t *testing.T) {
6095 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6096 for _, id := range invalidBuildIds {
6097 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6098 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6099 variables.BuildId = proptools.StringPtr(id)
6100 })
6101 testApexError(t, message, `apex {
6102 name: "myapex",
6103 key: "myapex.key",
6104 apps: ["AppFooPrebuilt"],
6105 updatable: false,
6106 }
6107
6108 apex_key {
6109 name: "myapex.key",
6110 public_key: "testkey.avbpubkey",
6111 private_key: "testkey.pem",
6112 }
6113
6114 android_app_import {
6115 name: "AppFooPrebuilt",
6116 apk: "PrebuiltAppFoo.apk",
6117 presigned: true,
6118 apex_available: ["myapex"],
6119 }
6120 `, fixture)
6121 }
6122}
6123
Dario Frenicde2a032019-10-27 00:29:22 +01006124func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006125 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006126 apex {
6127 name: "myapex",
6128 key: "myapex.key",
6129 apps: [
6130 "AppFooPrebuilt",
6131 "AppFooPrivPrebuilt",
6132 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006133 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006134 }
6135
6136 apex_key {
6137 name: "myapex.key",
6138 public_key: "testkey.avbpubkey",
6139 private_key: "testkey.pem",
6140 }
6141
6142 android_app_import {
6143 name: "AppFooPrebuilt",
6144 apk: "PrebuiltAppFoo.apk",
6145 presigned: true,
6146 dex_preopt: {
6147 enabled: false,
6148 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006149 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006150 }
6151
6152 android_app_import {
6153 name: "AppFooPrivPrebuilt",
6154 apk: "PrebuiltAppFooPriv.apk",
6155 privileged: true,
6156 presigned: true,
6157 dex_preopt: {
6158 enabled: false,
6159 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006160 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006161 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006162 }
6163 `)
6164
Sundong Ahnabb64432019-10-22 13:58:29 +09006165 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006166 apexRule := module.Rule("apexRule")
6167 copyCmds := apexRule.Args["copy_commands"]
6168
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006169 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6170 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006171}
6172
6173func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006174 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006175 apex {
6176 name: "myapex",
6177 key: "myapex.key",
6178 apps: [
6179 "AppFoo",
6180 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006181 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006182 }
6183
6184 apex_key {
6185 name: "myapex.key",
6186 public_key: "testkey.avbpubkey",
6187 private_key: "testkey.pem",
6188 }
6189
6190 android_app {
6191 name: "AppFoo",
6192 srcs: ["foo/bar/MyClass.java"],
6193 sdk_version: "none",
6194 system_modules: "none",
6195 apex_available: [ "myapex" ],
6196 }
6197
6198 android_app_import {
6199 name: "AppFoo",
6200 apk: "AppFooPrebuilt.apk",
6201 filename: "AppFooPrebuilt.apk",
6202 presigned: true,
6203 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006204 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006205 }
6206 `, withFiles(map[string][]byte{
6207 "AppFooPrebuilt.apk": nil,
6208 }))
6209
6210 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006211 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006212 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006213}
6214
Dario Freni6f3937c2019-12-20 22:58:03 +00006215func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006216 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006217 apex {
6218 name: "myapex",
6219 key: "myapex.key",
6220 apps: [
6221 "TesterHelpAppFoo",
6222 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006223 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006224 }
6225
6226 apex_key {
6227 name: "myapex.key",
6228 public_key: "testkey.avbpubkey",
6229 private_key: "testkey.pem",
6230 }
6231
6232 android_test_helper_app {
6233 name: "TesterHelpAppFoo",
6234 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006235 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006236 }
6237
6238 `)
6239
6240 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6241 apexRule := module.Rule("apexRule")
6242 copyCmds := apexRule.Args["copy_commands"]
6243
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006244 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006245}
6246
Jooyung Han18020ea2019-11-13 10:50:48 +09006247func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6248 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006249 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006250 apex {
6251 name: "myapex",
6252 key: "myapex.key",
6253 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006254 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006255 }
6256
6257 apex_key {
6258 name: "myapex.key",
6259 public_key: "testkey.avbpubkey",
6260 private_key: "testkey.pem",
6261 }
6262
6263 apex {
6264 name: "otherapex",
6265 key: "myapex.key",
6266 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006267 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006268 }
6269
6270 cc_defaults {
6271 name: "libfoo-defaults",
6272 apex_available: ["otherapex"],
6273 }
6274
6275 cc_library {
6276 name: "libfoo",
6277 defaults: ["libfoo-defaults"],
6278 stl: "none",
6279 system_shared_libs: [],
6280 }`)
6281}
6282
Paul Duffine52e66f2020-03-30 17:54:29 +01006283func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006284 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006285 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006286 apex {
6287 name: "myapex",
6288 key: "myapex.key",
6289 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006290 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006291 }
6292
6293 apex_key {
6294 name: "myapex.key",
6295 public_key: "testkey.avbpubkey",
6296 private_key: "testkey.pem",
6297 }
6298
6299 apex {
6300 name: "otherapex",
6301 key: "otherapex.key",
6302 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006303 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006304 }
6305
6306 apex_key {
6307 name: "otherapex.key",
6308 public_key: "testkey.avbpubkey",
6309 private_key: "testkey.pem",
6310 }
6311
6312 cc_library {
6313 name: "libfoo",
6314 stl: "none",
6315 system_shared_libs: [],
6316 apex_available: ["otherapex"],
6317 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006318}
Jiyong Park127b40b2019-09-30 16:04:35 +09006319
Paul Duffine52e66f2020-03-30 17:54:29 +01006320func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006321 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006322 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006323.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006324.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006325.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006326.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006327.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006328.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006329 apex {
6330 name: "myapex",
6331 key: "myapex.key",
6332 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006333 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
Jiyong Park127b40b2019-09-30 16:04:35 +09006342 cc_library {
6343 name: "libfoo",
6344 stl: "none",
6345 shared_libs: ["libbar"],
6346 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006347 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006348 }
6349
6350 cc_library {
6351 name: "libbar",
6352 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006353 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006354 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006355 apex_available: ["myapex"],
6356 }
6357
6358 cc_library {
6359 name: "libbaz",
6360 stl: "none",
6361 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006362 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006363}
Jiyong Park127b40b2019-09-30 16:04:35 +09006364
Paul Duffine52e66f2020-03-30 17:54:29 +01006365func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006366 testApexError(t, "\"otherapex\" is not a valid module name", `
6367 apex {
6368 name: "myapex",
6369 key: "myapex.key",
6370 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006371 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006372 }
6373
6374 apex_key {
6375 name: "myapex.key",
6376 public_key: "testkey.avbpubkey",
6377 private_key: "testkey.pem",
6378 }
6379
6380 cc_library {
6381 name: "libfoo",
6382 stl: "none",
6383 system_shared_libs: [],
6384 apex_available: ["otherapex"],
6385 }`)
6386
Paul Duffine52e66f2020-03-30 17:54:29 +01006387 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006388 apex {
6389 name: "myapex",
6390 key: "myapex.key",
6391 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006392 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 }
6394
6395 apex_key {
6396 name: "myapex.key",
6397 public_key: "testkey.avbpubkey",
6398 private_key: "testkey.pem",
6399 }
6400
6401 cc_library {
6402 name: "libfoo",
6403 stl: "none",
6404 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006405 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006406 apex_available: ["myapex"],
6407 }
6408
6409 cc_library {
6410 name: "libbar",
6411 stl: "none",
6412 system_shared_libs: [],
6413 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006414 }
6415
6416 cc_library {
6417 name: "libbaz",
6418 stl: "none",
6419 system_shared_libs: [],
6420 stubs: {
6421 versions: ["10", "20", "30"],
6422 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006423 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006424}
Jiyong Park127b40b2019-09-30 16:04:35 +09006425
Jiyong Park89e850a2020-04-07 16:37:39 +09006426func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006427 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006428 apex {
6429 name: "myapex",
6430 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006431 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006432 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006433 }
6434
6435 apex_key {
6436 name: "myapex.key",
6437 public_key: "testkey.avbpubkey",
6438 private_key: "testkey.pem",
6439 }
6440
6441 cc_library {
6442 name: "libfoo",
6443 stl: "none",
6444 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006445 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006446 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006447 }
6448
6449 cc_library {
6450 name: "libfoo2",
6451 stl: "none",
6452 system_shared_libs: [],
6453 shared_libs: ["libbaz"],
6454 apex_available: ["//apex_available:platform"],
6455 }
6456
6457 cc_library {
6458 name: "libbar",
6459 stl: "none",
6460 system_shared_libs: [],
6461 apex_available: ["myapex"],
6462 }
6463
6464 cc_library {
6465 name: "libbaz",
6466 stl: "none",
6467 system_shared_libs: [],
6468 apex_available: ["myapex"],
6469 stubs: {
6470 versions: ["1"],
6471 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006472 }`)
6473
Jiyong Park89e850a2020-04-07 16:37:39 +09006474 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6475 // because it depends on libbar which isn't available to platform
6476 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6477 if libfoo.NotAvailableForPlatform() != true {
6478 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6479 }
6480
6481 // libfoo2 however can be available to platform because it depends on libbaz which provides
6482 // stubs
6483 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6484 if libfoo2.NotAvailableForPlatform() == true {
6485 t.Errorf("%q should be available to platform", libfoo2.String())
6486 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006487}
Jiyong Parka90ca002019-10-07 15:47:24 +09006488
Paul Duffine52e66f2020-03-30 17:54:29 +01006489func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006490 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006491 apex {
6492 name: "myapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006495 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006496 }
6497
6498 apex_key {
6499 name: "myapex.key",
6500 public_key: "testkey.avbpubkey",
6501 private_key: "testkey.pem",
6502 }
6503
6504 cc_library {
6505 name: "libfoo",
6506 stl: "none",
6507 system_shared_libs: [],
6508 apex_available: ["myapex"],
6509 static: {
6510 apex_available: ["//apex_available:platform"],
6511 },
6512 }`)
6513
Jiyong Park89e850a2020-04-07 16:37:39 +09006514 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6515 if libfooShared.NotAvailableForPlatform() != true {
6516 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6517 }
6518 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6519 if libfooStatic.NotAvailableForPlatform() != false {
6520 t.Errorf("%q should be available to platform", libfooStatic.String())
6521 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006522}
6523
Jiyong Park5d790c32019-11-15 18:40:32 +09006524func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006525 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006526 apex {
6527 name: "myapex",
6528 key: "myapex.key",
6529 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006530 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006531 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006532 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006533 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006534 }
6535
6536 override_apex {
6537 name: "override_myapex",
6538 base: "myapex",
6539 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006540 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006541 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006542 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006543 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006544 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006545 key: "mynewapex.key",
6546 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006547 }
6548
6549 apex_key {
6550 name: "myapex.key",
6551 public_key: "testkey.avbpubkey",
6552 private_key: "testkey.pem",
6553 }
6554
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006555 apex_key {
6556 name: "mynewapex.key",
6557 public_key: "testkey2.avbpubkey",
6558 private_key: "testkey2.pem",
6559 }
6560
6561 android_app_certificate {
6562 name: "myapex.certificate",
6563 certificate: "testkey",
6564 }
6565
Jiyong Park5d790c32019-11-15 18:40:32 +09006566 android_app {
6567 name: "app",
6568 srcs: ["foo/bar/MyClass.java"],
6569 package_name: "foo",
6570 sdk_version: "none",
6571 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006572 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006573 }
6574
6575 override_android_app {
6576 name: "override_app",
6577 base: "app",
6578 package_name: "bar",
6579 }
markchien7c803b82021-08-26 22:10:06 +08006580
6581 bpf {
6582 name: "bpf",
6583 srcs: ["bpf.c"],
6584 }
6585
6586 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006587 name: "overrideBpf",
6588 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006589 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006590
6591 prebuilt_etc {
6592 name: "myetc",
6593 src: "myprebuilt",
6594 }
6595
6596 prebuilt_etc {
6597 name: "override_myetc",
6598 src: "override_myprebuilt",
6599 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006600 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006601
Jiyong Park317645e2019-12-05 13:20:58 +09006602 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6603 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6604 if originalVariant.GetOverriddenBy() != "" {
6605 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6606 }
6607 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6608 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6609 }
6610
Jiyong Park5d790c32019-11-15 18:40:32 +09006611 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6612 apexRule := module.Rule("apexRule")
6613 copyCmds := apexRule.Args["copy_commands"]
6614
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006615 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6616 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006617
markchien7c803b82021-08-26 22:10:06 +08006618 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006619 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006620
Daniel Norman5a3ce132021-08-26 15:44:43 -07006621 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6622 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6623
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006624 apexBundle := module.Module().(*apexBundle)
6625 name := apexBundle.Name()
6626 if name != "override_myapex" {
6627 t.Errorf("name should be \"override_myapex\", but was %q", name)
6628 }
6629
Baligh Uddin004d7172020-02-19 21:29:28 -08006630 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6631 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6632 }
6633
Jiyong Park20bacab2020-03-03 11:45:41 +09006634 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006635 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006636 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6637
6638 signApkRule := module.Rule("signapk")
6639 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006640
Colin Crossaa255532020-07-03 13:18:24 -07006641 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006642 var builder strings.Builder
6643 data.Custom(&builder, name, "TARGET_", "", data)
6644 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006645 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6646 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6647 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006648 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006649 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006650 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006651 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006652 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006653 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6654 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006655}
6656
Albert Martineefabcf2022-03-21 20:11:16 +00006657func TestMinSdkVersionOverride(t *testing.T) {
6658 // Override from 29 to 31
6659 minSdkOverride31 := "31"
6660 ctx := testApex(t, `
6661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 native_shared_libs: ["mylib"],
6665 updatable: true,
6666 min_sdk_version: "29"
6667 }
6668
6669 override_apex {
6670 name: "override_myapex",
6671 base: "myapex",
6672 logging_parent: "com.foo.bar",
6673 package_name: "test.overridden.package"
6674 }
6675
6676 apex_key {
6677 name: "myapex.key",
6678 public_key: "testkey.avbpubkey",
6679 private_key: "testkey.pem",
6680 }
6681
6682 cc_library {
6683 name: "mylib",
6684 srcs: ["mylib.cpp"],
6685 runtime_libs: ["libbar"],
6686 system_shared_libs: [],
6687 stl: "none",
6688 apex_available: [ "myapex" ],
6689 min_sdk_version: "apex_inherit"
6690 }
6691
6692 cc_library {
6693 name: "libbar",
6694 srcs: ["mylib.cpp"],
6695 system_shared_libs: [],
6696 stl: "none",
6697 apex_available: [ "myapex" ],
6698 min_sdk_version: "apex_inherit"
6699 }
6700
6701 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6702
6703 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6704 copyCmds := apexRule.Args["copy_commands"]
6705
6706 // Ensure that direct non-stubs dep is always included
6707 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6708
6709 // Ensure that runtime_libs dep in included
6710 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6711
6712 // Ensure libraries target overridden min_sdk_version value
6713 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6714}
6715
6716func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6717 // Attempt to override from 31 to 29, should be a NOOP
6718 minSdkOverride29 := "29"
6719 ctx := testApex(t, `
6720 apex {
6721 name: "myapex",
6722 key: "myapex.key",
6723 native_shared_libs: ["mylib"],
6724 updatable: true,
6725 min_sdk_version: "31"
6726 }
6727
6728 override_apex {
6729 name: "override_myapex",
6730 base: "myapex",
6731 logging_parent: "com.foo.bar",
6732 package_name: "test.overridden.package"
6733 }
6734
6735 apex_key {
6736 name: "myapex.key",
6737 public_key: "testkey.avbpubkey",
6738 private_key: "testkey.pem",
6739 }
6740
6741 cc_library {
6742 name: "mylib",
6743 srcs: ["mylib.cpp"],
6744 runtime_libs: ["libbar"],
6745 system_shared_libs: [],
6746 stl: "none",
6747 apex_available: [ "myapex" ],
6748 min_sdk_version: "apex_inherit"
6749 }
6750
6751 cc_library {
6752 name: "libbar",
6753 srcs: ["mylib.cpp"],
6754 system_shared_libs: [],
6755 stl: "none",
6756 apex_available: [ "myapex" ],
6757 min_sdk_version: "apex_inherit"
6758 }
6759
6760 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6761
6762 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6763 copyCmds := apexRule.Args["copy_commands"]
6764
6765 // Ensure that direct non-stubs dep is always included
6766 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6767
6768 // Ensure that runtime_libs dep in included
6769 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6770
6771 // Ensure libraries target the original min_sdk_version value rather than the overridden
6772 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6773}
6774
Jooyung Han214bf372019-11-12 13:03:50 +09006775func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006776 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006777 apex {
6778 name: "myapex",
6779 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006780 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006781 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006782 }
6783
6784 apex_key {
6785 name: "myapex.key",
6786 public_key: "testkey.avbpubkey",
6787 private_key: "testkey.pem",
6788 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006789
6790 cc_library {
6791 name: "mylib",
6792 srcs: ["mylib.cpp"],
6793 stl: "libc++",
6794 system_shared_libs: [],
6795 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006796 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006797 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006798 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006799
6800 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6801 args := module.Rule("apexRule").Args
6802 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006803 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006804
6805 // The copies of the libraries in the apex should have one more dependency than
6806 // the ones outside the apex, namely the unwinder. Ideally we should check
6807 // the dependency names directly here but for some reason the names are blank in
6808 // this test.
6809 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006810 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006811 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6812 if len(apexImplicits) != len(nonApexImplicits)+1 {
6813 t.Errorf("%q missing unwinder dep", lib)
6814 }
6815 }
Jooyung Han214bf372019-11-12 13:03:50 +09006816}
6817
Paul Duffine05480a2021-03-08 15:07:14 +00006818var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006819 "api/current.txt": nil,
6820 "api/removed.txt": nil,
6821 "api/system-current.txt": nil,
6822 "api/system-removed.txt": nil,
6823 "api/test-current.txt": nil,
6824 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006825
Anton Hanssondff2c782020-12-21 17:10:01 +00006826 "100/public/api/foo.txt": nil,
6827 "100/public/api/foo-removed.txt": nil,
6828 "100/system/api/foo.txt": nil,
6829 "100/system/api/foo-removed.txt": nil,
6830
Paul Duffineedc5d52020-06-12 17:46:39 +01006831 // For java_sdk_library_import
6832 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006833}
6834
Jooyung Han58f26ab2019-12-18 15:34:32 +09006835func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006836 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006837 apex {
6838 name: "myapex",
6839 key: "myapex.key",
6840 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006841 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006842 }
6843
6844 apex_key {
6845 name: "myapex.key",
6846 public_key: "testkey.avbpubkey",
6847 private_key: "testkey.pem",
6848 }
6849
6850 java_sdk_library {
6851 name: "foo",
6852 srcs: ["a.java"],
6853 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006854 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006855 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006856
6857 prebuilt_apis {
6858 name: "sdk",
6859 api_dirs: ["100"],
6860 }
Paul Duffin9b879592020-05-26 13:21:35 +01006861 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006862
6863 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006864 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006865 "javalib/foo.jar",
6866 "etc/permissions/foo.xml",
6867 })
6868 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006869 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006870 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 +09006871}
6872
Paul Duffin9b879592020-05-26 13:21:35 +01006873func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006874 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006875 apex {
6876 name: "myapex",
6877 key: "myapex.key",
6878 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006879 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006880 }
6881
6882 apex_key {
6883 name: "myapex.key",
6884 public_key: "testkey.avbpubkey",
6885 private_key: "testkey.pem",
6886 }
6887
6888 java_sdk_library {
6889 name: "foo",
6890 srcs: ["a.java"],
6891 api_packages: ["foo"],
6892 apex_available: ["myapex"],
6893 sdk_version: "none",
6894 system_modules: "none",
6895 }
6896
6897 java_library {
6898 name: "bar",
6899 srcs: ["a.java"],
6900 libs: ["foo"],
6901 apex_available: ["myapex"],
6902 sdk_version: "none",
6903 system_modules: "none",
6904 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006905
6906 prebuilt_apis {
6907 name: "sdk",
6908 api_dirs: ["100"],
6909 }
Paul Duffin9b879592020-05-26 13:21:35 +01006910 `, withFiles(filesForSdkLibrary))
6911
6912 // java_sdk_library installs both impl jar and permission XML
6913 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6914 "javalib/bar.jar",
6915 "javalib/foo.jar",
6916 "etc/permissions/foo.xml",
6917 })
6918
6919 // The bar library should depend on the implementation jar.
6920 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006921 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006922 t.Errorf("expected %q, found %#q", expected, actual)
6923 }
6924}
6925
6926func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006927 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006928 apex {
6929 name: "myapex",
6930 key: "myapex.key",
6931 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006932 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006933 }
6934
6935 apex_key {
6936 name: "myapex.key",
6937 public_key: "testkey.avbpubkey",
6938 private_key: "testkey.pem",
6939 }
6940
6941 java_sdk_library {
6942 name: "foo",
6943 srcs: ["a.java"],
6944 api_packages: ["foo"],
6945 apex_available: ["myapex"],
6946 sdk_version: "none",
6947 system_modules: "none",
6948 }
6949
6950 java_library {
6951 name: "bar",
6952 srcs: ["a.java"],
6953 libs: ["foo"],
6954 sdk_version: "none",
6955 system_modules: "none",
6956 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006957
6958 prebuilt_apis {
6959 name: "sdk",
6960 api_dirs: ["100"],
6961 }
Paul Duffin9b879592020-05-26 13:21:35 +01006962 `, withFiles(filesForSdkLibrary))
6963
6964 // java_sdk_library installs both impl jar and permission XML
6965 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6966 "javalib/foo.jar",
6967 "etc/permissions/foo.xml",
6968 })
6969
6970 // The bar library should depend on the stubs jar.
6971 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006972 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006973 t.Errorf("expected %q, found %#q", expected, actual)
6974 }
6975}
6976
Paul Duffineedc5d52020-06-12 17:46:39 +01006977func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006978 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006979 prebuilt_apis {
6980 name: "sdk",
6981 api_dirs: ["100"],
6982 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006983 withFiles(map[string][]byte{
6984 "apex/a.java": nil,
6985 "apex/apex_manifest.json": nil,
6986 "apex/Android.bp": []byte(`
6987 package {
6988 default_visibility: ["//visibility:private"],
6989 }
6990
6991 apex {
6992 name: "myapex",
6993 key: "myapex.key",
6994 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006995 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006996 }
6997
6998 apex_key {
6999 name: "myapex.key",
7000 public_key: "testkey.avbpubkey",
7001 private_key: "testkey.pem",
7002 }
7003
7004 java_library {
7005 name: "bar",
7006 srcs: ["a.java"],
7007 libs: ["foo"],
7008 apex_available: ["myapex"],
7009 sdk_version: "none",
7010 system_modules: "none",
7011 }
7012`),
7013 "source/a.java": nil,
7014 "source/api/current.txt": nil,
7015 "source/api/removed.txt": nil,
7016 "source/Android.bp": []byte(`
7017 package {
7018 default_visibility: ["//visibility:private"],
7019 }
7020
7021 java_sdk_library {
7022 name: "foo",
7023 visibility: ["//apex"],
7024 srcs: ["a.java"],
7025 api_packages: ["foo"],
7026 apex_available: ["myapex"],
7027 sdk_version: "none",
7028 system_modules: "none",
7029 public: {
7030 enabled: true,
7031 },
7032 }
7033`),
7034 "prebuilt/a.jar": nil,
7035 "prebuilt/Android.bp": []byte(`
7036 package {
7037 default_visibility: ["//visibility:private"],
7038 }
7039
7040 java_sdk_library_import {
7041 name: "foo",
7042 visibility: ["//apex", "//source"],
7043 apex_available: ["myapex"],
7044 prefer: true,
7045 public: {
7046 jars: ["a.jar"],
7047 },
7048 }
7049`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007050 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007051 )
7052
7053 // java_sdk_library installs both impl jar and permission XML
7054 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7055 "javalib/bar.jar",
7056 "javalib/foo.jar",
7057 "etc/permissions/foo.xml",
7058 })
7059
7060 // The bar library should depend on the implementation jar.
7061 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007062 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007063 t.Errorf("expected %q, found %#q", expected, actual)
7064 }
7065}
7066
7067func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7068 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7069 apex {
7070 name: "myapex",
7071 key: "myapex.key",
7072 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007073 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007074 }
7075
7076 apex_key {
7077 name: "myapex.key",
7078 public_key: "testkey.avbpubkey",
7079 private_key: "testkey.pem",
7080 }
7081
7082 java_sdk_library_import {
7083 name: "foo",
7084 apex_available: ["myapex"],
7085 prefer: true,
7086 public: {
7087 jars: ["a.jar"],
7088 },
7089 }
7090
7091 `, withFiles(filesForSdkLibrary))
7092}
7093
atrost6e126252020-01-27 17:01:16 +00007094func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007095 result := android.GroupFixturePreparers(
7096 prepareForApexTest,
7097 java.PrepareForTestWithPlatformCompatConfig,
7098 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007099 apex {
7100 name: "myapex",
7101 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007102 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007103 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007104 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007105 }
7106
7107 apex_key {
7108 name: "myapex.key",
7109 public_key: "testkey.avbpubkey",
7110 private_key: "testkey.pem",
7111 }
7112
7113 platform_compat_config {
7114 name: "myjar-platform-compat-config",
7115 src: ":myjar",
7116 }
7117
7118 java_library {
7119 name: "myjar",
7120 srcs: ["foo/bar/MyClass.java"],
7121 sdk_version: "none",
7122 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007123 apex_available: [ "myapex" ],
7124 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007125
7126 // Make sure that a preferred prebuilt does not affect the apex contents.
7127 prebuilt_platform_compat_config {
7128 name: "myjar-platform-compat-config",
7129 metadata: "compat-config/metadata.xml",
7130 prefer: true,
7131 }
atrost6e126252020-01-27 17:01:16 +00007132 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007133 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007134 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7135 "etc/compatconfig/myjar-platform-compat-config.xml",
7136 "javalib/myjar.jar",
7137 })
7138}
7139
Jooyung Han862c0d62022-12-21 10:15:37 +09007140func TestNoDupeApexFiles(t *testing.T) {
7141 android.GroupFixturePreparers(
7142 android.PrepareForTestWithAndroidBuildComponents,
7143 PrepareForTestWithApexBuildComponents,
7144 prepareForTestWithMyapex,
7145 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7146 ).
7147 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7148 RunTestWithBp(t, `
7149 apex {
7150 name: "myapex",
7151 key: "myapex.key",
7152 prebuilts: ["foo", "bar"],
7153 updatable: false,
7154 }
7155
7156 apex_key {
7157 name: "myapex.key",
7158 public_key: "testkey.avbpubkey",
7159 private_key: "testkey.pem",
7160 }
7161
7162 prebuilt_etc {
7163 name: "foo",
7164 src: "myprebuilt",
7165 filename_from_src: true,
7166 }
7167
7168 prebuilt_etc {
7169 name: "bar",
7170 src: "myprebuilt",
7171 filename_from_src: true,
7172 }
7173 `)
7174}
7175
Jiyong Park479321d2019-12-16 11:47:12 +09007176func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7177 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7178 apex {
7179 name: "myapex",
7180 key: "myapex.key",
7181 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007182 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007183 }
7184
7185 apex_key {
7186 name: "myapex.key",
7187 public_key: "testkey.avbpubkey",
7188 private_key: "testkey.pem",
7189 }
7190
7191 java_library {
7192 name: "myjar",
7193 srcs: ["foo/bar/MyClass.java"],
7194 sdk_version: "none",
7195 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007196 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007197 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007198 }
7199 `)
7200}
7201
Jiyong Park7afd1072019-12-30 16:56:33 +09007202func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007203 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007204 apex {
7205 name: "myapex",
7206 key: "myapex.key",
7207 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007208 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007209 }
7210
7211 apex_key {
7212 name: "myapex.key",
7213 public_key: "testkey.avbpubkey",
7214 private_key: "testkey.pem",
7215 }
7216
7217 cc_library {
7218 name: "mylib",
7219 srcs: ["mylib.cpp"],
7220 system_shared_libs: [],
7221 stl: "none",
7222 required: ["a", "b"],
7223 host_required: ["c", "d"],
7224 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007225 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007226 }
7227 `)
7228
7229 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007230 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007231 name := apexBundle.BaseModuleName()
7232 prefix := "TARGET_"
7233 var builder strings.Builder
7234 data.Custom(&builder, name, prefix, "", data)
7235 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007236 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 -08007237 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7238 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007239}
7240
Jiyong Park7cd10e32020-01-14 09:22:18 +09007241func TestSymlinksFromApexToSystem(t *testing.T) {
7242 bp := `
7243 apex {
7244 name: "myapex",
7245 key: "myapex.key",
7246 native_shared_libs: ["mylib"],
7247 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007248 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007249 }
7250
Jiyong Park9d677202020-02-19 16:29:35 +09007251 apex {
7252 name: "myapex.updatable",
7253 key: "myapex.key",
7254 native_shared_libs: ["mylib"],
7255 java_libs: ["myjar"],
7256 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007257 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007258 }
7259
Jiyong Park7cd10e32020-01-14 09:22:18 +09007260 apex_key {
7261 name: "myapex.key",
7262 public_key: "testkey.avbpubkey",
7263 private_key: "testkey.pem",
7264 }
7265
7266 cc_library {
7267 name: "mylib",
7268 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007269 shared_libs: [
7270 "myotherlib",
7271 "myotherlib_ext",
7272 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007273 system_shared_libs: [],
7274 stl: "none",
7275 apex_available: [
7276 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007277 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007278 "//apex_available:platform",
7279 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007280 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007281 }
7282
7283 cc_library {
7284 name: "myotherlib",
7285 srcs: ["mylib.cpp"],
7286 system_shared_libs: [],
7287 stl: "none",
7288 apex_available: [
7289 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007290 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007291 "//apex_available:platform",
7292 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007293 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007294 }
7295
Jiyong Parkce243632023-02-17 18:22:25 +09007296 cc_library {
7297 name: "myotherlib_ext",
7298 srcs: ["mylib.cpp"],
7299 system_shared_libs: [],
7300 system_ext_specific: true,
7301 stl: "none",
7302 apex_available: [
7303 "myapex",
7304 "myapex.updatable",
7305 "//apex_available:platform",
7306 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007307 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007308 }
7309
Jiyong Park7cd10e32020-01-14 09:22:18 +09007310 java_library {
7311 name: "myjar",
7312 srcs: ["foo/bar/MyClass.java"],
7313 sdk_version: "none",
7314 system_modules: "none",
7315 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007316 apex_available: [
7317 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007318 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007319 "//apex_available:platform",
7320 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007321 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007322 }
7323
7324 java_library {
7325 name: "myotherjar",
7326 srcs: ["foo/bar/MyClass.java"],
7327 sdk_version: "none",
7328 system_modules: "none",
7329 apex_available: [
7330 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007331 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007332 "//apex_available:platform",
7333 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007334 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007335 }
7336 `
7337
7338 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7339 for _, f := range files {
7340 if f.path == file {
7341 if f.isLink {
7342 t.Errorf("%q is not a real file", file)
7343 }
7344 return
7345 }
7346 }
7347 t.Errorf("%q is not found", file)
7348 }
7349
Jiyong Parkce243632023-02-17 18:22:25 +09007350 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007351 for _, f := range files {
7352 if f.path == file {
7353 if !f.isLink {
7354 t.Errorf("%q is not a symlink", file)
7355 }
Jiyong Parkce243632023-02-17 18:22:25 +09007356 if f.src != target {
7357 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7358 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007359 return
7360 }
7361 }
7362 t.Errorf("%q is not found", file)
7363 }
7364
Jiyong Park9d677202020-02-19 16:29:35 +09007365 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7366 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007367 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007368 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007369 ensureRealfileExists(t, files, "javalib/myjar.jar")
7370 ensureRealfileExists(t, files, "lib64/mylib.so")
7371 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007372 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007373
Jiyong Park9d677202020-02-19 16:29:35 +09007374 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7375 ensureRealfileExists(t, files, "javalib/myjar.jar")
7376 ensureRealfileExists(t, files, "lib64/mylib.so")
7377 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007378 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007379
7380 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007381 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007382 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007383 ensureRealfileExists(t, files, "javalib/myjar.jar")
7384 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007385 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7386 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007387
7388 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7389 ensureRealfileExists(t, files, "javalib/myjar.jar")
7390 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007391 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7392 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007393}
7394
Yo Chiange8128052020-07-23 20:09:18 +08007395func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007396 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007397 apex {
7398 name: "myapex",
7399 key: "myapex.key",
7400 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007401 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007402 }
7403
7404 apex_key {
7405 name: "myapex.key",
7406 public_key: "testkey.avbpubkey",
7407 private_key: "testkey.pem",
7408 }
7409
7410 cc_library_shared {
7411 name: "mylib",
7412 srcs: ["mylib.cpp"],
7413 shared_libs: ["myotherlib"],
7414 system_shared_libs: [],
7415 stl: "none",
7416 apex_available: [
7417 "myapex",
7418 "//apex_available:platform",
7419 ],
7420 }
7421
7422 cc_prebuilt_library_shared {
7423 name: "myotherlib",
7424 srcs: ["prebuilt.so"],
7425 system_shared_libs: [],
7426 stl: "none",
7427 apex_available: [
7428 "myapex",
7429 "//apex_available:platform",
7430 ],
7431 }
7432 `)
7433
Prerana Patilb1896c82022-11-09 18:14:34 +00007434 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007435 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007436 var builder strings.Builder
7437 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7438 androidMk := builder.String()
7439 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007440 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007441 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7442 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7443 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007444 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 +08007445}
7446
Jooyung Han643adc42020-02-27 13:50:06 +09007447func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007448 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007449 apex {
7450 name: "myapex",
7451 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007452 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007453 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007454 }
7455
7456 apex_key {
7457 name: "myapex.key",
7458 public_key: "testkey.avbpubkey",
7459 private_key: "testkey.pem",
7460 }
7461
7462 cc_library {
7463 name: "mylib",
7464 srcs: ["mylib.cpp"],
7465 shared_libs: ["mylib2"],
7466 system_shared_libs: [],
7467 stl: "none",
7468 apex_available: [ "myapex" ],
7469 }
7470
7471 cc_library {
7472 name: "mylib2",
7473 srcs: ["mylib.cpp"],
7474 system_shared_libs: [],
7475 stl: "none",
7476 apex_available: [ "myapex" ],
7477 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007478
7479 rust_ffi_shared {
7480 name: "libfoo.rust",
7481 crate_name: "foo",
7482 srcs: ["foo.rs"],
7483 shared_libs: ["libfoo.shared_from_rust"],
7484 prefer_rlib: true,
7485 apex_available: ["myapex"],
7486 }
7487
7488 cc_library_shared {
7489 name: "libfoo.shared_from_rust",
7490 srcs: ["mylib.cpp"],
7491 system_shared_libs: [],
7492 stl: "none",
7493 stubs: {
7494 versions: ["10", "11", "12"],
7495 },
7496 }
7497
Jooyung Han643adc42020-02-27 13:50:06 +09007498 `)
7499
7500 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7501 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007502 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007503 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7504 "lib64/mylib.so",
7505 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007506 "lib64/libfoo.rust.so",
7507 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7508 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007509 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007510
7511 // b/220397949
7512 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007513}
7514
Jooyung Han49f67012020-04-17 13:43:10 +09007515func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007516 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007517 apex {
7518 name: "myapex",
7519 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007520 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007521 }
7522 apex_key {
7523 name: "myapex.key",
7524 public_key: "testkey.avbpubkey",
7525 private_key: "testkey.pem",
7526 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007527 `,
7528 android.FixtureModifyConfig(func(config android.Config) {
7529 delete(config.Targets, android.Android)
7530 config.AndroidCommonTarget = android.Target{}
7531 }),
7532 )
Jooyung Han49f67012020-04-17 13:43:10 +09007533
7534 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7535 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7536 }
7537}
7538
Jiyong Parkbd159612020-02-28 15:22:21 +09007539func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007540 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007541 apex {
7542 name: "myapex",
7543 key: "myapex.key",
7544 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007545 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007546 }
7547
7548 apex_key {
7549 name: "myapex.key",
7550 public_key: "testkey.avbpubkey",
7551 private_key: "testkey.pem",
7552 }
7553
7554 android_app {
7555 name: "AppFoo",
7556 srcs: ["foo/bar/MyClass.java"],
7557 sdk_version: "none",
7558 system_modules: "none",
7559 apex_available: [ "myapex" ],
7560 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007561 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007562
Colin Crosscf371cc2020-11-13 11:48:42 -08007563 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007564 content := bundleConfigRule.Args["content"]
7565
7566 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007567 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 +09007568}
7569
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007570func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007571 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007572 apex {
7573 name: "myapex",
7574 key: "myapex.key",
7575 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007576 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007577 }
7578
7579 apex_key {
7580 name: "myapex.key",
7581 public_key: "testkey.avbpubkey",
7582 private_key: "testkey.pem",
7583 }
7584
7585 android_app_set {
7586 name: "AppSet",
7587 set: "AppSet.apks",
7588 }`)
7589 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007590 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007591 content := bundleConfigRule.Args["content"]
7592 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7593 s := mod.Rule("apexRule").Args["copy_commands"]
7594 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007595 if len(copyCmds) != 4 {
7596 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007597 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007598 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7599 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007600 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7601 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007602
7603 // Ensure that canned_fs_config has an entry for the app set zip file
7604 generateFsRule := mod.Rule("generateFsConfig")
7605 cmd := generateFsRule.RuleParams.Command
7606 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007607}
7608
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007609func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007610 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007611 apex_set {
7612 name: "myapex",
7613 filename: "foo_v2.apex",
7614 sanitized: {
7615 none: { set: "myapex.apks", },
7616 hwaddress: { set: "myapex.hwasan.apks", },
7617 },
Paul Duffin24704672021-04-06 16:09:30 +01007618 }
7619 `
7620 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007621
Paul Duffin24704672021-04-06 16:09:30 +01007622 // Check that the extractor produces the correct output file from the correct input file.
7623 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007624
Paul Duffin24704672021-04-06 16:09:30 +01007625 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7626 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007627
Paul Duffin24704672021-04-06 16:09:30 +01007628 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7629
7630 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007631 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7632 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007633
7634 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007635}
7636
Pranav Guptaeba03b02022-09-27 00:27:08 +00007637func TestApexSetApksModuleAssignment(t *testing.T) {
7638 ctx := testApex(t, `
7639 apex_set {
7640 name: "myapex",
7641 set: ":myapex_apks_file",
7642 }
7643
7644 filegroup {
7645 name: "myapex_apks_file",
7646 srcs: ["myapex.apks"],
7647 }
7648 `)
7649
7650 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7651
7652 // Check that the extractor produces the correct apks file from the input module
7653 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7654 extractedApex := m.Output(extractorOutput)
7655
7656 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7657}
7658
Paul Duffin89f570a2021-06-16 01:42:33 +01007659func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007660 t.Helper()
7661
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007662 bp := `
7663 java_library {
7664 name: "some-updatable-apex-lib",
7665 srcs: ["a.java"],
7666 sdk_version: "current",
7667 apex_available: [
7668 "some-updatable-apex",
7669 ],
satayevabcd5972021-08-06 17:49:46 +01007670 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007671 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007672 }
7673
7674 java_library {
7675 name: "some-non-updatable-apex-lib",
7676 srcs: ["a.java"],
7677 apex_available: [
7678 "some-non-updatable-apex",
7679 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007680 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007681 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007682 }
7683
7684 bootclasspath_fragment {
7685 name: "some-non-updatable-fragment",
7686 contents: ["some-non-updatable-apex-lib"],
7687 apex_available: [
7688 "some-non-updatable-apex",
7689 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007690 hidden_api: {
7691 split_packages: ["*"],
7692 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007693 }
7694
7695 java_library {
7696 name: "some-platform-lib",
7697 srcs: ["a.java"],
7698 sdk_version: "current",
7699 installable: true,
7700 }
7701
7702 java_library {
7703 name: "some-art-lib",
7704 srcs: ["a.java"],
7705 sdk_version: "current",
7706 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007707 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007708 ],
7709 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007710 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007711 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007712 }
7713
7714 apex {
7715 name: "some-updatable-apex",
7716 key: "some-updatable-apex.key",
7717 java_libs: ["some-updatable-apex-lib"],
7718 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007719 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007720 }
7721
7722 apex {
7723 name: "some-non-updatable-apex",
7724 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007725 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007726 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007727 }
7728
7729 apex_key {
7730 name: "some-updatable-apex.key",
7731 }
7732
7733 apex_key {
7734 name: "some-non-updatable-apex.key",
7735 }
7736
7737 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007738 name: "com.android.art.debug",
7739 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007740 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007741 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007742 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007743 }
7744
Paul Duffinf23bc472021-04-27 12:42:20 +01007745 bootclasspath_fragment {
7746 name: "art-bootclasspath-fragment",
7747 image_name: "art",
7748 contents: ["some-art-lib"],
7749 apex_available: [
7750 "com.android.art.debug",
7751 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007752 hidden_api: {
7753 split_packages: ["*"],
7754 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007755 }
7756
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007757 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007758 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007759 }
7760
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007761 filegroup {
7762 name: "some-updatable-apex-file_contexts",
7763 srcs: [
7764 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7765 ],
7766 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007767
7768 filegroup {
7769 name: "some-non-updatable-apex-file_contexts",
7770 srcs: [
7771 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7772 ],
7773 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007774 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007775
Paul Duffin89f570a2021-06-16 01:42:33 +01007776 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007777}
7778
Paul Duffin89f570a2021-06-16 01:42:33 +01007779func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007780 t.Helper()
7781
Paul Duffin55607122021-03-30 23:32:51 +01007782 fs := android.MockFS{
7783 "a.java": nil,
7784 "a.jar": nil,
7785 "apex_manifest.json": nil,
7786 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007787 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007788 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7789 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7790 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007791 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007792 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007793
Paul Duffin55607122021-03-30 23:32:51 +01007794 errorHandler := android.FixtureExpectsNoErrors
7795 if errmsg != "" {
7796 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007797 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007798
Paul Duffin55607122021-03-30 23:32:51 +01007799 result := android.GroupFixturePreparers(
7800 cc.PrepareForTestWithCcDefaultModules,
7801 java.PrepareForTestWithHiddenApiBuildComponents,
7802 java.PrepareForTestWithJavaDefaultModules,
7803 java.PrepareForTestWithJavaSdkLibraryFiles,
7804 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007805 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007806 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007807 android.FixtureModifyMockFS(func(fs android.MockFS) {
7808 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7809 insert := ""
7810 for _, fragment := range fragments {
7811 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7812 }
7813 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7814 platform_bootclasspath {
7815 name: "platform-bootclasspath",
7816 fragments: [
7817 %s
7818 ],
7819 }
7820 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007821 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007822 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007823 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007824 ).
7825 ExtendWithErrorHandler(errorHandler).
7826 RunTestWithBp(t, bp)
7827
7828 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007829}
7830
Paul Duffin5556c5f2022-06-09 17:32:21 +00007831func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007832 preparers := android.GroupFixturePreparers(
7833 java.PrepareForTestWithJavaDefaultModules,
7834 PrepareForTestWithApexBuildComponents,
7835 ).
7836 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7837 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7838
7839 bpBase := `
7840 apex_set {
7841 name: "com.android.myapex",
7842 installable: true,
7843 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7844 set: "myapex.apks",
7845 }
7846
7847 apex_set {
7848 name: "com.mycompany.android.myapex",
7849 apex_name: "com.android.myapex",
7850 installable: true,
7851 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7852 set: "company-myapex.apks",
7853 }
7854
7855 prebuilt_bootclasspath_fragment {
7856 name: "my-bootclasspath-fragment",
7857 apex_available: ["com.android.myapex"],
7858 %s
7859 }
7860 `
7861
7862 t.Run("java_import", func(t *testing.T) {
7863 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7864 java_import {
7865 name: "libfoo",
7866 jars: ["libfoo.jar"],
7867 apex_available: ["com.android.myapex"],
7868 }
7869 `)
7870 })
7871
7872 t.Run("java_sdk_library_import", func(t *testing.T) {
7873 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7874 java_sdk_library_import {
7875 name: "libfoo",
7876 public: {
7877 jars: ["libbar.jar"],
7878 },
7879 apex_available: ["com.android.myapex"],
7880 }
7881 `)
7882 })
7883
7884 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7885 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7886 image_name: "art",
7887 contents: ["libfoo"],
7888 `)+`
7889 java_sdk_library_import {
7890 name: "libfoo",
7891 public: {
7892 jars: ["libbar.jar"],
7893 },
7894 apex_available: ["com.android.myapex"],
7895 }
7896 `)
7897 })
7898}
7899
Paul Duffin5556c5f2022-06-09 17:32:21 +00007900func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7901 preparers := android.GroupFixturePreparers(
7902 java.PrepareForTestWithJavaDefaultModules,
7903 PrepareForTestWithApexBuildComponents,
7904 )
7905
7906 bpBase := `
7907 apex_set {
7908 name: "com.android.myapex",
7909 installable: true,
7910 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7911 set: "myapex.apks",
7912 }
7913
7914 apex_set {
7915 name: "com.android.myapex_compressed",
7916 apex_name: "com.android.myapex",
7917 installable: true,
7918 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7919 set: "myapex_compressed.apks",
7920 }
7921
7922 prebuilt_bootclasspath_fragment {
7923 name: "my-bootclasspath-fragment",
7924 apex_available: [
7925 "com.android.myapex",
7926 "com.android.myapex_compressed",
7927 ],
7928 hidden_api: {
7929 annotation_flags: "annotation-flags.csv",
7930 metadata: "metadata.csv",
7931 index: "index.csv",
7932 signature_patterns: "signature_patterns.csv",
7933 },
7934 %s
7935 }
7936 `
7937
7938 t.Run("java_import", func(t *testing.T) {
7939 result := preparers.RunTestWithBp(t,
7940 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7941 java_import {
7942 name: "libfoo",
7943 jars: ["libfoo.jar"],
7944 apex_available: [
7945 "com.android.myapex",
7946 "com.android.myapex_compressed",
7947 ],
7948 }
7949 `)
7950
7951 module := result.Module("libfoo", "android_common_com.android.myapex")
7952 usesLibraryDep := module.(java.UsesLibraryDependency)
7953 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7954 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7955 usesLibraryDep.DexJarBuildPath().Path())
7956 })
7957
7958 t.Run("java_sdk_library_import", func(t *testing.T) {
7959 result := preparers.RunTestWithBp(t,
7960 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7961 java_sdk_library_import {
7962 name: "libfoo",
7963 public: {
7964 jars: ["libbar.jar"],
7965 },
7966 apex_available: [
7967 "com.android.myapex",
7968 "com.android.myapex_compressed",
7969 ],
7970 compile_dex: true,
7971 }
7972 `)
7973
7974 module := result.Module("libfoo", "android_common_com.android.myapex")
7975 usesLibraryDep := module.(java.UsesLibraryDependency)
7976 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7977 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7978 usesLibraryDep.DexJarBuildPath().Path())
7979 })
7980
7981 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7982 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7983 image_name: "art",
7984 contents: ["libfoo"],
7985 `)+`
7986 java_sdk_library_import {
7987 name: "libfoo",
7988 public: {
7989 jars: ["libbar.jar"],
7990 },
7991 apex_available: [
7992 "com.android.myapex",
7993 "com.android.myapex_compressed",
7994 ],
7995 compile_dex: true,
7996 }
7997 `)
7998 })
7999}
8000
Jooyung Han548640b2020-04-27 12:10:30 +09008001func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8002 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8003 apex {
8004 name: "myapex",
8005 key: "myapex.key",
8006 updatable: true,
8007 }
8008
8009 apex_key {
8010 name: "myapex.key",
8011 public_key: "testkey.avbpubkey",
8012 private_key: "testkey.pem",
8013 }
8014 `)
8015}
8016
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008017func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8018 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8019 apex {
8020 name: "myapex",
8021 key: "myapex.key",
8022 }
8023
8024 apex_key {
8025 name: "myapex.key",
8026 public_key: "testkey.avbpubkey",
8027 private_key: "testkey.pem",
8028 }
8029 `)
8030}
8031
Jooyung Handfc864c2023-03-20 18:19:07 +09008032func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8033 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008034 apex {
8035 name: "myapex",
8036 key: "myapex.key",
8037 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008038 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008039 soc_specific: true,
8040 }
8041
8042 apex_key {
8043 name: "myapex.key",
8044 public_key: "testkey.avbpubkey",
8045 private_key: "testkey.pem",
8046 }
8047 `)
8048}
8049
Jooyung Han02873da2023-03-22 17:41:03 +09008050func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8051 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8052 apex {
8053 name: "myapex",
8054 key: "myapex.key",
8055 updatable: false,
8056 min_sdk_version: "29",
8057 use_vndk_as_stable: true,
8058 vendor: true,
8059 }
8060
8061 apex_key {
8062 name: "myapex.key",
8063 public_key: "testkey.avbpubkey",
8064 private_key: "testkey.pem",
8065 }
8066 `)
8067}
8068
Jooyung Handfc864c2023-03-20 18:19:07 +09008069func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8070 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8071 apex {
8072 name: "myapex",
8073 key: "myapex.key",
8074 updatable: false,
8075 use_vndk_as_stable: true,
8076 }
8077
8078 apex_key {
8079 name: "myapex.key",
8080 public_key: "testkey.avbpubkey",
8081 private_key: "testkey.pem",
8082 }
8083 `)
8084}
8085
satayevb98371c2021-06-15 16:49:50 +01008086func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8087 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8088 apex {
8089 name: "myapex",
8090 key: "myapex.key",
8091 systemserverclasspath_fragments: [
8092 "mysystemserverclasspathfragment",
8093 ],
8094 min_sdk_version: "29",
8095 updatable: true,
8096 }
8097
8098 apex_key {
8099 name: "myapex.key",
8100 public_key: "testkey.avbpubkey",
8101 private_key: "testkey.pem",
8102 }
8103
8104 java_library {
8105 name: "foo",
8106 srcs: ["b.java"],
8107 min_sdk_version: "29",
8108 installable: true,
8109 apex_available: [
8110 "myapex",
8111 ],
8112 }
8113
8114 systemserverclasspath_fragment {
8115 name: "mysystemserverclasspathfragment",
8116 generate_classpaths_proto: false,
8117 contents: [
8118 "foo",
8119 ],
8120 apex_available: [
8121 "myapex",
8122 ],
8123 }
satayevabcd5972021-08-06 17:49:46 +01008124 `,
8125 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8126 )
satayevb98371c2021-06-15 16:49:50 +01008127}
8128
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008129func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008130 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8131 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8132 // modules to be included in the BootJars.
8133 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8134 return android.GroupFixturePreparers(
8135 dexpreopt.FixtureSetBootJars(bootJars...),
8136 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8137 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8138 }),
8139 )
8140 }
8141
8142 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8143 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8144 // specified in the ArtApexJars configuration.
8145 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8146 return android.GroupFixturePreparers(
8147 dexpreopt.FixtureSetArtBootJars(bootJars...),
8148 dexpreopt.FixtureSetBootJars(bootJars...),
8149 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8150 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8151 }),
8152 )
8153 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008154
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008155 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008156 preparer := android.GroupFixturePreparers(
8157 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8158 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8159 )
8160 fragments := []java.ApexVariantReference{
8161 {
8162 Apex: proptools.StringPtr("com.android.art.debug"),
8163 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8164 },
8165 {
8166 Apex: proptools.StringPtr("some-non-updatable-apex"),
8167 Module: proptools.StringPtr("some-non-updatable-fragment"),
8168 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008169 }
satayevabcd5972021-08-06 17:49:46 +01008170 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008171 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008172
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008173 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008174 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8175 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008176 preparer := android.GroupFixturePreparers(
8177 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8178 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8179 )
Paul Duffin60264a02021-04-12 20:02:36 +01008180 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008181 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008182
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008183 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 +01008184 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 +01008185 // Update the dexpreopt ArtApexJars directly.
8186 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8187 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008188 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008189
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008190 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 +01008191 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 +01008192 // Update the dexpreopt ArtApexJars directly.
8193 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8194 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008195 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008196
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008197 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008198 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01008199 preparer := android.GroupFixturePreparers(
8200 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8201 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8202 )
Paul Duffin60264a02021-04-12 20:02:36 +01008203 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008204 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008205
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008206 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008207 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008208 fragment := java.ApexVariantReference{
8209 Apex: proptools.StringPtr("some-non-updatable-apex"),
8210 Module: proptools.StringPtr("some-non-updatable-fragment"),
8211 }
8212 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008213 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008214
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008215 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008216 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008217 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8218 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008219 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008220
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008221 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008222 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008223 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8224 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008225 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008226
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008227 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008228 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008229 // Update the dexpreopt ArtApexJars directly.
8230 preparer := prepareSetArtJars("platform:some-platform-lib")
8231 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008232 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008233
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008234 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008235 preparer := android.GroupFixturePreparers(
8236 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8237 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8238 )
8239 fragments := []java.ApexVariantReference{
8240 {
8241 Apex: proptools.StringPtr("some-non-updatable-apex"),
8242 Module: proptools.StringPtr("some-non-updatable-fragment"),
8243 },
8244 }
8245 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008246 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008247}
8248
8249func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008250 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008251 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008252 fragment := java.ApexVariantReference{
8253 Apex: proptools.StringPtr("myapex"),
8254 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8255 }
8256
Paul Duffin064b70c2020-11-02 17:32:38 +00008257 testDexpreoptWithApexes(t, `
8258 prebuilt_apex {
8259 name: "myapex" ,
8260 arch: {
8261 arm64: {
8262 src: "myapex-arm64.apex",
8263 },
8264 arm: {
8265 src: "myapex-arm.apex",
8266 },
8267 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008268 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8269 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008270
Paul Duffin89f570a2021-06-16 01:42:33 +01008271 prebuilt_bootclasspath_fragment {
8272 name: "my-bootclasspath-fragment",
8273 contents: ["libfoo"],
8274 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008275 hidden_api: {
8276 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8277 metadata: "my-bootclasspath-fragment/metadata.csv",
8278 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008279 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8280 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8281 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008282 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008283 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008284
Paul Duffin89f570a2021-06-16 01:42:33 +01008285 java_import {
8286 name: "libfoo",
8287 jars: ["libfoo.jar"],
8288 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008289 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008290 }
8291 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008292 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008293}
8294
Spandan Dasf14e2542021-11-12 00:01:37 +00008295func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008296 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008297 bp += `
8298 apex_key {
8299 name: "myapex.key",
8300 public_key: "testkey.avbpubkey",
8301 private_key: "testkey.pem",
8302 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008303 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008304 "lib1/src/A.java": nil,
8305 "lib2/src/B.java": nil,
8306 "system/sepolicy/apex/myapex-file_contexts": nil,
8307 }
8308
Paul Duffin45338f02021-03-30 23:07:52 +01008309 errorHandler := android.FixtureExpectsNoErrors
8310 if errmsg != "" {
8311 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008312 }
Colin Crossae8600b2020-10-29 17:09:13 -07008313
Paul Duffin45338f02021-03-30 23:07:52 +01008314 android.GroupFixturePreparers(
8315 android.PrepareForTestWithAndroidBuildComponents,
8316 java.PrepareForTestWithJavaBuildComponents,
8317 PrepareForTestWithApexBuildComponents,
8318 android.PrepareForTestWithNeverallowRules(rules),
8319 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008320 apexBootJars := make([]string, 0, len(bootJars))
8321 for _, apexBootJar := range bootJars {
8322 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008323 }
satayevd604b212021-07-21 14:23:52 +01008324 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008325 }),
8326 fs.AddToFixture(),
8327 ).
8328 ExtendWithErrorHandler(errorHandler).
8329 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008330}
8331
8332func TestApexPermittedPackagesRules(t *testing.T) {
8333 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008334 name string
8335 expectedError string
8336 bp string
8337 bootJars []string
8338 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008339 }{
8340
8341 {
8342 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8343 expectedError: "",
8344 bp: `
8345 java_library {
8346 name: "bcp_lib1",
8347 srcs: ["lib1/src/*.java"],
8348 permitted_packages: ["foo.bar"],
8349 apex_available: ["myapex"],
8350 sdk_version: "none",
8351 system_modules: "none",
8352 }
8353 java_library {
8354 name: "nonbcp_lib2",
8355 srcs: ["lib2/src/*.java"],
8356 apex_available: ["myapex"],
8357 permitted_packages: ["a.b"],
8358 sdk_version: "none",
8359 system_modules: "none",
8360 }
8361 apex {
8362 name: "myapex",
8363 key: "myapex.key",
8364 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008365 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008366 }`,
8367 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008368 bcpPermittedPackages: map[string][]string{
8369 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008370 "foo.bar",
8371 },
8372 },
8373 },
8374 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008375 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008376 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 +01008377 bp: `
8378 java_library {
8379 name: "bcp_lib1",
8380 srcs: ["lib1/src/*.java"],
8381 apex_available: ["myapex"],
8382 permitted_packages: ["foo.bar"],
8383 sdk_version: "none",
8384 system_modules: "none",
8385 }
8386 java_library {
8387 name: "bcp_lib2",
8388 srcs: ["lib2/src/*.java"],
8389 apex_available: ["myapex"],
8390 permitted_packages: ["foo.bar", "bar.baz"],
8391 sdk_version: "none",
8392 system_modules: "none",
8393 }
8394 apex {
8395 name: "myapex",
8396 key: "myapex.key",
8397 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008398 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008399 }
8400 `,
8401 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008402 bcpPermittedPackages: map[string][]string{
8403 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008404 "foo.bar",
8405 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008406 "bcp_lib2": []string{
8407 "foo.bar",
8408 },
8409 },
8410 },
8411 {
8412 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8413 expectedError: "",
8414 bp: `
8415 java_library {
8416 name: "bcp_lib_restricted",
8417 srcs: ["lib1/src/*.java"],
8418 apex_available: ["myapex"],
8419 permitted_packages: ["foo.bar"],
8420 sdk_version: "none",
8421 min_sdk_version: "29",
8422 system_modules: "none",
8423 }
8424 java_library {
8425 name: "bcp_lib_unrestricted",
8426 srcs: ["lib2/src/*.java"],
8427 apex_available: ["myapex"],
8428 permitted_packages: ["foo.bar", "bar.baz"],
8429 sdk_version: "none",
8430 min_sdk_version: "29",
8431 system_modules: "none",
8432 }
8433 apex {
8434 name: "myapex",
8435 key: "myapex.key",
8436 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8437 updatable: true,
8438 min_sdk_version: "29",
8439 }
8440 `,
8441 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8442 bcpPermittedPackages: map[string][]string{
8443 "bcp_lib1_non_updateable": []string{
8444 "foo.bar",
8445 },
8446 // 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 +01008447 },
8448 },
8449 }
8450 for _, tc := range testcases {
8451 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008452 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8453 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008454 })
8455 }
8456}
8457
Jiyong Park62304bb2020-04-13 16:19:48 +09008458func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008459 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008460 apex {
8461 name: "myapex",
8462 key: "myapex.key",
8463 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008464 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008465 }
8466
8467 apex_key {
8468 name: "myapex.key",
8469 public_key: "testkey.avbpubkey",
8470 private_key: "testkey.pem",
8471 }
8472
8473 cc_library {
8474 name: "mylib",
8475 srcs: ["mylib.cpp"],
8476 system_shared_libs: [],
8477 stl: "none",
8478 stubs: {
8479 versions: ["1"],
8480 },
8481 apex_available: ["myapex"],
8482 }
8483
8484 cc_library {
8485 name: "myprivlib",
8486 srcs: ["mylib.cpp"],
8487 system_shared_libs: [],
8488 stl: "none",
8489 apex_available: ["myapex"],
8490 }
8491
8492
8493 cc_test {
8494 name: "mytest",
8495 gtest: false,
8496 srcs: ["mylib.cpp"],
8497 system_shared_libs: [],
8498 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008499 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008500 test_for: ["myapex"]
8501 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008502
8503 cc_library {
8504 name: "mytestlib",
8505 srcs: ["mylib.cpp"],
8506 system_shared_libs: [],
8507 shared_libs: ["mylib", "myprivlib"],
8508 stl: "none",
8509 test_for: ["myapex"],
8510 }
8511
8512 cc_benchmark {
8513 name: "mybench",
8514 srcs: ["mylib.cpp"],
8515 system_shared_libs: [],
8516 shared_libs: ["mylib", "myprivlib"],
8517 stl: "none",
8518 test_for: ["myapex"],
8519 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008520 `)
8521
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008522 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008523 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008524 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8525 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8526 }
8527
8528 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008529 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008530 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8531 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8532 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8533}
Jiyong Park46a512f2020-12-04 18:02:13 +09008534
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008535func TestIndirectTestFor(t *testing.T) {
8536 ctx := testApex(t, `
8537 apex {
8538 name: "myapex",
8539 key: "myapex.key",
8540 native_shared_libs: ["mylib", "myprivlib"],
8541 updatable: false,
8542 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008543
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008544 apex_key {
8545 name: "myapex.key",
8546 public_key: "testkey.avbpubkey",
8547 private_key: "testkey.pem",
8548 }
8549
8550 cc_library {
8551 name: "mylib",
8552 srcs: ["mylib.cpp"],
8553 system_shared_libs: [],
8554 stl: "none",
8555 stubs: {
8556 versions: ["1"],
8557 },
8558 apex_available: ["myapex"],
8559 }
8560
8561 cc_library {
8562 name: "myprivlib",
8563 srcs: ["mylib.cpp"],
8564 system_shared_libs: [],
8565 stl: "none",
8566 shared_libs: ["mylib"],
8567 apex_available: ["myapex"],
8568 }
8569
8570 cc_library {
8571 name: "mytestlib",
8572 srcs: ["mylib.cpp"],
8573 system_shared_libs: [],
8574 shared_libs: ["myprivlib"],
8575 stl: "none",
8576 test_for: ["myapex"],
8577 }
8578 `)
8579
8580 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008581 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008582 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8583 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8584 }
8585
8586 // The platform variant of mytestlib links to the platform variant of the
8587 // internal myprivlib.
8588 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8589
8590 // The platform variant of myprivlib links to the platform variant of mylib
8591 // and bypasses its stubs.
8592 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 +09008593}
8594
Martin Stjernholmec009002021-03-27 15:18:31 +00008595func TestTestForForLibInOtherApex(t *testing.T) {
8596 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8597 _ = testApex(t, `
8598 apex {
8599 name: "com.android.art",
8600 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008601 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008602 updatable: false,
8603 }
8604
8605 apex {
8606 name: "com.android.art.debug",
8607 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008608 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008609 updatable: false,
8610 }
8611
8612 apex_key {
8613 name: "myapex.key",
8614 public_key: "testkey.avbpubkey",
8615 private_key: "testkey.pem",
8616 }
8617
8618 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008619 name: "libnativebridge",
8620 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008621 system_shared_libs: [],
8622 stl: "none",
8623 stubs: {
8624 versions: ["1"],
8625 },
8626 apex_available: ["com.android.art", "com.android.art.debug"],
8627 }
8628
8629 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008630 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008631 srcs: ["mylib.cpp"],
8632 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008633 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008634 stl: "none",
8635 apex_available: ["com.android.art.debug"],
8636 test_for: ["com.android.art"],
8637 }
8638 `,
8639 android.MockFS{
8640 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8641 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8642 }.AddToFixture())
8643}
8644
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008645// TODO(jungjw): Move this to proptools
8646func intPtr(i int) *int {
8647 return &i
8648}
8649
8650func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008651 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008652 apex_set {
8653 name: "myapex",
8654 set: "myapex.apks",
8655 filename: "foo_v2.apex",
8656 overrides: ["foo"],
8657 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008658 `,
8659 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8660 variables.Platform_sdk_version = intPtr(30)
8661 }),
8662 android.FixtureModifyConfig(func(config android.Config) {
8663 config.Targets[android.Android] = []android.Target{
8664 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8665 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8666 }
8667 }),
8668 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008669
Paul Duffin24704672021-04-06 16:09:30 +01008670 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008671
8672 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008673 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008674 actual := extractedApex.Args["abis"]
8675 expected := "ARMEABI_V7A,ARM64_V8A"
8676 if actual != expected {
8677 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8678 }
8679 actual = extractedApex.Args["sdk-version"]
8680 expected = "30"
8681 if actual != expected {
8682 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8683 }
8684
Paul Duffin6717d882021-06-15 19:09:41 +01008685 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008686 a := m.Module().(*ApexSet)
8687 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008688 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008689 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8690 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8691 }
8692}
8693
Anton Hansson805e0a52022-11-25 14:06:46 +00008694func TestApexSet_NativeBridge(t *testing.T) {
8695 ctx := testApex(t, `
8696 apex_set {
8697 name: "myapex",
8698 set: "myapex.apks",
8699 filename: "foo_v2.apex",
8700 overrides: ["foo"],
8701 }
8702 `,
8703 android.FixtureModifyConfig(func(config android.Config) {
8704 config.Targets[android.Android] = []android.Target{
8705 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8706 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8707 }
8708 }),
8709 )
8710
8711 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8712
8713 // Check extract_apks tool parameters. No native bridge arch expected
8714 extractedApex := m.Output("extracted/myapex.apks")
8715 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8716}
8717
Jiyong Park7d95a512020-05-10 15:16:24 +09008718func TestNoStaticLinkingToStubsLib(t *testing.T) {
8719 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8720 apex {
8721 name: "myapex",
8722 key: "myapex.key",
8723 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008725 }
8726
8727 apex_key {
8728 name: "myapex.key",
8729 public_key: "testkey.avbpubkey",
8730 private_key: "testkey.pem",
8731 }
8732
8733 cc_library {
8734 name: "mylib",
8735 srcs: ["mylib.cpp"],
8736 static_libs: ["otherlib"],
8737 system_shared_libs: [],
8738 stl: "none",
8739 apex_available: [ "myapex" ],
8740 }
8741
8742 cc_library {
8743 name: "otherlib",
8744 srcs: ["mylib.cpp"],
8745 system_shared_libs: [],
8746 stl: "none",
8747 stubs: {
8748 versions: ["1", "2", "3"],
8749 },
8750 apex_available: [ "myapex" ],
8751 }
8752 `)
8753}
8754
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008755func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008756 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008757 apex {
8758 name: "myapex",
8759 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008760 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008761 custom_sign_tool: "sign_myapex",
8762 }
8763
8764 apex_key {
8765 name: "myapex.key",
8766 public_key: "testkey.avbpubkey",
8767 private_key: "testkey.pem",
8768 }
8769 `)
8770
8771 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8772 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8773 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"`)
8774}
8775
8776func TestApexKeysTxtOverrides(t *testing.T) {
8777 ctx := testApex(t, `
8778 apex {
8779 name: "myapex",
8780 key: "myapex.key",
8781 updatable: false,
8782 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008783 }
8784
8785 apex_key {
8786 name: "myapex.key",
8787 public_key: "testkey.avbpubkey",
8788 private_key: "testkey.pem",
8789 }
8790
8791 prebuilt_apex {
8792 name: "myapex",
8793 prefer: true,
8794 arch: {
8795 arm64: {
8796 src: "myapex-arm64.apex",
8797 },
8798 arm: {
8799 src: "myapex-arm.apex",
8800 },
8801 },
8802 }
8803
8804 apex_set {
8805 name: "myapex_set",
8806 set: "myapex.apks",
8807 filename: "myapex_set.apex",
8808 overrides: ["myapex"],
8809 }
8810 `)
8811
8812 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8813 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8814 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 +09008815 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 +09008816}
8817
Jooyung Han938b5932020-06-20 12:47:47 +09008818func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008819 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008820 apex {
8821 name: "myapex",
8822 key: "myapex.key",
8823 apps: ["app"],
8824 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008825 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008826 }
8827
8828 apex_key {
8829 name: "myapex.key",
8830 public_key: "testkey.avbpubkey",
8831 private_key: "testkey.pem",
8832 }
8833
8834 android_app {
8835 name: "app",
8836 srcs: ["foo/bar/MyClass.java"],
8837 package_name: "foo",
8838 sdk_version: "none",
8839 system_modules: "none",
8840 apex_available: [ "myapex" ],
8841 }
8842 `, withFiles(map[string][]byte{
8843 "sub/Android.bp": []byte(`
8844 override_apex {
8845 name: "override_myapex",
8846 base: "myapex",
8847 apps: ["override_app"],
8848 allowed_files: ":allowed",
8849 }
8850 // Overridable "path" property should be referenced indirectly
8851 filegroup {
8852 name: "allowed",
8853 srcs: ["allowed.txt"],
8854 }
8855 override_android_app {
8856 name: "override_app",
8857 base: "app",
8858 package_name: "bar",
8859 }
8860 `),
8861 }))
8862
8863 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8864 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8865 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8866 }
8867
8868 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8869 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8870 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8871 }
8872}
8873
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008874func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008875 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008876 apex {
8877 name: "myapex",
8878 key: "myapex.key",
8879 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008880 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008881 }
8882
8883 apex_key {
8884 name: "myapex.key",
8885 public_key: "testkey.avbpubkey",
8886 private_key: "testkey.pem",
8887 }
8888
8889 cc_library {
8890 name: "mylib",
8891 srcs: ["mylib.cpp"],
8892 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008893 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008894 },
8895 apex_available: ["myapex"],
8896 }
8897
8898 cc_prebuilt_library_shared {
8899 name: "mylib",
8900 prefer: false,
8901 srcs: ["prebuilt.so"],
8902 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008903 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008904 },
8905 apex_available: ["myapex"],
8906 }
8907 `)
8908}
8909
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008910func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008911 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008912 apex {
8913 name: "myapex",
8914 key: "myapex.key",
8915 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008916 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008917 }
8918 apex_key {
8919 name: "myapex.key",
8920 public_key: "testkey.avbpubkey",
8921 private_key: "testkey.pem",
8922 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008923 `,
8924 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8925 variables.CompressedApex = proptools.BoolPtr(true)
8926 }),
8927 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008928
8929 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8930 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8931
8932 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8933 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8934
8935 // Make sure output of bundle is .capex
8936 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8937 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8938
8939 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008940 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008941 var builder strings.Builder
8942 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8943 androidMk := builder.String()
8944 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8945}
8946
Martin Stjernholm2856c662020-12-02 15:03:42 +00008947func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008948 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008949 apex {
8950 name: "myapex",
8951 key: "myapex.key",
8952 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008953 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008954 }
8955
8956 apex_key {
8957 name: "myapex.key",
8958 public_key: "testkey.avbpubkey",
8959 private_key: "testkey.pem",
8960 }
8961
8962 cc_library {
8963 name: "mylib",
8964 srcs: ["mylib.cpp"],
8965 apex_available: ["myapex"],
8966 shared_libs: ["otherlib"],
8967 system_shared_libs: [],
8968 }
8969
8970 cc_library {
8971 name: "otherlib",
8972 srcs: ["mylib.cpp"],
8973 stubs: {
8974 versions: ["current"],
8975 },
8976 }
8977
8978 cc_prebuilt_library_shared {
8979 name: "otherlib",
8980 prefer: true,
8981 srcs: ["prebuilt.so"],
8982 stubs: {
8983 versions: ["current"],
8984 },
8985 }
8986 `)
8987
8988 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008989 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008990 var builder strings.Builder
8991 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8992 androidMk := builder.String()
8993
8994 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8995 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008996 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 +00008997}
8998
Jiyong Parke3867542020-12-03 17:28:25 +09008999func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009000 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009001 apex {
9002 name: "myapex",
9003 key: "myapex.key",
9004 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009005 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009006 }
9007
9008 apex_key {
9009 name: "myapex.key",
9010 public_key: "testkey.avbpubkey",
9011 private_key: "testkey.pem",
9012 }
9013
9014 cc_library {
9015 name: "mylib",
9016 srcs: ["mylib.cpp"],
9017 system_shared_libs: [],
9018 stl: "none",
9019 apex_available: ["myapex"],
9020 shared_libs: ["mylib2"],
9021 target: {
9022 apex: {
9023 exclude_shared_libs: ["mylib2"],
9024 },
9025 },
9026 }
9027
9028 cc_library {
9029 name: "mylib2",
9030 srcs: ["mylib.cpp"],
9031 system_shared_libs: [],
9032 stl: "none",
9033 }
9034 `)
9035
9036 // Check if mylib is linked to mylib2 for the non-apex target
9037 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9038 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9039
9040 // Make sure that the link doesn't occur for the apex target
9041 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9042 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9043
9044 // It shouldn't appear in the copy cmd as well.
9045 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9046 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9047}
9048
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009049func TestPrebuiltStubLibDep(t *testing.T) {
9050 bpBase := `
9051 apex {
9052 name: "myapex",
9053 key: "myapex.key",
9054 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009055 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009056 }
9057 apex_key {
9058 name: "myapex.key",
9059 public_key: "testkey.avbpubkey",
9060 private_key: "testkey.pem",
9061 }
9062 cc_library {
9063 name: "mylib",
9064 srcs: ["mylib.cpp"],
9065 apex_available: ["myapex"],
9066 shared_libs: ["stublib"],
9067 system_shared_libs: [],
9068 }
9069 apex {
9070 name: "otherapex",
9071 enabled: %s,
9072 key: "myapex.key",
9073 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009074 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009075 }
9076 `
9077
9078 stublibSourceBp := `
9079 cc_library {
9080 name: "stublib",
9081 srcs: ["mylib.cpp"],
9082 apex_available: ["otherapex"],
9083 system_shared_libs: [],
9084 stl: "none",
9085 stubs: {
9086 versions: ["1"],
9087 },
9088 }
9089 `
9090
9091 stublibPrebuiltBp := `
9092 cc_prebuilt_library_shared {
9093 name: "stublib",
9094 srcs: ["prebuilt.so"],
9095 apex_available: ["otherapex"],
9096 stubs: {
9097 versions: ["1"],
9098 },
9099 %s
9100 }
9101 `
9102
9103 tests := []struct {
9104 name string
9105 stublibBp string
9106 usePrebuilt bool
9107 modNames []string // Modules to collect AndroidMkEntries for
9108 otherApexEnabled []string
9109 }{
9110 {
9111 name: "only_source",
9112 stublibBp: stublibSourceBp,
9113 usePrebuilt: false,
9114 modNames: []string{"stublib"},
9115 otherApexEnabled: []string{"true", "false"},
9116 },
9117 {
9118 name: "source_preferred",
9119 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9120 usePrebuilt: false,
9121 modNames: []string{"stublib", "prebuilt_stublib"},
9122 otherApexEnabled: []string{"true", "false"},
9123 },
9124 {
9125 name: "prebuilt_preferred",
9126 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9127 usePrebuilt: true,
9128 modNames: []string{"stublib", "prebuilt_stublib"},
9129 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9130 },
9131 {
9132 name: "only_prebuilt",
9133 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9134 usePrebuilt: true,
9135 modNames: []string{"stublib"},
9136 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9137 },
9138 }
9139
9140 for _, test := range tests {
9141 t.Run(test.name, func(t *testing.T) {
9142 for _, otherApexEnabled := range test.otherApexEnabled {
9143 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009144 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009145
9146 type modAndMkEntries struct {
9147 mod *cc.Module
9148 mkEntries android.AndroidMkEntries
9149 }
9150 entries := []*modAndMkEntries{}
9151
9152 // Gather shared lib modules that are installable
9153 for _, modName := range test.modNames {
9154 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9155 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9156 continue
9157 }
9158 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009159 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009160 continue
9161 }
Colin Crossaa255532020-07-03 13:18:24 -07009162 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009163 if ent.Disabled {
9164 continue
9165 }
9166 entries = append(entries, &modAndMkEntries{
9167 mod: mod,
9168 mkEntries: ent,
9169 })
9170 }
9171 }
9172 }
9173
9174 var entry *modAndMkEntries = nil
9175 for _, ent := range entries {
9176 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9177 if entry != nil {
9178 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9179 } else {
9180 entry = ent
9181 }
9182 }
9183 }
9184
9185 if entry == nil {
9186 t.Errorf("AndroidMk entry for \"stublib\" missing")
9187 } else {
9188 isPrebuilt := entry.mod.Prebuilt() != nil
9189 if isPrebuilt != test.usePrebuilt {
9190 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9191 }
9192 if !entry.mod.IsStubs() {
9193 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9194 }
9195 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9196 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9197 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009198 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009199 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009200 if !android.InList(expected, cflags) {
9201 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9202 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009203 }
9204 })
9205 }
9206 })
9207 }
9208}
9209
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009210func TestHostApexInHostOnlyBuild(t *testing.T) {
9211 testApex(t, `
9212 apex {
9213 name: "myapex",
9214 host_supported: true,
9215 key: "myapex.key",
9216 updatable: false,
9217 payload_type: "zip",
9218 }
9219 apex_key {
9220 name: "myapex.key",
9221 public_key: "testkey.avbpubkey",
9222 private_key: "testkey.pem",
9223 }
9224 `,
9225 android.FixtureModifyConfig(func(config android.Config) {
9226 // We may not have device targets in all builds, e.g. in
9227 // prebuilts/build-tools/build-prebuilts.sh
9228 config.Targets[android.Android] = []android.Target{}
9229 }))
9230}
9231
Colin Crossc33e5212021-05-25 18:16:02 -07009232func TestApexJavaCoverage(t *testing.T) {
9233 bp := `
9234 apex {
9235 name: "myapex",
9236 key: "myapex.key",
9237 java_libs: ["mylib"],
9238 bootclasspath_fragments: ["mybootclasspathfragment"],
9239 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9240 updatable: false,
9241 }
9242
9243 apex_key {
9244 name: "myapex.key",
9245 public_key: "testkey.avbpubkey",
9246 private_key: "testkey.pem",
9247 }
9248
9249 java_library {
9250 name: "mylib",
9251 srcs: ["mylib.java"],
9252 apex_available: ["myapex"],
9253 compile_dex: true,
9254 }
9255
9256 bootclasspath_fragment {
9257 name: "mybootclasspathfragment",
9258 contents: ["mybootclasspathlib"],
9259 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009260 hidden_api: {
9261 split_packages: ["*"],
9262 },
Colin Crossc33e5212021-05-25 18:16:02 -07009263 }
9264
9265 java_library {
9266 name: "mybootclasspathlib",
9267 srcs: ["mybootclasspathlib.java"],
9268 apex_available: ["myapex"],
9269 compile_dex: true,
9270 }
9271
9272 systemserverclasspath_fragment {
9273 name: "mysystemserverclasspathfragment",
9274 contents: ["mysystemserverclasspathlib"],
9275 apex_available: ["myapex"],
9276 }
9277
9278 java_library {
9279 name: "mysystemserverclasspathlib",
9280 srcs: ["mysystemserverclasspathlib.java"],
9281 apex_available: ["myapex"],
9282 compile_dex: true,
9283 }
9284 `
9285
9286 result := android.GroupFixturePreparers(
9287 PrepareForTestWithApexBuildComponents,
9288 prepareForTestWithMyapex,
9289 java.PrepareForTestWithJavaDefaultModules,
9290 android.PrepareForTestWithAndroidBuildComponents,
9291 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009292 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9293 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009294 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009295 ).RunTest(t)
9296
9297 // Make sure jacoco ran on both mylib and mybootclasspathlib
9298 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9299 t.Errorf("Failed to find jacoco rule for mylib")
9300 }
9301 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9302 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9303 }
9304 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9305 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9306 }
9307}
9308
Jiyong Park192600a2021-08-03 07:52:17 +00009309func TestProhibitStaticExecutable(t *testing.T) {
9310 testApexError(t, `executable mybin is static`, `
9311 apex {
9312 name: "myapex",
9313 key: "myapex.key",
9314 binaries: ["mybin"],
9315 min_sdk_version: "29",
9316 }
9317
9318 apex_key {
9319 name: "myapex.key",
9320 public_key: "testkey.avbpubkey",
9321 private_key: "testkey.pem",
9322 }
9323
9324 cc_binary {
9325 name: "mybin",
9326 srcs: ["mylib.cpp"],
9327 relative_install_path: "foo/bar",
9328 static_executable: true,
9329 system_shared_libs: [],
9330 stl: "none",
9331 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009332 min_sdk_version: "29",
9333 }
9334 `)
9335
9336 testApexError(t, `executable mybin.rust is static`, `
9337 apex {
9338 name: "myapex",
9339 key: "myapex.key",
9340 binaries: ["mybin.rust"],
9341 min_sdk_version: "29",
9342 }
9343
9344 apex_key {
9345 name: "myapex.key",
9346 public_key: "testkey.avbpubkey",
9347 private_key: "testkey.pem",
9348 }
9349
9350 rust_binary {
9351 name: "mybin.rust",
9352 srcs: ["foo.rs"],
9353 static_executable: true,
9354 apex_available: ["myapex"],
9355 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009356 }
9357 `)
9358}
9359
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009360func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9361 ctx := testApex(t, `
9362 apex {
9363 name: "myapex",
9364 key: "myapex.key",
9365 updatable: false,
9366 java_libs: ["foo"],
9367 }
9368
9369 apex_key {
9370 name: "myapex.key",
9371 public_key: "testkey.avbpubkey",
9372 private_key: "testkey.pem",
9373 }
9374
9375 java_library {
9376 name: "foo",
9377 srcs: ["foo.java"],
9378 apex_available: ["myapex"],
9379 installable: true,
9380 }
9381 `,
9382 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9383 )
9384
9385 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9386 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9387 var builder strings.Builder
9388 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9389 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009390 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 +00009391}
9392
9393func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9394 ctx := testApex(t, `
9395 prebuilt_apex {
9396 name: "myapex",
9397 arch: {
9398 arm64: {
9399 src: "myapex-arm64.apex",
9400 },
9401 arm: {
9402 src: "myapex-arm.apex",
9403 },
9404 },
9405 exported_java_libs: ["foo"],
9406 }
9407
9408 java_import {
9409 name: "foo",
9410 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009411 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009412 }
9413 `,
9414 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9415 )
9416
9417 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9418 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9419 mainModuleEntries := entriesList[0]
9420 android.AssertArrayString(t,
9421 "LOCAL_REQUIRED_MODULES",
9422 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9423 []string{
9424 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9425 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9426 })
9427}
9428
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009429func TestAndroidMk_RequiredModules(t *testing.T) {
9430 ctx := testApex(t, `
9431 apex {
9432 name: "myapex",
9433 key: "myapex.key",
9434 updatable: false,
9435 java_libs: ["foo"],
9436 required: ["otherapex"],
9437 }
9438
9439 apex {
9440 name: "otherapex",
9441 key: "myapex.key",
9442 updatable: false,
9443 java_libs: ["foo"],
9444 required: ["otherapex"],
9445 }
9446
9447 apex_key {
9448 name: "myapex.key",
9449 public_key: "testkey.avbpubkey",
9450 private_key: "testkey.pem",
9451 }
9452
9453 java_library {
9454 name: "foo",
9455 srcs: ["foo.java"],
9456 apex_available: ["myapex", "otherapex"],
9457 installable: true,
9458 }
9459 `)
9460
9461 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9462 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9463 var builder strings.Builder
9464 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9465 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009466 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009467}
9468
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009469func TestAndroidMk_RequiredDeps(t *testing.T) {
9470 ctx := testApex(t, `
9471 apex {
9472 name: "myapex",
9473 key: "myapex.key",
9474 updatable: false,
9475 }
9476
9477 apex_key {
9478 name: "myapex.key",
9479 public_key: "testkey.avbpubkey",
9480 private_key: "testkey.pem",
9481 }
9482 `)
9483
9484 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009485 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009486 data := android.AndroidMkDataForTest(t, ctx, bundle)
9487 var builder strings.Builder
9488 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9489 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009490 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009491
9492 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009493 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009494 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9495 var flattenedBuilder strings.Builder
9496 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9497 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009498 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009499}
9500
Jooyung Hana6d36672022-02-24 13:58:07 +09009501func TestApexOutputFileProducer(t *testing.T) {
9502 for _, tc := range []struct {
9503 name string
9504 ref string
9505 expected_data []string
9506 }{
9507 {
9508 name: "test_using_output",
9509 ref: ":myapex",
9510 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9511 },
9512 {
9513 name: "test_using_apex",
9514 ref: ":myapex{.apex}",
9515 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9516 },
9517 } {
9518 t.Run(tc.name, func(t *testing.T) {
9519 ctx := testApex(t, `
9520 apex {
9521 name: "myapex",
9522 key: "myapex.key",
9523 compressible: true,
9524 updatable: false,
9525 }
9526
9527 apex_key {
9528 name: "myapex.key",
9529 public_key: "testkey.avbpubkey",
9530 private_key: "testkey.pem",
9531 }
9532
9533 java_test {
9534 name: "`+tc.name+`",
9535 srcs: ["a.java"],
9536 data: ["`+tc.ref+`"],
9537 }
9538 `,
9539 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9540 variables.CompressedApex = proptools.BoolPtr(true)
9541 }))
9542 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9543 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9544 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9545 })
9546 }
9547}
9548
satayev758968a2021-12-06 11:42:40 +00009549func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9550 preparer := android.GroupFixturePreparers(
9551 PrepareForTestWithApexBuildComponents,
9552 prepareForTestWithMyapex,
9553 java.PrepareForTestWithJavaSdkLibraryFiles,
9554 java.PrepareForTestWithJavaDefaultModules,
9555 android.PrepareForTestWithAndroidBuildComponents,
9556 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9557 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9558 )
9559
9560 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9561 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9562 preparer.RunTestWithBp(t, `
9563 apex {
9564 name: "myapex",
9565 key: "myapex.key",
9566 bootclasspath_fragments: ["mybootclasspathfragment"],
9567 min_sdk_version: "30",
9568 updatable: false,
9569 }
9570
9571 apex_key {
9572 name: "myapex.key",
9573 public_key: "testkey.avbpubkey",
9574 private_key: "testkey.pem",
9575 }
9576
9577 bootclasspath_fragment {
9578 name: "mybootclasspathfragment",
9579 contents: ["mybootclasspathlib"],
9580 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009581 hidden_api: {
9582 split_packages: ["*"],
9583 },
satayev758968a2021-12-06 11:42:40 +00009584 }
9585
9586 java_sdk_library {
9587 name: "mybootclasspathlib",
9588 srcs: ["mybootclasspathlib.java"],
9589 apex_available: ["myapex"],
9590 compile_dex: true,
9591 unsafe_ignore_missing_latest_api: true,
9592 min_sdk_version: "31",
9593 static_libs: ["util"],
9594 }
9595
9596 java_library {
9597 name: "util",
9598 srcs: ["a.java"],
9599 apex_available: ["myapex"],
9600 min_sdk_version: "31",
9601 static_libs: ["another_util"],
9602 }
9603
9604 java_library {
9605 name: "another_util",
9606 srcs: ["a.java"],
9607 min_sdk_version: "31",
9608 apex_available: ["myapex"],
9609 }
9610 `)
9611 })
9612
9613 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9614 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9615 preparer.RunTestWithBp(t, `
9616 apex {
9617 name: "myapex",
9618 key: "myapex.key",
9619 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9620 min_sdk_version: "30",
9621 updatable: false,
9622 }
9623
9624 apex_key {
9625 name: "myapex.key",
9626 public_key: "testkey.avbpubkey",
9627 private_key: "testkey.pem",
9628 }
9629
9630 systemserverclasspath_fragment {
9631 name: "mysystemserverclasspathfragment",
9632 contents: ["mysystemserverclasspathlib"],
9633 apex_available: ["myapex"],
9634 }
9635
9636 java_sdk_library {
9637 name: "mysystemserverclasspathlib",
9638 srcs: ["mysystemserverclasspathlib.java"],
9639 apex_available: ["myapex"],
9640 compile_dex: true,
9641 min_sdk_version: "32",
9642 unsafe_ignore_missing_latest_api: true,
9643 static_libs: ["util"],
9644 }
9645
9646 java_library {
9647 name: "util",
9648 srcs: ["a.java"],
9649 apex_available: ["myapex"],
9650 min_sdk_version: "31",
9651 static_libs: ["another_util"],
9652 }
9653
9654 java_library {
9655 name: "another_util",
9656 srcs: ["a.java"],
9657 min_sdk_version: "31",
9658 apex_available: ["myapex"],
9659 }
9660 `)
9661 })
9662
9663 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9664 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9665 RunTestWithBp(t, `
9666 apex {
9667 name: "myapex",
9668 key: "myapex.key",
9669 bootclasspath_fragments: ["mybootclasspathfragment"],
9670 min_sdk_version: "30",
9671 updatable: false,
9672 }
9673
9674 apex_key {
9675 name: "myapex.key",
9676 public_key: "testkey.avbpubkey",
9677 private_key: "testkey.pem",
9678 }
9679
9680 bootclasspath_fragment {
9681 name: "mybootclasspathfragment",
9682 contents: ["mybootclasspathlib"],
9683 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009684 hidden_api: {
9685 split_packages: ["*"],
9686 },
satayev758968a2021-12-06 11:42:40 +00009687 }
9688
9689 java_sdk_library {
9690 name: "mybootclasspathlib",
9691 srcs: ["mybootclasspathlib.java"],
9692 apex_available: ["myapex"],
9693 compile_dex: true,
9694 unsafe_ignore_missing_latest_api: true,
9695 }
9696 `)
9697 })
9698
9699 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9700 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9701 RunTestWithBp(t, `
9702 apex {
9703 name: "myapex",
9704 key: "myapex.key",
9705 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9706 min_sdk_version: "30",
9707 updatable: false,
9708 }
9709
9710 apex_key {
9711 name: "myapex.key",
9712 public_key: "testkey.avbpubkey",
9713 private_key: "testkey.pem",
9714 }
9715
9716 systemserverclasspath_fragment {
9717 name: "mysystemserverclasspathfragment",
9718 contents: ["mysystemserverclasspathlib"],
9719 apex_available: ["myapex"],
9720 }
9721
9722 java_sdk_library {
9723 name: "mysystemserverclasspathlib",
9724 srcs: ["mysystemserverclasspathlib.java"],
9725 apex_available: ["myapex"],
9726 compile_dex: true,
9727 unsafe_ignore_missing_latest_api: true,
9728 }
9729 `)
9730 })
9731}
9732
Jiakai Zhang6decef92022-01-12 17:56:19 +00009733// Verifies that the APEX depends on all the Make modules in the list.
9734func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9735 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9736 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009737 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009738 }
9739}
9740
9741// Verifies that the APEX does not depend on any of the Make modules in the list.
9742func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9743 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9744 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009745 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009746 }
9747}
9748
Cole Faust1021ccd2023-02-26 21:15:25 -08009749// TODO(b/193460475): Re-enable this test
9750//func TestApexStrictUpdtabilityLint(t *testing.T) {
9751// bpTemplate := `
9752// apex {
9753// name: "myapex",
9754// key: "myapex.key",
9755// java_libs: ["myjavalib"],
9756// updatable: %v,
9757// min_sdk_version: "29",
9758// }
9759// apex_key {
9760// name: "myapex.key",
9761// }
9762// java_library {
9763// name: "myjavalib",
9764// srcs: ["MyClass.java"],
9765// apex_available: [ "myapex" ],
9766// lint: {
9767// strict_updatability_linting: %v,
9768// },
9769// sdk_version: "current",
9770// min_sdk_version: "29",
9771// }
9772// `
9773// fs := android.MockFS{
9774// "lint-baseline.xml": nil,
9775// }
9776//
9777// testCases := []struct {
9778// testCaseName string
9779// apexUpdatable bool
9780// javaStrictUpdtabilityLint bool
9781// lintFileExists bool
9782// disallowedFlagExpected bool
9783// }{
9784// {
9785// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9786// apexUpdatable: true,
9787// javaStrictUpdtabilityLint: true,
9788// lintFileExists: false,
9789// disallowedFlagExpected: false,
9790// },
9791// {
9792// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9793// apexUpdatable: false,
9794// javaStrictUpdtabilityLint: false,
9795// lintFileExists: true,
9796// disallowedFlagExpected: false,
9797// },
9798// {
9799// testCaseName: "non-updatable apex respects strict updatability of javalib",
9800// apexUpdatable: false,
9801// javaStrictUpdtabilityLint: true,
9802// lintFileExists: true,
9803// disallowedFlagExpected: true,
9804// },
9805// {
9806// testCaseName: "updatable apex sets strict updatability of javalib to true",
9807// apexUpdatable: true,
9808// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9809// lintFileExists: true,
9810// disallowedFlagExpected: true,
9811// },
9812// }
9813//
9814// for _, testCase := range testCases {
9815// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9816// fixtures := []android.FixturePreparer{}
9817// if testCase.lintFileExists {
9818// fixtures = append(fixtures, fs.AddToFixture())
9819// }
9820//
9821// result := testApex(t, bp, fixtures...)
9822// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9823// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9824// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9825//
9826// if disallowedFlagActual != testCase.disallowedFlagExpected {
9827// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9828// }
9829// }
9830//}
9831//
9832//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9833// bp := `
9834// apex {
9835// name: "myapex",
9836// key: "myapex.key",
9837// java_libs: ["myjavalib"],
9838// updatable: true,
9839// min_sdk_version: "29",
9840// }
9841// apex_key {
9842// name: "myapex.key",
9843// }
9844// java_library {
9845// name: "myjavalib",
9846// srcs: ["MyClass.java"],
9847// apex_available: [ "myapex" ],
9848// sdk_version: "current",
9849// min_sdk_version: "29",
9850// }
9851// `
9852//
9853// testCases := []struct {
9854// testCaseName string
9855// moduleDirectory string
9856// disallowedFlagExpected bool
9857// }{
9858// {
9859// testCaseName: "lintable module defined outside libcore",
9860// moduleDirectory: "",
9861// disallowedFlagExpected: true,
9862// },
9863// {
9864// testCaseName: "lintable module defined in libcore root directory",
9865// moduleDirectory: "libcore/",
9866// disallowedFlagExpected: false,
9867// },
9868// {
9869// testCaseName: "lintable module defined in libcore child directory",
9870// moduleDirectory: "libcore/childdir/",
9871// disallowedFlagExpected: true,
9872// },
9873// }
9874//
9875// for _, testCase := range testCases {
9876// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9877// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9878// result := testApex(t, "", lintFileCreator, bpFileCreator)
9879// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9880// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9881// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9882// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9883//
9884// if disallowedFlagActual != testCase.disallowedFlagExpected {
9885// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9886// }
9887// }
9888//}
9889//
9890//// checks transtive deps of an apex coming from bootclasspath_fragment
9891//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9892// bp := `
9893// apex {
9894// name: "myapex",
9895// key: "myapex.key",
9896// bootclasspath_fragments: ["mybootclasspathfragment"],
9897// updatable: true,
9898// min_sdk_version: "29",
9899// }
9900// apex_key {
9901// name: "myapex.key",
9902// }
9903// bootclasspath_fragment {
9904// name: "mybootclasspathfragment",
9905// contents: ["myjavalib"],
9906// apex_available: ["myapex"],
9907// hidden_api: {
9908// split_packages: ["*"],
9909// },
9910// }
9911// java_library {
9912// name: "myjavalib",
9913// srcs: ["MyClass.java"],
9914// apex_available: [ "myapex" ],
9915// sdk_version: "current",
9916// min_sdk_version: "29",
9917// compile_dex: true,
9918// }
9919// `
9920// fs := android.MockFS{
9921// "lint-baseline.xml": nil,
9922// }
9923//
9924// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9925// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9926// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9927// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9928// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9929// }
9930//}
Spandan Das66773252022-01-15 00:23:18 +00009931
Spandan Das42e89502022-05-06 22:12:55 +00009932// updatable apexes should propagate updatable=true to its apps
9933func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9934 bp := `
9935 apex {
9936 name: "myapex",
9937 key: "myapex.key",
9938 updatable: %v,
9939 apps: [
9940 "myapp",
9941 ],
9942 min_sdk_version: "30",
9943 }
9944 apex_key {
9945 name: "myapex.key",
9946 }
9947 android_app {
9948 name: "myapp",
9949 updatable: %v,
9950 apex_available: [
9951 "myapex",
9952 ],
9953 sdk_version: "current",
9954 min_sdk_version: "30",
9955 }
9956 `
9957 testCases := []struct {
9958 name string
9959 apex_is_updatable_bp bool
9960 app_is_updatable_bp bool
9961 app_is_updatable_expected bool
9962 }{
9963 {
9964 name: "Non-updatable apex respects updatable property of non-updatable app",
9965 apex_is_updatable_bp: false,
9966 app_is_updatable_bp: false,
9967 app_is_updatable_expected: false,
9968 },
9969 {
9970 name: "Non-updatable apex respects updatable property of updatable app",
9971 apex_is_updatable_bp: false,
9972 app_is_updatable_bp: true,
9973 app_is_updatable_expected: true,
9974 },
9975 {
9976 name: "Updatable apex respects updatable property of updatable app",
9977 apex_is_updatable_bp: true,
9978 app_is_updatable_bp: true,
9979 app_is_updatable_expected: true,
9980 },
9981 {
9982 name: "Updatable apex sets updatable=true on non-updatable app",
9983 apex_is_updatable_bp: true,
9984 app_is_updatable_bp: false,
9985 app_is_updatable_expected: true,
9986 },
9987 }
9988 for _, testCase := range testCases {
9989 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9990 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9991 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9992 }
9993}
9994
Kiyoung Kim487689e2022-07-26 09:48:22 +09009995func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9996 bp := `
9997 apex {
9998 name: "myapex",
9999 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010000 native_shared_libs: ["libbaz"],
10001 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010002 min_sdk_version: "29",
10003 }
10004 apex_key {
10005 name: "myapex.key",
10006 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010007 cc_binary {
10008 name: "binfoo",
10009 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010010 apex_available: ["myapex"],
10011 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010012 recovery_available: false,
10013 }
10014 cc_library {
10015 name: "libbar",
10016 srcs: ["libbar.cc"],
10017 stubs: {
10018 symbol_file: "libbar.map.txt",
10019 versions: [
10020 "29",
10021 ],
10022 },
10023 }
10024 cc_library {
10025 name: "libbaz",
10026 srcs: ["libbaz.cc"],
10027 apex_available: ["myapex"],
10028 min_sdk_version: "29",
10029 stubs: {
10030 symbol_file: "libbaz.map.txt",
10031 versions: [
10032 "29",
10033 ],
10034 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010035 }
10036 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010037 name: "libbar",
10038 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010039 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010040 variants: ["apex.29"],
10041 }
10042 cc_api_variant {
10043 name: "libbar",
10044 variant: "apex",
10045 version: "29",
10046 src: "libbar_apex_29.so",
10047 }
10048 cc_api_library {
10049 name: "libbaz",
10050 src: "libbaz_stub.so",
10051 min_sdk_version: "29",
10052 variants: ["apex.29"],
10053 }
10054 cc_api_variant {
10055 name: "libbaz",
10056 variant: "apex",
10057 version: "29",
10058 src: "libbaz_apex_29.so",
10059 }
10060 cc_api_library {
10061 name: "libqux",
10062 src: "libqux_stub.so",
10063 min_sdk_version: "29",
10064 variants: ["apex.29"],
10065 }
10066 cc_api_variant {
10067 name: "libqux",
10068 variant: "apex",
10069 version: "29",
10070 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010071 }
10072 api_imports {
10073 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010074 apex_shared_libs: [
10075 "libbar",
10076 "libbaz",
10077 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010078 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010079 }
10080 `
10081 result := testApex(t, bp)
10082
10083 hasDep := func(m android.Module, wantDep android.Module) bool {
10084 t.Helper()
10085 var found bool
10086 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10087 if dep == wantDep {
10088 found = true
10089 }
10090 })
10091 return found
10092 }
10093
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010094 // Library defines stubs and cc_api_library should be used with cc_api_library
10095 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10096 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10097 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010098
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010099 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10100 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010101
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010102 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10103 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10104 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10105 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10106
10107 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10108 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10109 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10110 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10111 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10112
10113 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10114 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10115 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10116
10117 // cc_api_library defined without original library should be linked with cc_api_library
10118 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10119 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10120 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10121}
10122
10123func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10124 bp := `
10125 apex {
10126 name: "myapex",
10127 key: "myapex.key",
10128 native_shared_libs: ["libbar"],
10129 min_sdk_version: "29",
10130 }
10131 apex_key {
10132 name: "myapex.key",
10133 }
10134 cc_binary {
10135 name: "binfoo",
10136 shared_libs: ["libbar"],
10137 recovery_available: false,
10138 }
10139 cc_library {
10140 name: "libbar",
10141 srcs: ["libbar.cc"],
10142 apex_available: ["myapex"],
10143 min_sdk_version: "29",
10144 stubs: {
10145 symbol_file: "libbar.map.txt",
10146 versions: [
10147 "29",
10148 ],
10149 },
10150 }
10151 cc_api_library {
10152 name: "libbar",
10153 src: "libbar_stub.so",
10154 variants: ["apex.29"],
10155 }
10156 cc_api_variant {
10157 name: "libbar",
10158 variant: "apex",
10159 version: "29",
10160 src: "libbar_apex_29.so",
10161 }
10162 api_imports {
10163 name: "api_imports",
10164 apex_shared_libs: [
10165 "libbar",
10166 ],
10167 }
10168 `
10169
10170 result := testApex(t, bp)
10171
10172 hasDep := func(m android.Module, wantDep android.Module) bool {
10173 t.Helper()
10174 var found bool
10175 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10176 if dep == wantDep {
10177 found = true
10178 }
10179 })
10180 return found
10181 }
10182
10183 // Library defines stubs and cc_api_library should be used with cc_api_library
10184 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10185 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10186 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10187
10188 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10189 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10190
10191 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10192 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10193 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10194 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010195}
Dennis Shend4f5d932023-01-31 20:27:21 +000010196
10197func TestTrimmedApex(t *testing.T) {
10198 bp := `
10199 apex {
10200 name: "myapex",
10201 key: "myapex.key",
10202 native_shared_libs: ["libfoo","libbaz"],
10203 min_sdk_version: "29",
10204 trim_against: "mydcla",
10205 }
10206 apex {
10207 name: "mydcla",
10208 key: "myapex.key",
10209 native_shared_libs: ["libfoo","libbar"],
10210 min_sdk_version: "29",
10211 file_contexts: ":myapex-file_contexts",
10212 dynamic_common_lib_apex: true,
10213 }
10214 apex_key {
10215 name: "myapex.key",
10216 }
10217 cc_library {
10218 name: "libfoo",
10219 shared_libs: ["libc"],
10220 apex_available: ["myapex","mydcla"],
10221 min_sdk_version: "29",
10222 }
10223 cc_library {
10224 name: "libbar",
10225 shared_libs: ["libc"],
10226 apex_available: ["myapex","mydcla"],
10227 min_sdk_version: "29",
10228 }
10229 cc_library {
10230 name: "libbaz",
10231 shared_libs: ["libc"],
10232 apex_available: ["myapex","mydcla"],
10233 min_sdk_version: "29",
10234 }
10235 cc_api_library {
10236 name: "libc",
10237 src: "libc.so",
10238 min_sdk_version: "29",
10239 recovery_available: true,
10240 }
10241 api_imports {
10242 name: "api_imports",
10243 shared_libs: [
10244 "libc",
10245 ],
10246 header_libs: [],
10247 }
10248 `
10249 ctx := testApex(t, bp)
10250 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10251 apexRule := module.MaybeRule("apexRule")
10252 if apexRule.Rule == nil {
10253 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10254 }
10255
10256 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10257 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10258 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10259 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10260 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10261 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10262}
Jingwen Chendea7a642023-03-28 11:30:50 +000010263
10264func TestCannedFsConfig(t *testing.T) {
10265 ctx := testApex(t, `
10266 apex {
10267 name: "myapex",
10268 key: "myapex.key",
10269 updatable: false,
10270 }
10271
10272 apex_key {
10273 name: "myapex.key",
10274 public_key: "testkey.avbpubkey",
10275 private_key: "testkey.pem",
10276 }`)
10277 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10278 generateFsRule := mod.Rule("generateFsConfig")
10279 cmd := generateFsRule.RuleParams.Command
10280
10281 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10282}
10283
10284func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10285 ctx := testApex(t, `
10286 apex {
10287 name: "myapex",
10288 key: "myapex.key",
10289 canned_fs_config: "my_config",
10290 updatable: false,
10291 }
10292
10293 apex_key {
10294 name: "myapex.key",
10295 public_key: "testkey.avbpubkey",
10296 private_key: "testkey.pem",
10297 }`)
10298 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10299 generateFsRule := mod.Rule("generateFsConfig")
10300 cmd := generateFsRule.RuleParams.Command
10301
10302 // Ensure that canned_fs_config has "cat my_config" at the end
10303 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10304}
Spandan Das20fce2d2023-04-12 17:21:39 +000010305
10306func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10307 testCases := []struct {
10308 desc string
10309 hasStubs bool
10310 apexAvailable string
10311 expectedError string
10312 }{
10313 {
10314 desc: "non-stub library can have multiple apex_available",
10315 hasStubs: false,
10316 apexAvailable: `["myapex", "otherapex"]`,
10317 },
10318 {
10319 desc: "stub library should not be available to anyapex",
10320 hasStubs: true,
10321 apexAvailable: `["//apex_available:anyapex"]`,
10322 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10323 },
10324 {
10325 desc: "stub library should not be available to multiple apexes",
10326 hasStubs: true,
10327 apexAvailable: `["myapex", "otherapex"]`,
10328 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10329 },
10330 {
10331 desc: "stub library can be available to a core apex and a test apex",
10332 hasStubs: true,
10333 apexAvailable: `["myapex", "test_myapex"]`,
10334 },
10335 }
10336 bpTemplate := `
10337 cc_library {
10338 name: "libfoo",
10339 %v
10340 apex_available: %v,
10341 }
10342 apex {
10343 name: "myapex",
10344 key: "apex.key",
10345 updatable: false,
10346 native_shared_libs: ["libfoo"],
10347 }
10348 apex {
10349 name: "otherapex",
10350 key: "apex.key",
10351 updatable: false,
10352 }
10353 apex_test {
10354 name: "test_myapex",
10355 key: "apex.key",
10356 updatable: false,
10357 native_shared_libs: ["libfoo"],
10358 }
10359 apex_key {
10360 name: "apex.key",
10361 }
10362 `
10363 for _, tc := range testCases {
10364 stubs := ""
10365 if tc.hasStubs {
10366 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10367 }
10368 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10369 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10370 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10371 })
10372 if tc.expectedError == "" {
10373 testApex(t, bp, mockFsFixturePreparer)
10374 } else {
10375 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10376 }
10377 }
10378}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010379
10380func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10381 context := android.GroupFixturePreparers(
10382 android.PrepareForIntegrationTestWithAndroid,
10383 cc.PrepareForIntegrationTestWithCc,
10384 PrepareForTestWithApexBuildComponents,
10385 prepareForTestWithMyapex,
10386 filesystem.PrepareForTestWithFilesystemBuildComponents,
10387 )
10388 result := context.RunTestWithBp(t, `
10389 android_system_image {
10390 name: "myfilesystem",
10391 deps: [
10392 "libfoo",
10393 ],
10394 linker_config_src: "linker.config.json",
10395 }
10396
10397 cc_library {
10398 name: "libfoo",
10399 shared_libs: [
10400 "libbar",
10401 ],
10402 stl: "none",
10403 }
10404
10405 cc_library {
10406 name: "libbar",
10407 stl: "none",
10408 apex_available: ["myapex"],
10409 }
10410
10411 apex {
10412 name: "myapex",
10413 native_shared_libs: ["libbar"],
10414 key: "myapex.key",
10415 updatable: false,
10416 }
10417
10418 apex_key {
10419 name: "myapex.key",
10420 public_key: "testkey.avbpubkey",
10421 private_key: "testkey.pem",
10422 }
10423 `)
10424
10425 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10426 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10427 inputs.Strings(),
10428 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10429}