blob: e4b0323e31a3c10a1de169861bc93b9f6639b099 [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,
Andrei Onea580636b2022-08-17 16:53:46 +00006049 privapp_allowlist: "perms.xml",
6050 package_name: "com.android.AppFooPriv",
Colin Cross094cde42020-02-15 10:38:00 -08006051 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006052 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006053 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006054
6055 cc_library_shared {
6056 name: "libjni",
6057 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006058 shared_libs: ["libfoo"],
6059 stl: "none",
6060 system_shared_libs: [],
6061 apex_available: [ "myapex" ],
6062 sdk_version: "current",
6063 }
6064
6065 cc_library_shared {
6066 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006067 stl: "none",
6068 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006069 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006070 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006071 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006072 `)
6073
Sundong Ahnabb64432019-10-22 13:58:29 +09006074 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006075 apexRule := module.Rule("apexRule")
6076 copyCmds := apexRule.Args["copy_commands"]
6077
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006078 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6079 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006080 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006081
Colin Crossaede88c2020-08-11 12:17:01 -07006082 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006083 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006084 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006085 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006086 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006087 // JNI libraries including transitive deps are
6088 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006089 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006090 // ... embedded inside APK (jnilibs.zip)
6091 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6092 // ... and not directly inside the APEX
6093 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6094 }
Dario Frenicde2a032019-10-27 00:29:22 +01006095}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006096
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006097func TestApexWithAppImportBuildId(t *testing.T) {
6098 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6099 for _, id := range invalidBuildIds {
6100 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6101 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6102 variables.BuildId = proptools.StringPtr(id)
6103 })
6104 testApexError(t, message, `apex {
6105 name: "myapex",
6106 key: "myapex.key",
6107 apps: ["AppFooPrebuilt"],
6108 updatable: false,
6109 }
6110
6111 apex_key {
6112 name: "myapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
6117 android_app_import {
6118 name: "AppFooPrebuilt",
6119 apk: "PrebuiltAppFoo.apk",
6120 presigned: true,
6121 apex_available: ["myapex"],
6122 }
6123 `, fixture)
6124 }
6125}
6126
Dario Frenicde2a032019-10-27 00:29:22 +01006127func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006128 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006129 apex {
6130 name: "myapex",
6131 key: "myapex.key",
6132 apps: [
6133 "AppFooPrebuilt",
6134 "AppFooPrivPrebuilt",
6135 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006136 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006137 }
6138
6139 apex_key {
6140 name: "myapex.key",
6141 public_key: "testkey.avbpubkey",
6142 private_key: "testkey.pem",
6143 }
6144
6145 android_app_import {
6146 name: "AppFooPrebuilt",
6147 apk: "PrebuiltAppFoo.apk",
6148 presigned: true,
6149 dex_preopt: {
6150 enabled: false,
6151 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006152 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006153 }
6154
6155 android_app_import {
6156 name: "AppFooPrivPrebuilt",
6157 apk: "PrebuiltAppFooPriv.apk",
6158 privileged: true,
6159 presigned: true,
6160 dex_preopt: {
6161 enabled: false,
6162 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006163 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006164 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006165 }
6166 `)
6167
Sundong Ahnabb64432019-10-22 13:58:29 +09006168 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006169 apexRule := module.Rule("apexRule")
6170 copyCmds := apexRule.Args["copy_commands"]
6171
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006172 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6173 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006174}
6175
6176func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006177 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006178 apex {
6179 name: "myapex",
6180 key: "myapex.key",
6181 apps: [
6182 "AppFoo",
6183 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006184 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006185 }
6186
6187 apex_key {
6188 name: "myapex.key",
6189 public_key: "testkey.avbpubkey",
6190 private_key: "testkey.pem",
6191 }
6192
6193 android_app {
6194 name: "AppFoo",
6195 srcs: ["foo/bar/MyClass.java"],
6196 sdk_version: "none",
6197 system_modules: "none",
6198 apex_available: [ "myapex" ],
6199 }
6200
6201 android_app_import {
6202 name: "AppFoo",
6203 apk: "AppFooPrebuilt.apk",
6204 filename: "AppFooPrebuilt.apk",
6205 presigned: true,
6206 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006207 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006208 }
6209 `, withFiles(map[string][]byte{
6210 "AppFooPrebuilt.apk": nil,
6211 }))
6212
6213 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006214 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006215 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006216}
6217
Dario Freni6f3937c2019-12-20 22:58:03 +00006218func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006219 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006220 apex {
6221 name: "myapex",
6222 key: "myapex.key",
6223 apps: [
6224 "TesterHelpAppFoo",
6225 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006226 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006227 }
6228
6229 apex_key {
6230 name: "myapex.key",
6231 public_key: "testkey.avbpubkey",
6232 private_key: "testkey.pem",
6233 }
6234
6235 android_test_helper_app {
6236 name: "TesterHelpAppFoo",
6237 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006238 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006239 }
6240
6241 `)
6242
6243 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6244 apexRule := module.Rule("apexRule")
6245 copyCmds := apexRule.Args["copy_commands"]
6246
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006247 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006248}
6249
Jooyung Han18020ea2019-11-13 10:50:48 +09006250func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6251 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006252 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006253 apex {
6254 name: "myapex",
6255 key: "myapex.key",
6256 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006257 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006258 }
6259
6260 apex_key {
6261 name: "myapex.key",
6262 public_key: "testkey.avbpubkey",
6263 private_key: "testkey.pem",
6264 }
6265
6266 apex {
6267 name: "otherapex",
6268 key: "myapex.key",
6269 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006270 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006271 }
6272
6273 cc_defaults {
6274 name: "libfoo-defaults",
6275 apex_available: ["otherapex"],
6276 }
6277
6278 cc_library {
6279 name: "libfoo",
6280 defaults: ["libfoo-defaults"],
6281 stl: "none",
6282 system_shared_libs: [],
6283 }`)
6284}
6285
Paul Duffine52e66f2020-03-30 17:54:29 +01006286func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006287 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006288 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006289 apex {
6290 name: "myapex",
6291 key: "myapex.key",
6292 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006293 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006294 }
6295
6296 apex_key {
6297 name: "myapex.key",
6298 public_key: "testkey.avbpubkey",
6299 private_key: "testkey.pem",
6300 }
6301
6302 apex {
6303 name: "otherapex",
6304 key: "otherapex.key",
6305 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006306 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006307 }
6308
6309 apex_key {
6310 name: "otherapex.key",
6311 public_key: "testkey.avbpubkey",
6312 private_key: "testkey.pem",
6313 }
6314
6315 cc_library {
6316 name: "libfoo",
6317 stl: "none",
6318 system_shared_libs: [],
6319 apex_available: ["otherapex"],
6320 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006321}
Jiyong Park127b40b2019-09-30 16:04:35 +09006322
Paul Duffine52e66f2020-03-30 17:54:29 +01006323func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006324 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006325 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006326.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006327.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006328.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006329.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006330.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006331.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006332 apex {
6333 name: "myapex",
6334 key: "myapex.key",
6335 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006336 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
Jiyong Park127b40b2019-09-30 16:04:35 +09006345 cc_library {
6346 name: "libfoo",
6347 stl: "none",
6348 shared_libs: ["libbar"],
6349 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006350 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006351 }
6352
6353 cc_library {
6354 name: "libbar",
6355 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006356 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006357 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006358 apex_available: ["myapex"],
6359 }
6360
6361 cc_library {
6362 name: "libbaz",
6363 stl: "none",
6364 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006365 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006366}
Jiyong Park127b40b2019-09-30 16:04:35 +09006367
Paul Duffine52e66f2020-03-30 17:54:29 +01006368func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 testApexError(t, "\"otherapex\" is not a valid module name", `
6370 apex {
6371 name: "myapex",
6372 key: "myapex.key",
6373 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006374 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006375 }
6376
6377 apex_key {
6378 name: "myapex.key",
6379 public_key: "testkey.avbpubkey",
6380 private_key: "testkey.pem",
6381 }
6382
6383 cc_library {
6384 name: "libfoo",
6385 stl: "none",
6386 system_shared_libs: [],
6387 apex_available: ["otherapex"],
6388 }`)
6389
Paul Duffine52e66f2020-03-30 17:54:29 +01006390 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006391 apex {
6392 name: "myapex",
6393 key: "myapex.key",
6394 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006395 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006396 }
6397
6398 apex_key {
6399 name: "myapex.key",
6400 public_key: "testkey.avbpubkey",
6401 private_key: "testkey.pem",
6402 }
6403
6404 cc_library {
6405 name: "libfoo",
6406 stl: "none",
6407 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006408 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006409 apex_available: ["myapex"],
6410 }
6411
6412 cc_library {
6413 name: "libbar",
6414 stl: "none",
6415 system_shared_libs: [],
6416 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006417 }
6418
6419 cc_library {
6420 name: "libbaz",
6421 stl: "none",
6422 system_shared_libs: [],
6423 stubs: {
6424 versions: ["10", "20", "30"],
6425 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006426 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006427}
Jiyong Park127b40b2019-09-30 16:04:35 +09006428
Jiyong Park89e850a2020-04-07 16:37:39 +09006429func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006430 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006431 apex {
6432 name: "myapex",
6433 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006434 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006435 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006436 }
6437
6438 apex_key {
6439 name: "myapex.key",
6440 public_key: "testkey.avbpubkey",
6441 private_key: "testkey.pem",
6442 }
6443
6444 cc_library {
6445 name: "libfoo",
6446 stl: "none",
6447 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006448 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006449 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006450 }
6451
6452 cc_library {
6453 name: "libfoo2",
6454 stl: "none",
6455 system_shared_libs: [],
6456 shared_libs: ["libbaz"],
6457 apex_available: ["//apex_available:platform"],
6458 }
6459
6460 cc_library {
6461 name: "libbar",
6462 stl: "none",
6463 system_shared_libs: [],
6464 apex_available: ["myapex"],
6465 }
6466
6467 cc_library {
6468 name: "libbaz",
6469 stl: "none",
6470 system_shared_libs: [],
6471 apex_available: ["myapex"],
6472 stubs: {
6473 versions: ["1"],
6474 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006475 }`)
6476
Jiyong Park89e850a2020-04-07 16:37:39 +09006477 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6478 // because it depends on libbar which isn't available to platform
6479 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6480 if libfoo.NotAvailableForPlatform() != true {
6481 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6482 }
6483
6484 // libfoo2 however can be available to platform because it depends on libbaz which provides
6485 // stubs
6486 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6487 if libfoo2.NotAvailableForPlatform() == true {
6488 t.Errorf("%q should be available to platform", libfoo2.String())
6489 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006490}
Jiyong Parka90ca002019-10-07 15:47:24 +09006491
Paul Duffine52e66f2020-03-30 17:54:29 +01006492func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006493 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006494 apex {
6495 name: "myapex",
6496 key: "myapex.key",
6497 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006498 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006499 }
6500
6501 apex_key {
6502 name: "myapex.key",
6503 public_key: "testkey.avbpubkey",
6504 private_key: "testkey.pem",
6505 }
6506
6507 cc_library {
6508 name: "libfoo",
6509 stl: "none",
6510 system_shared_libs: [],
6511 apex_available: ["myapex"],
6512 static: {
6513 apex_available: ["//apex_available:platform"],
6514 },
6515 }`)
6516
Jiyong Park89e850a2020-04-07 16:37:39 +09006517 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6518 if libfooShared.NotAvailableForPlatform() != true {
6519 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6520 }
6521 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6522 if libfooStatic.NotAvailableForPlatform() != false {
6523 t.Errorf("%q should be available to platform", libfooStatic.String())
6524 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006525}
6526
Jiyong Park5d790c32019-11-15 18:40:32 +09006527func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006528 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006529 apex {
6530 name: "myapex",
6531 key: "myapex.key",
6532 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006533 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006534 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006535 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006536 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006537 }
6538
6539 override_apex {
6540 name: "override_myapex",
6541 base: "myapex",
6542 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006543 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006544 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006545 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006546 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006547 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006548 key: "mynewapex.key",
6549 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006550 }
6551
6552 apex_key {
6553 name: "myapex.key",
6554 public_key: "testkey.avbpubkey",
6555 private_key: "testkey.pem",
6556 }
6557
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006558 apex_key {
6559 name: "mynewapex.key",
6560 public_key: "testkey2.avbpubkey",
6561 private_key: "testkey2.pem",
6562 }
6563
6564 android_app_certificate {
6565 name: "myapex.certificate",
6566 certificate: "testkey",
6567 }
6568
Jiyong Park5d790c32019-11-15 18:40:32 +09006569 android_app {
6570 name: "app",
6571 srcs: ["foo/bar/MyClass.java"],
6572 package_name: "foo",
6573 sdk_version: "none",
6574 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006575 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006576 }
6577
6578 override_android_app {
6579 name: "override_app",
6580 base: "app",
6581 package_name: "bar",
6582 }
markchien7c803b82021-08-26 22:10:06 +08006583
6584 bpf {
6585 name: "bpf",
6586 srcs: ["bpf.c"],
6587 }
6588
6589 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006590 name: "overrideBpf",
6591 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006592 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006593
6594 prebuilt_etc {
6595 name: "myetc",
6596 src: "myprebuilt",
6597 }
6598
6599 prebuilt_etc {
6600 name: "override_myetc",
6601 src: "override_myprebuilt",
6602 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006603 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006604
Jiyong Park317645e2019-12-05 13:20:58 +09006605 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6606 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6607 if originalVariant.GetOverriddenBy() != "" {
6608 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6609 }
6610 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6611 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6612 }
6613
Jiyong Park5d790c32019-11-15 18:40:32 +09006614 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6615 apexRule := module.Rule("apexRule")
6616 copyCmds := apexRule.Args["copy_commands"]
6617
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006618 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6619 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006620
markchien7c803b82021-08-26 22:10:06 +08006621 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006622 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006623
Daniel Norman5a3ce132021-08-26 15:44:43 -07006624 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6625 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6626
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006627 apexBundle := module.Module().(*apexBundle)
6628 name := apexBundle.Name()
6629 if name != "override_myapex" {
6630 t.Errorf("name should be \"override_myapex\", but was %q", name)
6631 }
6632
Baligh Uddin004d7172020-02-19 21:29:28 -08006633 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6634 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6635 }
6636
Jiyong Park20bacab2020-03-03 11:45:41 +09006637 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006638 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006639 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6640
6641 signApkRule := module.Rule("signapk")
6642 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006643
Colin Crossaa255532020-07-03 13:18:24 -07006644 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006645 var builder strings.Builder
6646 data.Custom(&builder, name, "TARGET_", "", data)
6647 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006648 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6649 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6650 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006651 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006652 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006653 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006654 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006655 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006656 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6657 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006658}
6659
Albert Martineefabcf2022-03-21 20:11:16 +00006660func TestMinSdkVersionOverride(t *testing.T) {
6661 // Override from 29 to 31
6662 minSdkOverride31 := "31"
6663 ctx := testApex(t, `
6664 apex {
6665 name: "myapex",
6666 key: "myapex.key",
6667 native_shared_libs: ["mylib"],
6668 updatable: true,
6669 min_sdk_version: "29"
6670 }
6671
6672 override_apex {
6673 name: "override_myapex",
6674 base: "myapex",
6675 logging_parent: "com.foo.bar",
6676 package_name: "test.overridden.package"
6677 }
6678
6679 apex_key {
6680 name: "myapex.key",
6681 public_key: "testkey.avbpubkey",
6682 private_key: "testkey.pem",
6683 }
6684
6685 cc_library {
6686 name: "mylib",
6687 srcs: ["mylib.cpp"],
6688 runtime_libs: ["libbar"],
6689 system_shared_libs: [],
6690 stl: "none",
6691 apex_available: [ "myapex" ],
6692 min_sdk_version: "apex_inherit"
6693 }
6694
6695 cc_library {
6696 name: "libbar",
6697 srcs: ["mylib.cpp"],
6698 system_shared_libs: [],
6699 stl: "none",
6700 apex_available: [ "myapex" ],
6701 min_sdk_version: "apex_inherit"
6702 }
6703
6704 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6705
6706 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6707 copyCmds := apexRule.Args["copy_commands"]
6708
6709 // Ensure that direct non-stubs dep is always included
6710 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6711
6712 // Ensure that runtime_libs dep in included
6713 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6714
6715 // Ensure libraries target overridden min_sdk_version value
6716 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6717}
6718
6719func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6720 // Attempt to override from 31 to 29, should be a NOOP
6721 minSdkOverride29 := "29"
6722 ctx := testApex(t, `
6723 apex {
6724 name: "myapex",
6725 key: "myapex.key",
6726 native_shared_libs: ["mylib"],
6727 updatable: true,
6728 min_sdk_version: "31"
6729 }
6730
6731 override_apex {
6732 name: "override_myapex",
6733 base: "myapex",
6734 logging_parent: "com.foo.bar",
6735 package_name: "test.overridden.package"
6736 }
6737
6738 apex_key {
6739 name: "myapex.key",
6740 public_key: "testkey.avbpubkey",
6741 private_key: "testkey.pem",
6742 }
6743
6744 cc_library {
6745 name: "mylib",
6746 srcs: ["mylib.cpp"],
6747 runtime_libs: ["libbar"],
6748 system_shared_libs: [],
6749 stl: "none",
6750 apex_available: [ "myapex" ],
6751 min_sdk_version: "apex_inherit"
6752 }
6753
6754 cc_library {
6755 name: "libbar",
6756 srcs: ["mylib.cpp"],
6757 system_shared_libs: [],
6758 stl: "none",
6759 apex_available: [ "myapex" ],
6760 min_sdk_version: "apex_inherit"
6761 }
6762
6763 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6764
6765 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6766 copyCmds := apexRule.Args["copy_commands"]
6767
6768 // Ensure that direct non-stubs dep is always included
6769 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6770
6771 // Ensure that runtime_libs dep in included
6772 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6773
6774 // Ensure libraries target the original min_sdk_version value rather than the overridden
6775 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6776}
6777
Jooyung Han214bf372019-11-12 13:03:50 +09006778func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006779 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006780 apex {
6781 name: "myapex",
6782 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006783 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006784 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006785 }
6786
6787 apex_key {
6788 name: "myapex.key",
6789 public_key: "testkey.avbpubkey",
6790 private_key: "testkey.pem",
6791 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006792
6793 cc_library {
6794 name: "mylib",
6795 srcs: ["mylib.cpp"],
6796 stl: "libc++",
6797 system_shared_libs: [],
6798 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006799 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006800 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006801 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006802
6803 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6804 args := module.Rule("apexRule").Args
6805 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006806 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006807
6808 // The copies of the libraries in the apex should have one more dependency than
6809 // the ones outside the apex, namely the unwinder. Ideally we should check
6810 // the dependency names directly here but for some reason the names are blank in
6811 // this test.
6812 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006813 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006814 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6815 if len(apexImplicits) != len(nonApexImplicits)+1 {
6816 t.Errorf("%q missing unwinder dep", lib)
6817 }
6818 }
Jooyung Han214bf372019-11-12 13:03:50 +09006819}
6820
Paul Duffine05480a2021-03-08 15:07:14 +00006821var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006822 "api/current.txt": nil,
6823 "api/removed.txt": nil,
6824 "api/system-current.txt": nil,
6825 "api/system-removed.txt": nil,
6826 "api/test-current.txt": nil,
6827 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006828
Anton Hanssondff2c782020-12-21 17:10:01 +00006829 "100/public/api/foo.txt": nil,
6830 "100/public/api/foo-removed.txt": nil,
6831 "100/system/api/foo.txt": nil,
6832 "100/system/api/foo-removed.txt": nil,
6833
Paul Duffineedc5d52020-06-12 17:46:39 +01006834 // For java_sdk_library_import
6835 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006836}
6837
Jooyung Han58f26ab2019-12-18 15:34:32 +09006838func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006839 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006840 apex {
6841 name: "myapex",
6842 key: "myapex.key",
6843 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006844 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006845 }
6846
6847 apex_key {
6848 name: "myapex.key",
6849 public_key: "testkey.avbpubkey",
6850 private_key: "testkey.pem",
6851 }
6852
6853 java_sdk_library {
6854 name: "foo",
6855 srcs: ["a.java"],
6856 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006857 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006858 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006859
6860 prebuilt_apis {
6861 name: "sdk",
6862 api_dirs: ["100"],
6863 }
Paul Duffin9b879592020-05-26 13:21:35 +01006864 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006865
6866 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006867 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006868 "javalib/foo.jar",
6869 "etc/permissions/foo.xml",
6870 })
6871 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006872 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006873 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 +09006874}
6875
Paul Duffin9b879592020-05-26 13:21:35 +01006876func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006877 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006878 apex {
6879 name: "myapex",
6880 key: "myapex.key",
6881 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006882 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006883 }
6884
6885 apex_key {
6886 name: "myapex.key",
6887 public_key: "testkey.avbpubkey",
6888 private_key: "testkey.pem",
6889 }
6890
6891 java_sdk_library {
6892 name: "foo",
6893 srcs: ["a.java"],
6894 api_packages: ["foo"],
6895 apex_available: ["myapex"],
6896 sdk_version: "none",
6897 system_modules: "none",
6898 }
6899
6900 java_library {
6901 name: "bar",
6902 srcs: ["a.java"],
6903 libs: ["foo"],
6904 apex_available: ["myapex"],
6905 sdk_version: "none",
6906 system_modules: "none",
6907 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006908
6909 prebuilt_apis {
6910 name: "sdk",
6911 api_dirs: ["100"],
6912 }
Paul Duffin9b879592020-05-26 13:21:35 +01006913 `, withFiles(filesForSdkLibrary))
6914
6915 // java_sdk_library installs both impl jar and permission XML
6916 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6917 "javalib/bar.jar",
6918 "javalib/foo.jar",
6919 "etc/permissions/foo.xml",
6920 })
6921
6922 // The bar library should depend on the implementation jar.
6923 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006924 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006925 t.Errorf("expected %q, found %#q", expected, actual)
6926 }
6927}
6928
6929func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006930 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006931 apex {
6932 name: "myapex",
6933 key: "myapex.key",
6934 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006935 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006936 }
6937
6938 apex_key {
6939 name: "myapex.key",
6940 public_key: "testkey.avbpubkey",
6941 private_key: "testkey.pem",
6942 }
6943
6944 java_sdk_library {
6945 name: "foo",
6946 srcs: ["a.java"],
6947 api_packages: ["foo"],
6948 apex_available: ["myapex"],
6949 sdk_version: "none",
6950 system_modules: "none",
6951 }
6952
6953 java_library {
6954 name: "bar",
6955 srcs: ["a.java"],
6956 libs: ["foo"],
6957 sdk_version: "none",
6958 system_modules: "none",
6959 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006960
6961 prebuilt_apis {
6962 name: "sdk",
6963 api_dirs: ["100"],
6964 }
Paul Duffin9b879592020-05-26 13:21:35 +01006965 `, withFiles(filesForSdkLibrary))
6966
6967 // java_sdk_library installs both impl jar and permission XML
6968 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6969 "javalib/foo.jar",
6970 "etc/permissions/foo.xml",
6971 })
6972
6973 // The bar library should depend on the stubs jar.
6974 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006975 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006976 t.Errorf("expected %q, found %#q", expected, actual)
6977 }
6978}
6979
Paul Duffineedc5d52020-06-12 17:46:39 +01006980func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006981 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006982 prebuilt_apis {
6983 name: "sdk",
6984 api_dirs: ["100"],
6985 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006986 withFiles(map[string][]byte{
6987 "apex/a.java": nil,
6988 "apex/apex_manifest.json": nil,
6989 "apex/Android.bp": []byte(`
6990 package {
6991 default_visibility: ["//visibility:private"],
6992 }
6993
6994 apex {
6995 name: "myapex",
6996 key: "myapex.key",
6997 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006998 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006999 }
7000
7001 apex_key {
7002 name: "myapex.key",
7003 public_key: "testkey.avbpubkey",
7004 private_key: "testkey.pem",
7005 }
7006
7007 java_library {
7008 name: "bar",
7009 srcs: ["a.java"],
7010 libs: ["foo"],
7011 apex_available: ["myapex"],
7012 sdk_version: "none",
7013 system_modules: "none",
7014 }
7015`),
7016 "source/a.java": nil,
7017 "source/api/current.txt": nil,
7018 "source/api/removed.txt": nil,
7019 "source/Android.bp": []byte(`
7020 package {
7021 default_visibility: ["//visibility:private"],
7022 }
7023
7024 java_sdk_library {
7025 name: "foo",
7026 visibility: ["//apex"],
7027 srcs: ["a.java"],
7028 api_packages: ["foo"],
7029 apex_available: ["myapex"],
7030 sdk_version: "none",
7031 system_modules: "none",
7032 public: {
7033 enabled: true,
7034 },
7035 }
7036`),
7037 "prebuilt/a.jar": nil,
7038 "prebuilt/Android.bp": []byte(`
7039 package {
7040 default_visibility: ["//visibility:private"],
7041 }
7042
7043 java_sdk_library_import {
7044 name: "foo",
7045 visibility: ["//apex", "//source"],
7046 apex_available: ["myapex"],
7047 prefer: true,
7048 public: {
7049 jars: ["a.jar"],
7050 },
7051 }
7052`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007053 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007054 )
7055
7056 // java_sdk_library installs both impl jar and permission XML
7057 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7058 "javalib/bar.jar",
7059 "javalib/foo.jar",
7060 "etc/permissions/foo.xml",
7061 })
7062
7063 // The bar library should depend on the implementation jar.
7064 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007065 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007066 t.Errorf("expected %q, found %#q", expected, actual)
7067 }
7068}
7069
7070func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7071 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7072 apex {
7073 name: "myapex",
7074 key: "myapex.key",
7075 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007076 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
7085 java_sdk_library_import {
7086 name: "foo",
7087 apex_available: ["myapex"],
7088 prefer: true,
7089 public: {
7090 jars: ["a.jar"],
7091 },
7092 }
7093
7094 `, withFiles(filesForSdkLibrary))
7095}
7096
atrost6e126252020-01-27 17:01:16 +00007097func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007098 result := android.GroupFixturePreparers(
7099 prepareForApexTest,
7100 java.PrepareForTestWithPlatformCompatConfig,
7101 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007102 apex {
7103 name: "myapex",
7104 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007105 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007106 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007107 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007108 }
7109
7110 apex_key {
7111 name: "myapex.key",
7112 public_key: "testkey.avbpubkey",
7113 private_key: "testkey.pem",
7114 }
7115
7116 platform_compat_config {
7117 name: "myjar-platform-compat-config",
7118 src: ":myjar",
7119 }
7120
7121 java_library {
7122 name: "myjar",
7123 srcs: ["foo/bar/MyClass.java"],
7124 sdk_version: "none",
7125 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007126 apex_available: [ "myapex" ],
7127 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007128
7129 // Make sure that a preferred prebuilt does not affect the apex contents.
7130 prebuilt_platform_compat_config {
7131 name: "myjar-platform-compat-config",
7132 metadata: "compat-config/metadata.xml",
7133 prefer: true,
7134 }
atrost6e126252020-01-27 17:01:16 +00007135 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007136 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7138 "etc/compatconfig/myjar-platform-compat-config.xml",
7139 "javalib/myjar.jar",
7140 })
7141}
7142
Jooyung Han862c0d62022-12-21 10:15:37 +09007143func TestNoDupeApexFiles(t *testing.T) {
7144 android.GroupFixturePreparers(
7145 android.PrepareForTestWithAndroidBuildComponents,
7146 PrepareForTestWithApexBuildComponents,
7147 prepareForTestWithMyapex,
7148 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7149 ).
7150 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7151 RunTestWithBp(t, `
7152 apex {
7153 name: "myapex",
7154 key: "myapex.key",
7155 prebuilts: ["foo", "bar"],
7156 updatable: false,
7157 }
7158
7159 apex_key {
7160 name: "myapex.key",
7161 public_key: "testkey.avbpubkey",
7162 private_key: "testkey.pem",
7163 }
7164
7165 prebuilt_etc {
7166 name: "foo",
7167 src: "myprebuilt",
7168 filename_from_src: true,
7169 }
7170
7171 prebuilt_etc {
7172 name: "bar",
7173 src: "myprebuilt",
7174 filename_from_src: true,
7175 }
7176 `)
7177}
7178
Jiyong Park479321d2019-12-16 11:47:12 +09007179func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7180 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7181 apex {
7182 name: "myapex",
7183 key: "myapex.key",
7184 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007185 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007186 }
7187
7188 apex_key {
7189 name: "myapex.key",
7190 public_key: "testkey.avbpubkey",
7191 private_key: "testkey.pem",
7192 }
7193
7194 java_library {
7195 name: "myjar",
7196 srcs: ["foo/bar/MyClass.java"],
7197 sdk_version: "none",
7198 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007199 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007200 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007201 }
7202 `)
7203}
7204
Jiyong Park7afd1072019-12-30 16:56:33 +09007205func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007206 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007207 apex {
7208 name: "myapex",
7209 key: "myapex.key",
7210 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007211 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007212 }
7213
7214 apex_key {
7215 name: "myapex.key",
7216 public_key: "testkey.avbpubkey",
7217 private_key: "testkey.pem",
7218 }
7219
7220 cc_library {
7221 name: "mylib",
7222 srcs: ["mylib.cpp"],
7223 system_shared_libs: [],
7224 stl: "none",
7225 required: ["a", "b"],
7226 host_required: ["c", "d"],
7227 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007228 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007229 }
7230 `)
7231
7232 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007233 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007234 name := apexBundle.BaseModuleName()
7235 prefix := "TARGET_"
7236 var builder strings.Builder
7237 data.Custom(&builder, name, prefix, "", data)
7238 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007239 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 -08007240 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7241 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007242}
7243
Jiyong Park7cd10e32020-01-14 09:22:18 +09007244func TestSymlinksFromApexToSystem(t *testing.T) {
7245 bp := `
7246 apex {
7247 name: "myapex",
7248 key: "myapex.key",
7249 native_shared_libs: ["mylib"],
7250 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007251 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007252 }
7253
Jiyong Park9d677202020-02-19 16:29:35 +09007254 apex {
7255 name: "myapex.updatable",
7256 key: "myapex.key",
7257 native_shared_libs: ["mylib"],
7258 java_libs: ["myjar"],
7259 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007260 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007261 }
7262
Jiyong Park7cd10e32020-01-14 09:22:18 +09007263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007272 shared_libs: [
7273 "myotherlib",
7274 "myotherlib_ext",
7275 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007276 system_shared_libs: [],
7277 stl: "none",
7278 apex_available: [
7279 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007280 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007281 "//apex_available:platform",
7282 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007283 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007284 }
7285
7286 cc_library {
7287 name: "myotherlib",
7288 srcs: ["mylib.cpp"],
7289 system_shared_libs: [],
7290 stl: "none",
7291 apex_available: [
7292 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007293 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007294 "//apex_available:platform",
7295 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007296 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007297 }
7298
Jiyong Parkce243632023-02-17 18:22:25 +09007299 cc_library {
7300 name: "myotherlib_ext",
7301 srcs: ["mylib.cpp"],
7302 system_shared_libs: [],
7303 system_ext_specific: true,
7304 stl: "none",
7305 apex_available: [
7306 "myapex",
7307 "myapex.updatable",
7308 "//apex_available:platform",
7309 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007310 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007311 }
7312
Jiyong Park7cd10e32020-01-14 09:22:18 +09007313 java_library {
7314 name: "myjar",
7315 srcs: ["foo/bar/MyClass.java"],
7316 sdk_version: "none",
7317 system_modules: "none",
7318 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007319 apex_available: [
7320 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007321 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007322 "//apex_available:platform",
7323 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007324 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007325 }
7326
7327 java_library {
7328 name: "myotherjar",
7329 srcs: ["foo/bar/MyClass.java"],
7330 sdk_version: "none",
7331 system_modules: "none",
7332 apex_available: [
7333 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007334 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007335 "//apex_available:platform",
7336 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007337 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007338 }
7339 `
7340
7341 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7342 for _, f := range files {
7343 if f.path == file {
7344 if f.isLink {
7345 t.Errorf("%q is not a real file", file)
7346 }
7347 return
7348 }
7349 }
7350 t.Errorf("%q is not found", file)
7351 }
7352
Jiyong Parkce243632023-02-17 18:22:25 +09007353 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007354 for _, f := range files {
7355 if f.path == file {
7356 if !f.isLink {
7357 t.Errorf("%q is not a symlink", file)
7358 }
Jiyong Parkce243632023-02-17 18:22:25 +09007359 if f.src != target {
7360 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7361 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007362 return
7363 }
7364 }
7365 t.Errorf("%q is not found", file)
7366 }
7367
Jiyong Park9d677202020-02-19 16:29:35 +09007368 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7369 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007370 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007371 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007372 ensureRealfileExists(t, files, "javalib/myjar.jar")
7373 ensureRealfileExists(t, files, "lib64/mylib.so")
7374 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007375 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007376
Jiyong Park9d677202020-02-19 16:29:35 +09007377 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7378 ensureRealfileExists(t, files, "javalib/myjar.jar")
7379 ensureRealfileExists(t, files, "lib64/mylib.so")
7380 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007381 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007382
7383 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007384 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007385 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007386 ensureRealfileExists(t, files, "javalib/myjar.jar")
7387 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007388 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7389 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007390
7391 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7392 ensureRealfileExists(t, files, "javalib/myjar.jar")
7393 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007394 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7395 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007396}
7397
Yo Chiange8128052020-07-23 20:09:18 +08007398func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007399 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007400 apex {
7401 name: "myapex",
7402 key: "myapex.key",
7403 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007404 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007405 }
7406
7407 apex_key {
7408 name: "myapex.key",
7409 public_key: "testkey.avbpubkey",
7410 private_key: "testkey.pem",
7411 }
7412
7413 cc_library_shared {
7414 name: "mylib",
7415 srcs: ["mylib.cpp"],
7416 shared_libs: ["myotherlib"],
7417 system_shared_libs: [],
7418 stl: "none",
7419 apex_available: [
7420 "myapex",
7421 "//apex_available:platform",
7422 ],
7423 }
7424
7425 cc_prebuilt_library_shared {
7426 name: "myotherlib",
7427 srcs: ["prebuilt.so"],
7428 system_shared_libs: [],
7429 stl: "none",
7430 apex_available: [
7431 "myapex",
7432 "//apex_available:platform",
7433 ],
7434 }
7435 `)
7436
Prerana Patilb1896c82022-11-09 18:14:34 +00007437 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007438 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007439 var builder strings.Builder
7440 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7441 androidMk := builder.String()
7442 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007443 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007444 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7445 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7446 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007447 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 +08007448}
7449
Jooyung Han643adc42020-02-27 13:50:06 +09007450func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007451 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007452 apex {
7453 name: "myapex",
7454 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007455 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007456 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007457 }
7458
7459 apex_key {
7460 name: "myapex.key",
7461 public_key: "testkey.avbpubkey",
7462 private_key: "testkey.pem",
7463 }
7464
7465 cc_library {
7466 name: "mylib",
7467 srcs: ["mylib.cpp"],
7468 shared_libs: ["mylib2"],
7469 system_shared_libs: [],
7470 stl: "none",
7471 apex_available: [ "myapex" ],
7472 }
7473
7474 cc_library {
7475 name: "mylib2",
7476 srcs: ["mylib.cpp"],
7477 system_shared_libs: [],
7478 stl: "none",
7479 apex_available: [ "myapex" ],
7480 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007481
7482 rust_ffi_shared {
7483 name: "libfoo.rust",
7484 crate_name: "foo",
7485 srcs: ["foo.rs"],
7486 shared_libs: ["libfoo.shared_from_rust"],
7487 prefer_rlib: true,
7488 apex_available: ["myapex"],
7489 }
7490
7491 cc_library_shared {
7492 name: "libfoo.shared_from_rust",
7493 srcs: ["mylib.cpp"],
7494 system_shared_libs: [],
7495 stl: "none",
7496 stubs: {
7497 versions: ["10", "11", "12"],
7498 },
7499 }
7500
Jooyung Han643adc42020-02-27 13:50:06 +09007501 `)
7502
7503 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7504 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007505 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007506 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7507 "lib64/mylib.so",
7508 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007509 "lib64/libfoo.rust.so",
7510 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7511 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007512 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007513
7514 // b/220397949
7515 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007516}
7517
Jooyung Han49f67012020-04-17 13:43:10 +09007518func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007519 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007520 apex {
7521 name: "myapex",
7522 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007523 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007524 }
7525 apex_key {
7526 name: "myapex.key",
7527 public_key: "testkey.avbpubkey",
7528 private_key: "testkey.pem",
7529 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007530 `,
7531 android.FixtureModifyConfig(func(config android.Config) {
7532 delete(config.Targets, android.Android)
7533 config.AndroidCommonTarget = android.Target{}
7534 }),
7535 )
Jooyung Han49f67012020-04-17 13:43:10 +09007536
7537 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7538 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7539 }
7540}
7541
Jiyong Parkbd159612020-02-28 15:22:21 +09007542func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007543 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007544 apex {
7545 name: "myapex",
7546 key: "myapex.key",
7547 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007548 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007549 }
7550
7551 apex_key {
7552 name: "myapex.key",
7553 public_key: "testkey.avbpubkey",
7554 private_key: "testkey.pem",
7555 }
7556
7557 android_app {
7558 name: "AppFoo",
7559 srcs: ["foo/bar/MyClass.java"],
7560 sdk_version: "none",
7561 system_modules: "none",
7562 apex_available: [ "myapex" ],
7563 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007564 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007565
Colin Crosscf371cc2020-11-13 11:48:42 -08007566 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007567 content := bundleConfigRule.Args["content"]
7568
7569 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007570 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 +09007571}
7572
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007573func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007574 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007575 apex {
7576 name: "myapex",
7577 key: "myapex.key",
7578 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007579 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007580 }
7581
7582 apex_key {
7583 name: "myapex.key",
7584 public_key: "testkey.avbpubkey",
7585 private_key: "testkey.pem",
7586 }
7587
7588 android_app_set {
7589 name: "AppSet",
7590 set: "AppSet.apks",
7591 }`)
7592 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007593 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007594 content := bundleConfigRule.Args["content"]
7595 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7596 s := mod.Rule("apexRule").Args["copy_commands"]
7597 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007598 if len(copyCmds) != 4 {
7599 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007600 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007601 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7602 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007603 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7604 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007605
7606 // Ensure that canned_fs_config has an entry for the app set zip file
7607 generateFsRule := mod.Rule("generateFsConfig")
7608 cmd := generateFsRule.RuleParams.Command
7609 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007610}
7611
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007612func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007613 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007614 apex_set {
7615 name: "myapex",
7616 filename: "foo_v2.apex",
7617 sanitized: {
7618 none: { set: "myapex.apks", },
7619 hwaddress: { set: "myapex.hwasan.apks", },
7620 },
Paul Duffin24704672021-04-06 16:09:30 +01007621 }
7622 `
7623 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007624
Paul Duffin24704672021-04-06 16:09:30 +01007625 // Check that the extractor produces the correct output file from the correct input file.
7626 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007627
Paul Duffin24704672021-04-06 16:09:30 +01007628 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7629 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007630
Paul Duffin24704672021-04-06 16:09:30 +01007631 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7632
7633 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007634 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7635 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007636
7637 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007638}
7639
Pranav Guptaeba03b02022-09-27 00:27:08 +00007640func TestApexSetApksModuleAssignment(t *testing.T) {
7641 ctx := testApex(t, `
7642 apex_set {
7643 name: "myapex",
7644 set: ":myapex_apks_file",
7645 }
7646
7647 filegroup {
7648 name: "myapex_apks_file",
7649 srcs: ["myapex.apks"],
7650 }
7651 `)
7652
7653 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7654
7655 // Check that the extractor produces the correct apks file from the input module
7656 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7657 extractedApex := m.Output(extractorOutput)
7658
7659 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7660}
7661
Paul Duffin89f570a2021-06-16 01:42:33 +01007662func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007663 t.Helper()
7664
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007665 bp := `
7666 java_library {
7667 name: "some-updatable-apex-lib",
7668 srcs: ["a.java"],
7669 sdk_version: "current",
7670 apex_available: [
7671 "some-updatable-apex",
7672 ],
satayevabcd5972021-08-06 17:49:46 +01007673 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007674 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007675 }
7676
7677 java_library {
7678 name: "some-non-updatable-apex-lib",
7679 srcs: ["a.java"],
7680 apex_available: [
7681 "some-non-updatable-apex",
7682 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007683 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007684 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007685 }
7686
7687 bootclasspath_fragment {
7688 name: "some-non-updatable-fragment",
7689 contents: ["some-non-updatable-apex-lib"],
7690 apex_available: [
7691 "some-non-updatable-apex",
7692 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007693 hidden_api: {
7694 split_packages: ["*"],
7695 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007696 }
7697
7698 java_library {
7699 name: "some-platform-lib",
7700 srcs: ["a.java"],
7701 sdk_version: "current",
7702 installable: true,
7703 }
7704
7705 java_library {
7706 name: "some-art-lib",
7707 srcs: ["a.java"],
7708 sdk_version: "current",
7709 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007710 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007711 ],
7712 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007713 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007714 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007715 }
7716
7717 apex {
7718 name: "some-updatable-apex",
7719 key: "some-updatable-apex.key",
7720 java_libs: ["some-updatable-apex-lib"],
7721 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007722 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007723 }
7724
7725 apex {
7726 name: "some-non-updatable-apex",
7727 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007728 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007729 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007730 }
7731
7732 apex_key {
7733 name: "some-updatable-apex.key",
7734 }
7735
7736 apex_key {
7737 name: "some-non-updatable-apex.key",
7738 }
7739
7740 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007741 name: "com.android.art.debug",
7742 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007743 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007744 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007745 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007746 }
7747
Paul Duffinf23bc472021-04-27 12:42:20 +01007748 bootclasspath_fragment {
7749 name: "art-bootclasspath-fragment",
7750 image_name: "art",
7751 contents: ["some-art-lib"],
7752 apex_available: [
7753 "com.android.art.debug",
7754 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007755 hidden_api: {
7756 split_packages: ["*"],
7757 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007758 }
7759
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007760 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007761 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007762 }
7763
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007764 filegroup {
7765 name: "some-updatable-apex-file_contexts",
7766 srcs: [
7767 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7768 ],
7769 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007770
7771 filegroup {
7772 name: "some-non-updatable-apex-file_contexts",
7773 srcs: [
7774 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7775 ],
7776 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007777 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007778
Paul Duffin89f570a2021-06-16 01:42:33 +01007779 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007780}
7781
Paul Duffin89f570a2021-06-16 01:42:33 +01007782func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007783 t.Helper()
7784
Paul Duffin55607122021-03-30 23:32:51 +01007785 fs := android.MockFS{
7786 "a.java": nil,
7787 "a.jar": nil,
7788 "apex_manifest.json": nil,
7789 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007790 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007791 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7792 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7793 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007794 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007795 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007796
Paul Duffin55607122021-03-30 23:32:51 +01007797 errorHandler := android.FixtureExpectsNoErrors
7798 if errmsg != "" {
7799 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007800 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007801
Paul Duffin55607122021-03-30 23:32:51 +01007802 result := android.GroupFixturePreparers(
7803 cc.PrepareForTestWithCcDefaultModules,
7804 java.PrepareForTestWithHiddenApiBuildComponents,
7805 java.PrepareForTestWithJavaDefaultModules,
7806 java.PrepareForTestWithJavaSdkLibraryFiles,
7807 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007808 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007809 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007810 android.FixtureModifyMockFS(func(fs android.MockFS) {
7811 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7812 insert := ""
7813 for _, fragment := range fragments {
7814 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7815 }
7816 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7817 platform_bootclasspath {
7818 name: "platform-bootclasspath",
7819 fragments: [
7820 %s
7821 ],
7822 }
7823 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007824 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007825 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007826 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007827 ).
7828 ExtendWithErrorHandler(errorHandler).
7829 RunTestWithBp(t, bp)
7830
7831 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007832}
7833
Paul Duffin5556c5f2022-06-09 17:32:21 +00007834func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007835 preparers := android.GroupFixturePreparers(
7836 java.PrepareForTestWithJavaDefaultModules,
7837 PrepareForTestWithApexBuildComponents,
7838 ).
7839 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7840 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7841
7842 bpBase := `
7843 apex_set {
7844 name: "com.android.myapex",
7845 installable: true,
7846 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7847 set: "myapex.apks",
7848 }
7849
7850 apex_set {
7851 name: "com.mycompany.android.myapex",
7852 apex_name: "com.android.myapex",
7853 installable: true,
7854 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7855 set: "company-myapex.apks",
7856 }
7857
7858 prebuilt_bootclasspath_fragment {
7859 name: "my-bootclasspath-fragment",
7860 apex_available: ["com.android.myapex"],
7861 %s
7862 }
7863 `
7864
7865 t.Run("java_import", func(t *testing.T) {
7866 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7867 java_import {
7868 name: "libfoo",
7869 jars: ["libfoo.jar"],
7870 apex_available: ["com.android.myapex"],
7871 }
7872 `)
7873 })
7874
7875 t.Run("java_sdk_library_import", func(t *testing.T) {
7876 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7877 java_sdk_library_import {
7878 name: "libfoo",
7879 public: {
7880 jars: ["libbar.jar"],
7881 },
7882 apex_available: ["com.android.myapex"],
7883 }
7884 `)
7885 })
7886
7887 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7888 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7889 image_name: "art",
7890 contents: ["libfoo"],
7891 `)+`
7892 java_sdk_library_import {
7893 name: "libfoo",
7894 public: {
7895 jars: ["libbar.jar"],
7896 },
7897 apex_available: ["com.android.myapex"],
7898 }
7899 `)
7900 })
7901}
7902
Paul Duffin5556c5f2022-06-09 17:32:21 +00007903func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7904 preparers := android.GroupFixturePreparers(
7905 java.PrepareForTestWithJavaDefaultModules,
7906 PrepareForTestWithApexBuildComponents,
7907 )
7908
7909 bpBase := `
7910 apex_set {
7911 name: "com.android.myapex",
7912 installable: true,
7913 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7914 set: "myapex.apks",
7915 }
7916
7917 apex_set {
7918 name: "com.android.myapex_compressed",
7919 apex_name: "com.android.myapex",
7920 installable: true,
7921 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7922 set: "myapex_compressed.apks",
7923 }
7924
7925 prebuilt_bootclasspath_fragment {
7926 name: "my-bootclasspath-fragment",
7927 apex_available: [
7928 "com.android.myapex",
7929 "com.android.myapex_compressed",
7930 ],
7931 hidden_api: {
7932 annotation_flags: "annotation-flags.csv",
7933 metadata: "metadata.csv",
7934 index: "index.csv",
7935 signature_patterns: "signature_patterns.csv",
7936 },
7937 %s
7938 }
7939 `
7940
7941 t.Run("java_import", func(t *testing.T) {
7942 result := preparers.RunTestWithBp(t,
7943 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7944 java_import {
7945 name: "libfoo",
7946 jars: ["libfoo.jar"],
7947 apex_available: [
7948 "com.android.myapex",
7949 "com.android.myapex_compressed",
7950 ],
7951 }
7952 `)
7953
7954 module := result.Module("libfoo", "android_common_com.android.myapex")
7955 usesLibraryDep := module.(java.UsesLibraryDependency)
7956 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7957 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7958 usesLibraryDep.DexJarBuildPath().Path())
7959 })
7960
7961 t.Run("java_sdk_library_import", func(t *testing.T) {
7962 result := preparers.RunTestWithBp(t,
7963 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7964 java_sdk_library_import {
7965 name: "libfoo",
7966 public: {
7967 jars: ["libbar.jar"],
7968 },
7969 apex_available: [
7970 "com.android.myapex",
7971 "com.android.myapex_compressed",
7972 ],
7973 compile_dex: true,
7974 }
7975 `)
7976
7977 module := result.Module("libfoo", "android_common_com.android.myapex")
7978 usesLibraryDep := module.(java.UsesLibraryDependency)
7979 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7980 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7981 usesLibraryDep.DexJarBuildPath().Path())
7982 })
7983
7984 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7985 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7986 image_name: "art",
7987 contents: ["libfoo"],
7988 `)+`
7989 java_sdk_library_import {
7990 name: "libfoo",
7991 public: {
7992 jars: ["libbar.jar"],
7993 },
7994 apex_available: [
7995 "com.android.myapex",
7996 "com.android.myapex_compressed",
7997 ],
7998 compile_dex: true,
7999 }
8000 `)
8001 })
8002}
8003
Jooyung Han548640b2020-04-27 12:10:30 +09008004func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8005 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8006 apex {
8007 name: "myapex",
8008 key: "myapex.key",
8009 updatable: true,
8010 }
8011
8012 apex_key {
8013 name: "myapex.key",
8014 public_key: "testkey.avbpubkey",
8015 private_key: "testkey.pem",
8016 }
8017 `)
8018}
8019
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008020func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8021 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8022 apex {
8023 name: "myapex",
8024 key: "myapex.key",
8025 }
8026
8027 apex_key {
8028 name: "myapex.key",
8029 public_key: "testkey.avbpubkey",
8030 private_key: "testkey.pem",
8031 }
8032 `)
8033}
8034
Jooyung Handfc864c2023-03-20 18:19:07 +09008035func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8036 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008037 apex {
8038 name: "myapex",
8039 key: "myapex.key",
8040 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008041 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008042 soc_specific: true,
8043 }
8044
8045 apex_key {
8046 name: "myapex.key",
8047 public_key: "testkey.avbpubkey",
8048 private_key: "testkey.pem",
8049 }
8050 `)
8051}
8052
Jooyung Han02873da2023-03-22 17:41:03 +09008053func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8054 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8055 apex {
8056 name: "myapex",
8057 key: "myapex.key",
8058 updatable: false,
8059 min_sdk_version: "29",
8060 use_vndk_as_stable: true,
8061 vendor: true,
8062 }
8063
8064 apex_key {
8065 name: "myapex.key",
8066 public_key: "testkey.avbpubkey",
8067 private_key: "testkey.pem",
8068 }
8069 `)
8070}
8071
Jooyung Handfc864c2023-03-20 18:19:07 +09008072func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8073 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8074 apex {
8075 name: "myapex",
8076 key: "myapex.key",
8077 updatable: false,
8078 use_vndk_as_stable: true,
8079 }
8080
8081 apex_key {
8082 name: "myapex.key",
8083 public_key: "testkey.avbpubkey",
8084 private_key: "testkey.pem",
8085 }
8086 `)
8087}
8088
satayevb98371c2021-06-15 16:49:50 +01008089func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8090 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8091 apex {
8092 name: "myapex",
8093 key: "myapex.key",
8094 systemserverclasspath_fragments: [
8095 "mysystemserverclasspathfragment",
8096 ],
8097 min_sdk_version: "29",
8098 updatable: true,
8099 }
8100
8101 apex_key {
8102 name: "myapex.key",
8103 public_key: "testkey.avbpubkey",
8104 private_key: "testkey.pem",
8105 }
8106
8107 java_library {
8108 name: "foo",
8109 srcs: ["b.java"],
8110 min_sdk_version: "29",
8111 installable: true,
8112 apex_available: [
8113 "myapex",
8114 ],
8115 }
8116
8117 systemserverclasspath_fragment {
8118 name: "mysystemserverclasspathfragment",
8119 generate_classpaths_proto: false,
8120 contents: [
8121 "foo",
8122 ],
8123 apex_available: [
8124 "myapex",
8125 ],
8126 }
satayevabcd5972021-08-06 17:49:46 +01008127 `,
8128 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8129 )
satayevb98371c2021-06-15 16:49:50 +01008130}
8131
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008132func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008133 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8134 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8135 // modules to be included in the BootJars.
8136 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8137 return android.GroupFixturePreparers(
8138 dexpreopt.FixtureSetBootJars(bootJars...),
8139 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8140 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8141 }),
8142 )
8143 }
8144
8145 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8146 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8147 // specified in the ArtApexJars configuration.
8148 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8149 return android.GroupFixturePreparers(
8150 dexpreopt.FixtureSetArtBootJars(bootJars...),
8151 dexpreopt.FixtureSetBootJars(bootJars...),
8152 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8153 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8154 }),
8155 )
8156 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008157
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008158 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008159 preparer := android.GroupFixturePreparers(
8160 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8161 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8162 )
8163 fragments := []java.ApexVariantReference{
8164 {
8165 Apex: proptools.StringPtr("com.android.art.debug"),
8166 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8167 },
8168 {
8169 Apex: proptools.StringPtr("some-non-updatable-apex"),
8170 Module: proptools.StringPtr("some-non-updatable-fragment"),
8171 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008172 }
satayevabcd5972021-08-06 17:49:46 +01008173 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008174 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008175
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008176 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008177 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8178 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008179 preparer := android.GroupFixturePreparers(
8180 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8181 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8182 )
Paul Duffin60264a02021-04-12 20:02:36 +01008183 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008184 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008185
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008186 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 +01008187 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 +01008188 // Update the dexpreopt ArtApexJars directly.
8189 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8190 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008191 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008192
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008193 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 +01008194 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 +01008195 // Update the dexpreopt ArtApexJars directly.
8196 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8197 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008198 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008199
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008200 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 +01008201 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 +01008202 preparer := android.GroupFixturePreparers(
8203 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8204 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8205 )
Paul Duffin60264a02021-04-12 20:02:36 +01008206 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008207 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008208
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008209 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 +01008210 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008211 fragment := java.ApexVariantReference{
8212 Apex: proptools.StringPtr("some-non-updatable-apex"),
8213 Module: proptools.StringPtr("some-non-updatable-fragment"),
8214 }
8215 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008216 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008217
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008218 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008219 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008220 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8221 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008222 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008223
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008224 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008225 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008226 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8227 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008228 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008229
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008230 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008231 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008232 // Update the dexpreopt ArtApexJars directly.
8233 preparer := prepareSetArtJars("platform:some-platform-lib")
8234 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008235 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008236
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008237 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008238 preparer := android.GroupFixturePreparers(
8239 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8240 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8241 )
8242 fragments := []java.ApexVariantReference{
8243 {
8244 Apex: proptools.StringPtr("some-non-updatable-apex"),
8245 Module: proptools.StringPtr("some-non-updatable-fragment"),
8246 },
8247 }
8248 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008249 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008250}
8251
8252func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008253 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008254 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008255 fragment := java.ApexVariantReference{
8256 Apex: proptools.StringPtr("myapex"),
8257 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8258 }
8259
Paul Duffin064b70c2020-11-02 17:32:38 +00008260 testDexpreoptWithApexes(t, `
8261 prebuilt_apex {
8262 name: "myapex" ,
8263 arch: {
8264 arm64: {
8265 src: "myapex-arm64.apex",
8266 },
8267 arm: {
8268 src: "myapex-arm.apex",
8269 },
8270 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008271 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8272 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008273
Paul Duffin89f570a2021-06-16 01:42:33 +01008274 prebuilt_bootclasspath_fragment {
8275 name: "my-bootclasspath-fragment",
8276 contents: ["libfoo"],
8277 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008278 hidden_api: {
8279 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8280 metadata: "my-bootclasspath-fragment/metadata.csv",
8281 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008282 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8283 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8284 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008285 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008286 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008287
Paul Duffin89f570a2021-06-16 01:42:33 +01008288 java_import {
8289 name: "libfoo",
8290 jars: ["libfoo.jar"],
8291 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008292 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008293 }
8294 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008295 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008296}
8297
Spandan Dasf14e2542021-11-12 00:01:37 +00008298func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008299 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008300 bp += `
8301 apex_key {
8302 name: "myapex.key",
8303 public_key: "testkey.avbpubkey",
8304 private_key: "testkey.pem",
8305 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008306 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008307 "lib1/src/A.java": nil,
8308 "lib2/src/B.java": nil,
8309 "system/sepolicy/apex/myapex-file_contexts": nil,
8310 }
8311
Paul Duffin45338f02021-03-30 23:07:52 +01008312 errorHandler := android.FixtureExpectsNoErrors
8313 if errmsg != "" {
8314 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008315 }
Colin Crossae8600b2020-10-29 17:09:13 -07008316
Paul Duffin45338f02021-03-30 23:07:52 +01008317 android.GroupFixturePreparers(
8318 android.PrepareForTestWithAndroidBuildComponents,
8319 java.PrepareForTestWithJavaBuildComponents,
8320 PrepareForTestWithApexBuildComponents,
8321 android.PrepareForTestWithNeverallowRules(rules),
8322 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008323 apexBootJars := make([]string, 0, len(bootJars))
8324 for _, apexBootJar := range bootJars {
8325 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008326 }
satayevd604b212021-07-21 14:23:52 +01008327 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008328 }),
8329 fs.AddToFixture(),
8330 ).
8331 ExtendWithErrorHandler(errorHandler).
8332 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008333}
8334
8335func TestApexPermittedPackagesRules(t *testing.T) {
8336 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008337 name string
8338 expectedError string
8339 bp string
8340 bootJars []string
8341 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008342 }{
8343
8344 {
8345 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8346 expectedError: "",
8347 bp: `
8348 java_library {
8349 name: "bcp_lib1",
8350 srcs: ["lib1/src/*.java"],
8351 permitted_packages: ["foo.bar"],
8352 apex_available: ["myapex"],
8353 sdk_version: "none",
8354 system_modules: "none",
8355 }
8356 java_library {
8357 name: "nonbcp_lib2",
8358 srcs: ["lib2/src/*.java"],
8359 apex_available: ["myapex"],
8360 permitted_packages: ["a.b"],
8361 sdk_version: "none",
8362 system_modules: "none",
8363 }
8364 apex {
8365 name: "myapex",
8366 key: "myapex.key",
8367 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008368 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008369 }`,
8370 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008371 bcpPermittedPackages: map[string][]string{
8372 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008373 "foo.bar",
8374 },
8375 },
8376 },
8377 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008378 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008379 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 +01008380 bp: `
8381 java_library {
8382 name: "bcp_lib1",
8383 srcs: ["lib1/src/*.java"],
8384 apex_available: ["myapex"],
8385 permitted_packages: ["foo.bar"],
8386 sdk_version: "none",
8387 system_modules: "none",
8388 }
8389 java_library {
8390 name: "bcp_lib2",
8391 srcs: ["lib2/src/*.java"],
8392 apex_available: ["myapex"],
8393 permitted_packages: ["foo.bar", "bar.baz"],
8394 sdk_version: "none",
8395 system_modules: "none",
8396 }
8397 apex {
8398 name: "myapex",
8399 key: "myapex.key",
8400 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008401 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008402 }
8403 `,
8404 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008405 bcpPermittedPackages: map[string][]string{
8406 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008407 "foo.bar",
8408 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008409 "bcp_lib2": []string{
8410 "foo.bar",
8411 },
8412 },
8413 },
8414 {
8415 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8416 expectedError: "",
8417 bp: `
8418 java_library {
8419 name: "bcp_lib_restricted",
8420 srcs: ["lib1/src/*.java"],
8421 apex_available: ["myapex"],
8422 permitted_packages: ["foo.bar"],
8423 sdk_version: "none",
8424 min_sdk_version: "29",
8425 system_modules: "none",
8426 }
8427 java_library {
8428 name: "bcp_lib_unrestricted",
8429 srcs: ["lib2/src/*.java"],
8430 apex_available: ["myapex"],
8431 permitted_packages: ["foo.bar", "bar.baz"],
8432 sdk_version: "none",
8433 min_sdk_version: "29",
8434 system_modules: "none",
8435 }
8436 apex {
8437 name: "myapex",
8438 key: "myapex.key",
8439 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8440 updatable: true,
8441 min_sdk_version: "29",
8442 }
8443 `,
8444 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8445 bcpPermittedPackages: map[string][]string{
8446 "bcp_lib1_non_updateable": []string{
8447 "foo.bar",
8448 },
8449 // 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 +01008450 },
8451 },
8452 }
8453 for _, tc := range testcases {
8454 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008455 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8456 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008457 })
8458 }
8459}
8460
Jiyong Park62304bb2020-04-13 16:19:48 +09008461func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008462 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008463 apex {
8464 name: "myapex",
8465 key: "myapex.key",
8466 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008467 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008468 }
8469
8470 apex_key {
8471 name: "myapex.key",
8472 public_key: "testkey.avbpubkey",
8473 private_key: "testkey.pem",
8474 }
8475
8476 cc_library {
8477 name: "mylib",
8478 srcs: ["mylib.cpp"],
8479 system_shared_libs: [],
8480 stl: "none",
8481 stubs: {
8482 versions: ["1"],
8483 },
8484 apex_available: ["myapex"],
8485 }
8486
8487 cc_library {
8488 name: "myprivlib",
8489 srcs: ["mylib.cpp"],
8490 system_shared_libs: [],
8491 stl: "none",
8492 apex_available: ["myapex"],
8493 }
8494
8495
8496 cc_test {
8497 name: "mytest",
8498 gtest: false,
8499 srcs: ["mylib.cpp"],
8500 system_shared_libs: [],
8501 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008502 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008503 test_for: ["myapex"]
8504 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008505
8506 cc_library {
8507 name: "mytestlib",
8508 srcs: ["mylib.cpp"],
8509 system_shared_libs: [],
8510 shared_libs: ["mylib", "myprivlib"],
8511 stl: "none",
8512 test_for: ["myapex"],
8513 }
8514
8515 cc_benchmark {
8516 name: "mybench",
8517 srcs: ["mylib.cpp"],
8518 system_shared_libs: [],
8519 shared_libs: ["mylib", "myprivlib"],
8520 stl: "none",
8521 test_for: ["myapex"],
8522 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008523 `)
8524
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008525 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008526 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008527 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8528 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8529 }
8530
8531 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008532 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008533 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8534 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8535 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8536}
Jiyong Park46a512f2020-12-04 18:02:13 +09008537
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008538func TestIndirectTestFor(t *testing.T) {
8539 ctx := testApex(t, `
8540 apex {
8541 name: "myapex",
8542 key: "myapex.key",
8543 native_shared_libs: ["mylib", "myprivlib"],
8544 updatable: false,
8545 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008546
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008547 apex_key {
8548 name: "myapex.key",
8549 public_key: "testkey.avbpubkey",
8550 private_key: "testkey.pem",
8551 }
8552
8553 cc_library {
8554 name: "mylib",
8555 srcs: ["mylib.cpp"],
8556 system_shared_libs: [],
8557 stl: "none",
8558 stubs: {
8559 versions: ["1"],
8560 },
8561 apex_available: ["myapex"],
8562 }
8563
8564 cc_library {
8565 name: "myprivlib",
8566 srcs: ["mylib.cpp"],
8567 system_shared_libs: [],
8568 stl: "none",
8569 shared_libs: ["mylib"],
8570 apex_available: ["myapex"],
8571 }
8572
8573 cc_library {
8574 name: "mytestlib",
8575 srcs: ["mylib.cpp"],
8576 system_shared_libs: [],
8577 shared_libs: ["myprivlib"],
8578 stl: "none",
8579 test_for: ["myapex"],
8580 }
8581 `)
8582
8583 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008584 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008585 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8586 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8587 }
8588
8589 // The platform variant of mytestlib links to the platform variant of the
8590 // internal myprivlib.
8591 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8592
8593 // The platform variant of myprivlib links to the platform variant of mylib
8594 // and bypasses its stubs.
8595 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 +09008596}
8597
Martin Stjernholmec009002021-03-27 15:18:31 +00008598func TestTestForForLibInOtherApex(t *testing.T) {
8599 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8600 _ = testApex(t, `
8601 apex {
8602 name: "com.android.art",
8603 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008604 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008605 updatable: false,
8606 }
8607
8608 apex {
8609 name: "com.android.art.debug",
8610 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008611 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008612 updatable: false,
8613 }
8614
8615 apex_key {
8616 name: "myapex.key",
8617 public_key: "testkey.avbpubkey",
8618 private_key: "testkey.pem",
8619 }
8620
8621 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008622 name: "libnativebridge",
8623 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008624 system_shared_libs: [],
8625 stl: "none",
8626 stubs: {
8627 versions: ["1"],
8628 },
8629 apex_available: ["com.android.art", "com.android.art.debug"],
8630 }
8631
8632 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008633 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008634 srcs: ["mylib.cpp"],
8635 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008636 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008637 stl: "none",
8638 apex_available: ["com.android.art.debug"],
8639 test_for: ["com.android.art"],
8640 }
8641 `,
8642 android.MockFS{
8643 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8644 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8645 }.AddToFixture())
8646}
8647
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008648// TODO(jungjw): Move this to proptools
8649func intPtr(i int) *int {
8650 return &i
8651}
8652
8653func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008654 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008655 apex_set {
8656 name: "myapex",
8657 set: "myapex.apks",
8658 filename: "foo_v2.apex",
8659 overrides: ["foo"],
8660 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008661 `,
8662 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8663 variables.Platform_sdk_version = intPtr(30)
8664 }),
8665 android.FixtureModifyConfig(func(config android.Config) {
8666 config.Targets[android.Android] = []android.Target{
8667 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8668 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8669 }
8670 }),
8671 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008672
Paul Duffin24704672021-04-06 16:09:30 +01008673 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008674
8675 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008676 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008677 actual := extractedApex.Args["abis"]
8678 expected := "ARMEABI_V7A,ARM64_V8A"
8679 if actual != expected {
8680 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8681 }
8682 actual = extractedApex.Args["sdk-version"]
8683 expected = "30"
8684 if actual != expected {
8685 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8686 }
8687
Paul Duffin6717d882021-06-15 19:09:41 +01008688 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008689 a := m.Module().(*ApexSet)
8690 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008691 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008692 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8693 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8694 }
8695}
8696
Anton Hansson805e0a52022-11-25 14:06:46 +00008697func TestApexSet_NativeBridge(t *testing.T) {
8698 ctx := testApex(t, `
8699 apex_set {
8700 name: "myapex",
8701 set: "myapex.apks",
8702 filename: "foo_v2.apex",
8703 overrides: ["foo"],
8704 }
8705 `,
8706 android.FixtureModifyConfig(func(config android.Config) {
8707 config.Targets[android.Android] = []android.Target{
8708 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8709 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8710 }
8711 }),
8712 )
8713
8714 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8715
8716 // Check extract_apks tool parameters. No native bridge arch expected
8717 extractedApex := m.Output("extracted/myapex.apks")
8718 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8719}
8720
Jiyong Park7d95a512020-05-10 15:16:24 +09008721func TestNoStaticLinkingToStubsLib(t *testing.T) {
8722 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8723 apex {
8724 name: "myapex",
8725 key: "myapex.key",
8726 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008727 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008728 }
8729
8730 apex_key {
8731 name: "myapex.key",
8732 public_key: "testkey.avbpubkey",
8733 private_key: "testkey.pem",
8734 }
8735
8736 cc_library {
8737 name: "mylib",
8738 srcs: ["mylib.cpp"],
8739 static_libs: ["otherlib"],
8740 system_shared_libs: [],
8741 stl: "none",
8742 apex_available: [ "myapex" ],
8743 }
8744
8745 cc_library {
8746 name: "otherlib",
8747 srcs: ["mylib.cpp"],
8748 system_shared_libs: [],
8749 stl: "none",
8750 stubs: {
8751 versions: ["1", "2", "3"],
8752 },
8753 apex_available: [ "myapex" ],
8754 }
8755 `)
8756}
8757
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008758func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008759 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008760 apex {
8761 name: "myapex",
8762 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008763 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008764 custom_sign_tool: "sign_myapex",
8765 }
8766
8767 apex_key {
8768 name: "myapex.key",
8769 public_key: "testkey.avbpubkey",
8770 private_key: "testkey.pem",
8771 }
8772 `)
8773
8774 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8775 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8776 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"`)
8777}
8778
8779func TestApexKeysTxtOverrides(t *testing.T) {
8780 ctx := testApex(t, `
8781 apex {
8782 name: "myapex",
8783 key: "myapex.key",
8784 updatable: false,
8785 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008786 }
8787
8788 apex_key {
8789 name: "myapex.key",
8790 public_key: "testkey.avbpubkey",
8791 private_key: "testkey.pem",
8792 }
8793
8794 prebuilt_apex {
8795 name: "myapex",
8796 prefer: true,
8797 arch: {
8798 arm64: {
8799 src: "myapex-arm64.apex",
8800 },
8801 arm: {
8802 src: "myapex-arm.apex",
8803 },
8804 },
8805 }
8806
8807 apex_set {
8808 name: "myapex_set",
8809 set: "myapex.apks",
8810 filename: "myapex_set.apex",
8811 overrides: ["myapex"],
8812 }
8813 `)
8814
8815 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8816 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8817 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 +09008818 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 +09008819}
8820
Jooyung Han938b5932020-06-20 12:47:47 +09008821func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008822 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008823 apex {
8824 name: "myapex",
8825 key: "myapex.key",
8826 apps: ["app"],
8827 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008828 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008829 }
8830
8831 apex_key {
8832 name: "myapex.key",
8833 public_key: "testkey.avbpubkey",
8834 private_key: "testkey.pem",
8835 }
8836
8837 android_app {
8838 name: "app",
8839 srcs: ["foo/bar/MyClass.java"],
8840 package_name: "foo",
8841 sdk_version: "none",
8842 system_modules: "none",
8843 apex_available: [ "myapex" ],
8844 }
8845 `, withFiles(map[string][]byte{
8846 "sub/Android.bp": []byte(`
8847 override_apex {
8848 name: "override_myapex",
8849 base: "myapex",
8850 apps: ["override_app"],
8851 allowed_files: ":allowed",
8852 }
8853 // Overridable "path" property should be referenced indirectly
8854 filegroup {
8855 name: "allowed",
8856 srcs: ["allowed.txt"],
8857 }
8858 override_android_app {
8859 name: "override_app",
8860 base: "app",
8861 package_name: "bar",
8862 }
8863 `),
8864 }))
8865
8866 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8867 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8868 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8869 }
8870
8871 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8872 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8873 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8874 }
8875}
8876
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008877func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008878 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008879 apex {
8880 name: "myapex",
8881 key: "myapex.key",
8882 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008883 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008884 }
8885
8886 apex_key {
8887 name: "myapex.key",
8888 public_key: "testkey.avbpubkey",
8889 private_key: "testkey.pem",
8890 }
8891
8892 cc_library {
8893 name: "mylib",
8894 srcs: ["mylib.cpp"],
8895 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008896 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008897 },
8898 apex_available: ["myapex"],
8899 }
8900
8901 cc_prebuilt_library_shared {
8902 name: "mylib",
8903 prefer: false,
8904 srcs: ["prebuilt.so"],
8905 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008906 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008907 },
8908 apex_available: ["myapex"],
8909 }
8910 `)
8911}
8912
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008913func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008914 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008915 apex {
8916 name: "myapex",
8917 key: "myapex.key",
8918 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008919 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008920 }
8921 apex_key {
8922 name: "myapex.key",
8923 public_key: "testkey.avbpubkey",
8924 private_key: "testkey.pem",
8925 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008926 `,
8927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8928 variables.CompressedApex = proptools.BoolPtr(true)
8929 }),
8930 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008931
8932 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8933 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8934
8935 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8936 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8937
8938 // Make sure output of bundle is .capex
8939 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8940 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8941
8942 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008943 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008944 var builder strings.Builder
8945 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8946 androidMk := builder.String()
8947 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8948}
8949
Martin Stjernholm2856c662020-12-02 15:03:42 +00008950func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008951 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008952 apex {
8953 name: "myapex",
8954 key: "myapex.key",
8955 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008956 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008957 }
8958
8959 apex_key {
8960 name: "myapex.key",
8961 public_key: "testkey.avbpubkey",
8962 private_key: "testkey.pem",
8963 }
8964
8965 cc_library {
8966 name: "mylib",
8967 srcs: ["mylib.cpp"],
8968 apex_available: ["myapex"],
8969 shared_libs: ["otherlib"],
8970 system_shared_libs: [],
8971 }
8972
8973 cc_library {
8974 name: "otherlib",
8975 srcs: ["mylib.cpp"],
8976 stubs: {
8977 versions: ["current"],
8978 },
8979 }
8980
8981 cc_prebuilt_library_shared {
8982 name: "otherlib",
8983 prefer: true,
8984 srcs: ["prebuilt.so"],
8985 stubs: {
8986 versions: ["current"],
8987 },
8988 }
8989 `)
8990
8991 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008992 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008993 var builder strings.Builder
8994 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8995 androidMk := builder.String()
8996
8997 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8998 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008999 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 +00009000}
9001
Jiyong Parke3867542020-12-03 17:28:25 +09009002func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009003 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009004 apex {
9005 name: "myapex",
9006 key: "myapex.key",
9007 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009008 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009009 }
9010
9011 apex_key {
9012 name: "myapex.key",
9013 public_key: "testkey.avbpubkey",
9014 private_key: "testkey.pem",
9015 }
9016
9017 cc_library {
9018 name: "mylib",
9019 srcs: ["mylib.cpp"],
9020 system_shared_libs: [],
9021 stl: "none",
9022 apex_available: ["myapex"],
9023 shared_libs: ["mylib2"],
9024 target: {
9025 apex: {
9026 exclude_shared_libs: ["mylib2"],
9027 },
9028 },
9029 }
9030
9031 cc_library {
9032 name: "mylib2",
9033 srcs: ["mylib.cpp"],
9034 system_shared_libs: [],
9035 stl: "none",
9036 }
9037 `)
9038
9039 // Check if mylib is linked to mylib2 for the non-apex target
9040 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9041 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9042
9043 // Make sure that the link doesn't occur for the apex target
9044 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9045 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9046
9047 // It shouldn't appear in the copy cmd as well.
9048 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9049 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9050}
9051
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009052func TestPrebuiltStubLibDep(t *testing.T) {
9053 bpBase := `
9054 apex {
9055 name: "myapex",
9056 key: "myapex.key",
9057 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009058 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009059 }
9060 apex_key {
9061 name: "myapex.key",
9062 public_key: "testkey.avbpubkey",
9063 private_key: "testkey.pem",
9064 }
9065 cc_library {
9066 name: "mylib",
9067 srcs: ["mylib.cpp"],
9068 apex_available: ["myapex"],
9069 shared_libs: ["stublib"],
9070 system_shared_libs: [],
9071 }
9072 apex {
9073 name: "otherapex",
9074 enabled: %s,
9075 key: "myapex.key",
9076 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009077 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009078 }
9079 `
9080
9081 stublibSourceBp := `
9082 cc_library {
9083 name: "stublib",
9084 srcs: ["mylib.cpp"],
9085 apex_available: ["otherapex"],
9086 system_shared_libs: [],
9087 stl: "none",
9088 stubs: {
9089 versions: ["1"],
9090 },
9091 }
9092 `
9093
9094 stublibPrebuiltBp := `
9095 cc_prebuilt_library_shared {
9096 name: "stublib",
9097 srcs: ["prebuilt.so"],
9098 apex_available: ["otherapex"],
9099 stubs: {
9100 versions: ["1"],
9101 },
9102 %s
9103 }
9104 `
9105
9106 tests := []struct {
9107 name string
9108 stublibBp string
9109 usePrebuilt bool
9110 modNames []string // Modules to collect AndroidMkEntries for
9111 otherApexEnabled []string
9112 }{
9113 {
9114 name: "only_source",
9115 stublibBp: stublibSourceBp,
9116 usePrebuilt: false,
9117 modNames: []string{"stublib"},
9118 otherApexEnabled: []string{"true", "false"},
9119 },
9120 {
9121 name: "source_preferred",
9122 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9123 usePrebuilt: false,
9124 modNames: []string{"stublib", "prebuilt_stublib"},
9125 otherApexEnabled: []string{"true", "false"},
9126 },
9127 {
9128 name: "prebuilt_preferred",
9129 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9130 usePrebuilt: true,
9131 modNames: []string{"stublib", "prebuilt_stublib"},
9132 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9133 },
9134 {
9135 name: "only_prebuilt",
9136 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9137 usePrebuilt: true,
9138 modNames: []string{"stublib"},
9139 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9140 },
9141 }
9142
9143 for _, test := range tests {
9144 t.Run(test.name, func(t *testing.T) {
9145 for _, otherApexEnabled := range test.otherApexEnabled {
9146 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009147 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009148
9149 type modAndMkEntries struct {
9150 mod *cc.Module
9151 mkEntries android.AndroidMkEntries
9152 }
9153 entries := []*modAndMkEntries{}
9154
9155 // Gather shared lib modules that are installable
9156 for _, modName := range test.modNames {
9157 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9158 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9159 continue
9160 }
9161 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009162 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009163 continue
9164 }
Colin Crossaa255532020-07-03 13:18:24 -07009165 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009166 if ent.Disabled {
9167 continue
9168 }
9169 entries = append(entries, &modAndMkEntries{
9170 mod: mod,
9171 mkEntries: ent,
9172 })
9173 }
9174 }
9175 }
9176
9177 var entry *modAndMkEntries = nil
9178 for _, ent := range entries {
9179 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9180 if entry != nil {
9181 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9182 } else {
9183 entry = ent
9184 }
9185 }
9186 }
9187
9188 if entry == nil {
9189 t.Errorf("AndroidMk entry for \"stublib\" missing")
9190 } else {
9191 isPrebuilt := entry.mod.Prebuilt() != nil
9192 if isPrebuilt != test.usePrebuilt {
9193 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9194 }
9195 if !entry.mod.IsStubs() {
9196 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9197 }
9198 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9199 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9200 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009201 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009202 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009203 if !android.InList(expected, cflags) {
9204 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9205 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009206 }
9207 })
9208 }
9209 })
9210 }
9211}
9212
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009213func TestHostApexInHostOnlyBuild(t *testing.T) {
9214 testApex(t, `
9215 apex {
9216 name: "myapex",
9217 host_supported: true,
9218 key: "myapex.key",
9219 updatable: false,
9220 payload_type: "zip",
9221 }
9222 apex_key {
9223 name: "myapex.key",
9224 public_key: "testkey.avbpubkey",
9225 private_key: "testkey.pem",
9226 }
9227 `,
9228 android.FixtureModifyConfig(func(config android.Config) {
9229 // We may not have device targets in all builds, e.g. in
9230 // prebuilts/build-tools/build-prebuilts.sh
9231 config.Targets[android.Android] = []android.Target{}
9232 }))
9233}
9234
Colin Crossc33e5212021-05-25 18:16:02 -07009235func TestApexJavaCoverage(t *testing.T) {
9236 bp := `
9237 apex {
9238 name: "myapex",
9239 key: "myapex.key",
9240 java_libs: ["mylib"],
9241 bootclasspath_fragments: ["mybootclasspathfragment"],
9242 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9243 updatable: false,
9244 }
9245
9246 apex_key {
9247 name: "myapex.key",
9248 public_key: "testkey.avbpubkey",
9249 private_key: "testkey.pem",
9250 }
9251
9252 java_library {
9253 name: "mylib",
9254 srcs: ["mylib.java"],
9255 apex_available: ["myapex"],
9256 compile_dex: true,
9257 }
9258
9259 bootclasspath_fragment {
9260 name: "mybootclasspathfragment",
9261 contents: ["mybootclasspathlib"],
9262 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009263 hidden_api: {
9264 split_packages: ["*"],
9265 },
Colin Crossc33e5212021-05-25 18:16:02 -07009266 }
9267
9268 java_library {
9269 name: "mybootclasspathlib",
9270 srcs: ["mybootclasspathlib.java"],
9271 apex_available: ["myapex"],
9272 compile_dex: true,
9273 }
9274
9275 systemserverclasspath_fragment {
9276 name: "mysystemserverclasspathfragment",
9277 contents: ["mysystemserverclasspathlib"],
9278 apex_available: ["myapex"],
9279 }
9280
9281 java_library {
9282 name: "mysystemserverclasspathlib",
9283 srcs: ["mysystemserverclasspathlib.java"],
9284 apex_available: ["myapex"],
9285 compile_dex: true,
9286 }
9287 `
9288
9289 result := android.GroupFixturePreparers(
9290 PrepareForTestWithApexBuildComponents,
9291 prepareForTestWithMyapex,
9292 java.PrepareForTestWithJavaDefaultModules,
9293 android.PrepareForTestWithAndroidBuildComponents,
9294 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009295 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9296 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009297 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009298 ).RunTest(t)
9299
9300 // Make sure jacoco ran on both mylib and mybootclasspathlib
9301 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9302 t.Errorf("Failed to find jacoco rule for mylib")
9303 }
9304 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9305 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9306 }
9307 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9308 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9309 }
9310}
9311
Jiyong Park192600a2021-08-03 07:52:17 +00009312func TestProhibitStaticExecutable(t *testing.T) {
9313 testApexError(t, `executable mybin is static`, `
9314 apex {
9315 name: "myapex",
9316 key: "myapex.key",
9317 binaries: ["mybin"],
9318 min_sdk_version: "29",
9319 }
9320
9321 apex_key {
9322 name: "myapex.key",
9323 public_key: "testkey.avbpubkey",
9324 private_key: "testkey.pem",
9325 }
9326
9327 cc_binary {
9328 name: "mybin",
9329 srcs: ["mylib.cpp"],
9330 relative_install_path: "foo/bar",
9331 static_executable: true,
9332 system_shared_libs: [],
9333 stl: "none",
9334 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009335 min_sdk_version: "29",
9336 }
9337 `)
9338
9339 testApexError(t, `executable mybin.rust is static`, `
9340 apex {
9341 name: "myapex",
9342 key: "myapex.key",
9343 binaries: ["mybin.rust"],
9344 min_sdk_version: "29",
9345 }
9346
9347 apex_key {
9348 name: "myapex.key",
9349 public_key: "testkey.avbpubkey",
9350 private_key: "testkey.pem",
9351 }
9352
9353 rust_binary {
9354 name: "mybin.rust",
9355 srcs: ["foo.rs"],
9356 static_executable: true,
9357 apex_available: ["myapex"],
9358 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009359 }
9360 `)
9361}
9362
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009363func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9364 ctx := testApex(t, `
9365 apex {
9366 name: "myapex",
9367 key: "myapex.key",
9368 updatable: false,
9369 java_libs: ["foo"],
9370 }
9371
9372 apex_key {
9373 name: "myapex.key",
9374 public_key: "testkey.avbpubkey",
9375 private_key: "testkey.pem",
9376 }
9377
9378 java_library {
9379 name: "foo",
9380 srcs: ["foo.java"],
9381 apex_available: ["myapex"],
9382 installable: true,
9383 }
9384 `,
9385 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9386 )
9387
9388 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9389 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9390 var builder strings.Builder
9391 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9392 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009393 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 +00009394}
9395
9396func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9397 ctx := testApex(t, `
9398 prebuilt_apex {
9399 name: "myapex",
9400 arch: {
9401 arm64: {
9402 src: "myapex-arm64.apex",
9403 },
9404 arm: {
9405 src: "myapex-arm.apex",
9406 },
9407 },
9408 exported_java_libs: ["foo"],
9409 }
9410
9411 java_import {
9412 name: "foo",
9413 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009414 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009415 }
9416 `,
9417 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9418 )
9419
9420 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9421 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9422 mainModuleEntries := entriesList[0]
9423 android.AssertArrayString(t,
9424 "LOCAL_REQUIRED_MODULES",
9425 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9426 []string{
9427 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9428 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9429 })
9430}
9431
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009432func TestAndroidMk_RequiredModules(t *testing.T) {
9433 ctx := testApex(t, `
9434 apex {
9435 name: "myapex",
9436 key: "myapex.key",
9437 updatable: false,
9438 java_libs: ["foo"],
9439 required: ["otherapex"],
9440 }
9441
9442 apex {
9443 name: "otherapex",
9444 key: "myapex.key",
9445 updatable: false,
9446 java_libs: ["foo"],
9447 required: ["otherapex"],
9448 }
9449
9450 apex_key {
9451 name: "myapex.key",
9452 public_key: "testkey.avbpubkey",
9453 private_key: "testkey.pem",
9454 }
9455
9456 java_library {
9457 name: "foo",
9458 srcs: ["foo.java"],
9459 apex_available: ["myapex", "otherapex"],
9460 installable: true,
9461 }
9462 `)
9463
9464 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9465 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9466 var builder strings.Builder
9467 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9468 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009469 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009470}
9471
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009472func TestAndroidMk_RequiredDeps(t *testing.T) {
9473 ctx := testApex(t, `
9474 apex {
9475 name: "myapex",
9476 key: "myapex.key",
9477 updatable: false,
9478 }
9479
9480 apex_key {
9481 name: "myapex.key",
9482 public_key: "testkey.avbpubkey",
9483 private_key: "testkey.pem",
9484 }
9485 `)
9486
9487 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009488 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009489 data := android.AndroidMkDataForTest(t, ctx, bundle)
9490 var builder strings.Builder
9491 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9492 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009493 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009494
9495 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009496 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009497 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9498 var flattenedBuilder strings.Builder
9499 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9500 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009501 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009502}
9503
Jooyung Hana6d36672022-02-24 13:58:07 +09009504func TestApexOutputFileProducer(t *testing.T) {
9505 for _, tc := range []struct {
9506 name string
9507 ref string
9508 expected_data []string
9509 }{
9510 {
9511 name: "test_using_output",
9512 ref: ":myapex",
9513 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9514 },
9515 {
9516 name: "test_using_apex",
9517 ref: ":myapex{.apex}",
9518 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9519 },
9520 } {
9521 t.Run(tc.name, func(t *testing.T) {
9522 ctx := testApex(t, `
9523 apex {
9524 name: "myapex",
9525 key: "myapex.key",
9526 compressible: true,
9527 updatable: false,
9528 }
9529
9530 apex_key {
9531 name: "myapex.key",
9532 public_key: "testkey.avbpubkey",
9533 private_key: "testkey.pem",
9534 }
9535
9536 java_test {
9537 name: "`+tc.name+`",
9538 srcs: ["a.java"],
9539 data: ["`+tc.ref+`"],
9540 }
9541 `,
9542 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9543 variables.CompressedApex = proptools.BoolPtr(true)
9544 }))
9545 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9546 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9547 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9548 })
9549 }
9550}
9551
satayev758968a2021-12-06 11:42:40 +00009552func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9553 preparer := android.GroupFixturePreparers(
9554 PrepareForTestWithApexBuildComponents,
9555 prepareForTestWithMyapex,
9556 java.PrepareForTestWithJavaSdkLibraryFiles,
9557 java.PrepareForTestWithJavaDefaultModules,
9558 android.PrepareForTestWithAndroidBuildComponents,
9559 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9560 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9561 )
9562
9563 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9564 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9565 preparer.RunTestWithBp(t, `
9566 apex {
9567 name: "myapex",
9568 key: "myapex.key",
9569 bootclasspath_fragments: ["mybootclasspathfragment"],
9570 min_sdk_version: "30",
9571 updatable: false,
9572 }
9573
9574 apex_key {
9575 name: "myapex.key",
9576 public_key: "testkey.avbpubkey",
9577 private_key: "testkey.pem",
9578 }
9579
9580 bootclasspath_fragment {
9581 name: "mybootclasspathfragment",
9582 contents: ["mybootclasspathlib"],
9583 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009584 hidden_api: {
9585 split_packages: ["*"],
9586 },
satayev758968a2021-12-06 11:42:40 +00009587 }
9588
9589 java_sdk_library {
9590 name: "mybootclasspathlib",
9591 srcs: ["mybootclasspathlib.java"],
9592 apex_available: ["myapex"],
9593 compile_dex: true,
9594 unsafe_ignore_missing_latest_api: true,
9595 min_sdk_version: "31",
9596 static_libs: ["util"],
9597 }
9598
9599 java_library {
9600 name: "util",
9601 srcs: ["a.java"],
9602 apex_available: ["myapex"],
9603 min_sdk_version: "31",
9604 static_libs: ["another_util"],
9605 }
9606
9607 java_library {
9608 name: "another_util",
9609 srcs: ["a.java"],
9610 min_sdk_version: "31",
9611 apex_available: ["myapex"],
9612 }
9613 `)
9614 })
9615
9616 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9617 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9618 preparer.RunTestWithBp(t, `
9619 apex {
9620 name: "myapex",
9621 key: "myapex.key",
9622 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9623 min_sdk_version: "30",
9624 updatable: false,
9625 }
9626
9627 apex_key {
9628 name: "myapex.key",
9629 public_key: "testkey.avbpubkey",
9630 private_key: "testkey.pem",
9631 }
9632
9633 systemserverclasspath_fragment {
9634 name: "mysystemserverclasspathfragment",
9635 contents: ["mysystemserverclasspathlib"],
9636 apex_available: ["myapex"],
9637 }
9638
9639 java_sdk_library {
9640 name: "mysystemserverclasspathlib",
9641 srcs: ["mysystemserverclasspathlib.java"],
9642 apex_available: ["myapex"],
9643 compile_dex: true,
9644 min_sdk_version: "32",
9645 unsafe_ignore_missing_latest_api: true,
9646 static_libs: ["util"],
9647 }
9648
9649 java_library {
9650 name: "util",
9651 srcs: ["a.java"],
9652 apex_available: ["myapex"],
9653 min_sdk_version: "31",
9654 static_libs: ["another_util"],
9655 }
9656
9657 java_library {
9658 name: "another_util",
9659 srcs: ["a.java"],
9660 min_sdk_version: "31",
9661 apex_available: ["myapex"],
9662 }
9663 `)
9664 })
9665
9666 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9667 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9668 RunTestWithBp(t, `
9669 apex {
9670 name: "myapex",
9671 key: "myapex.key",
9672 bootclasspath_fragments: ["mybootclasspathfragment"],
9673 min_sdk_version: "30",
9674 updatable: false,
9675 }
9676
9677 apex_key {
9678 name: "myapex.key",
9679 public_key: "testkey.avbpubkey",
9680 private_key: "testkey.pem",
9681 }
9682
9683 bootclasspath_fragment {
9684 name: "mybootclasspathfragment",
9685 contents: ["mybootclasspathlib"],
9686 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009687 hidden_api: {
9688 split_packages: ["*"],
9689 },
satayev758968a2021-12-06 11:42:40 +00009690 }
9691
9692 java_sdk_library {
9693 name: "mybootclasspathlib",
9694 srcs: ["mybootclasspathlib.java"],
9695 apex_available: ["myapex"],
9696 compile_dex: true,
9697 unsafe_ignore_missing_latest_api: true,
9698 }
9699 `)
9700 })
9701
9702 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9703 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9704 RunTestWithBp(t, `
9705 apex {
9706 name: "myapex",
9707 key: "myapex.key",
9708 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9709 min_sdk_version: "30",
9710 updatable: false,
9711 }
9712
9713 apex_key {
9714 name: "myapex.key",
9715 public_key: "testkey.avbpubkey",
9716 private_key: "testkey.pem",
9717 }
9718
9719 systemserverclasspath_fragment {
9720 name: "mysystemserverclasspathfragment",
9721 contents: ["mysystemserverclasspathlib"],
9722 apex_available: ["myapex"],
9723 }
9724
9725 java_sdk_library {
9726 name: "mysystemserverclasspathlib",
9727 srcs: ["mysystemserverclasspathlib.java"],
9728 apex_available: ["myapex"],
9729 compile_dex: true,
9730 unsafe_ignore_missing_latest_api: true,
9731 }
9732 `)
9733 })
9734}
9735
Jiakai Zhang6decef92022-01-12 17:56:19 +00009736// Verifies that the APEX depends on all the Make modules in the list.
9737func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9738 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9739 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009740 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009741 }
9742}
9743
9744// Verifies that the APEX does not depend on any of the Make modules in the list.
9745func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9746 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9747 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009748 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009749 }
9750}
9751
Cole Faust1021ccd2023-02-26 21:15:25 -08009752// TODO(b/193460475): Re-enable this test
9753//func TestApexStrictUpdtabilityLint(t *testing.T) {
9754// bpTemplate := `
9755// apex {
9756// name: "myapex",
9757// key: "myapex.key",
9758// java_libs: ["myjavalib"],
9759// updatable: %v,
9760// min_sdk_version: "29",
9761// }
9762// apex_key {
9763// name: "myapex.key",
9764// }
9765// java_library {
9766// name: "myjavalib",
9767// srcs: ["MyClass.java"],
9768// apex_available: [ "myapex" ],
9769// lint: {
9770// strict_updatability_linting: %v,
9771// },
9772// sdk_version: "current",
9773// min_sdk_version: "29",
9774// }
9775// `
9776// fs := android.MockFS{
9777// "lint-baseline.xml": nil,
9778// }
9779//
9780// testCases := []struct {
9781// testCaseName string
9782// apexUpdatable bool
9783// javaStrictUpdtabilityLint bool
9784// lintFileExists bool
9785// disallowedFlagExpected bool
9786// }{
9787// {
9788// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9789// apexUpdatable: true,
9790// javaStrictUpdtabilityLint: true,
9791// lintFileExists: false,
9792// disallowedFlagExpected: false,
9793// },
9794// {
9795// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9796// apexUpdatable: false,
9797// javaStrictUpdtabilityLint: false,
9798// lintFileExists: true,
9799// disallowedFlagExpected: false,
9800// },
9801// {
9802// testCaseName: "non-updatable apex respects strict updatability of javalib",
9803// apexUpdatable: false,
9804// javaStrictUpdtabilityLint: true,
9805// lintFileExists: true,
9806// disallowedFlagExpected: true,
9807// },
9808// {
9809// testCaseName: "updatable apex sets strict updatability of javalib to true",
9810// apexUpdatable: true,
9811// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9812// lintFileExists: true,
9813// disallowedFlagExpected: true,
9814// },
9815// }
9816//
9817// for _, testCase := range testCases {
9818// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9819// fixtures := []android.FixturePreparer{}
9820// if testCase.lintFileExists {
9821// fixtures = append(fixtures, fs.AddToFixture())
9822// }
9823//
9824// result := testApex(t, bp, fixtures...)
9825// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9826// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9827// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9828//
9829// if disallowedFlagActual != testCase.disallowedFlagExpected {
9830// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9831// }
9832// }
9833//}
9834//
9835//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9836// bp := `
9837// apex {
9838// name: "myapex",
9839// key: "myapex.key",
9840// java_libs: ["myjavalib"],
9841// updatable: true,
9842// min_sdk_version: "29",
9843// }
9844// apex_key {
9845// name: "myapex.key",
9846// }
9847// java_library {
9848// name: "myjavalib",
9849// srcs: ["MyClass.java"],
9850// apex_available: [ "myapex" ],
9851// sdk_version: "current",
9852// min_sdk_version: "29",
9853// }
9854// `
9855//
9856// testCases := []struct {
9857// testCaseName string
9858// moduleDirectory string
9859// disallowedFlagExpected bool
9860// }{
9861// {
9862// testCaseName: "lintable module defined outside libcore",
9863// moduleDirectory: "",
9864// disallowedFlagExpected: true,
9865// },
9866// {
9867// testCaseName: "lintable module defined in libcore root directory",
9868// moduleDirectory: "libcore/",
9869// disallowedFlagExpected: false,
9870// },
9871// {
9872// testCaseName: "lintable module defined in libcore child directory",
9873// moduleDirectory: "libcore/childdir/",
9874// disallowedFlagExpected: true,
9875// },
9876// }
9877//
9878// for _, testCase := range testCases {
9879// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9880// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9881// result := testApex(t, "", lintFileCreator, bpFileCreator)
9882// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9883// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9884// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9885// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9886//
9887// if disallowedFlagActual != testCase.disallowedFlagExpected {
9888// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9889// }
9890// }
9891//}
9892//
9893//// checks transtive deps of an apex coming from bootclasspath_fragment
9894//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9895// bp := `
9896// apex {
9897// name: "myapex",
9898// key: "myapex.key",
9899// bootclasspath_fragments: ["mybootclasspathfragment"],
9900// updatable: true,
9901// min_sdk_version: "29",
9902// }
9903// apex_key {
9904// name: "myapex.key",
9905// }
9906// bootclasspath_fragment {
9907// name: "mybootclasspathfragment",
9908// contents: ["myjavalib"],
9909// apex_available: ["myapex"],
9910// hidden_api: {
9911// split_packages: ["*"],
9912// },
9913// }
9914// java_library {
9915// name: "myjavalib",
9916// srcs: ["MyClass.java"],
9917// apex_available: [ "myapex" ],
9918// sdk_version: "current",
9919// min_sdk_version: "29",
9920// compile_dex: true,
9921// }
9922// `
9923// fs := android.MockFS{
9924// "lint-baseline.xml": nil,
9925// }
9926//
9927// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9928// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9929// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9930// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9931// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9932// }
9933//}
Spandan Das66773252022-01-15 00:23:18 +00009934
Spandan Das42e89502022-05-06 22:12:55 +00009935// updatable apexes should propagate updatable=true to its apps
9936func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9937 bp := `
9938 apex {
9939 name: "myapex",
9940 key: "myapex.key",
9941 updatable: %v,
9942 apps: [
9943 "myapp",
9944 ],
9945 min_sdk_version: "30",
9946 }
9947 apex_key {
9948 name: "myapex.key",
9949 }
9950 android_app {
9951 name: "myapp",
9952 updatable: %v,
9953 apex_available: [
9954 "myapex",
9955 ],
9956 sdk_version: "current",
9957 min_sdk_version: "30",
9958 }
9959 `
9960 testCases := []struct {
9961 name string
9962 apex_is_updatable_bp bool
9963 app_is_updatable_bp bool
9964 app_is_updatable_expected bool
9965 }{
9966 {
9967 name: "Non-updatable apex respects updatable property of non-updatable app",
9968 apex_is_updatable_bp: false,
9969 app_is_updatable_bp: false,
9970 app_is_updatable_expected: false,
9971 },
9972 {
9973 name: "Non-updatable apex respects updatable property of updatable app",
9974 apex_is_updatable_bp: false,
9975 app_is_updatable_bp: true,
9976 app_is_updatable_expected: true,
9977 },
9978 {
9979 name: "Updatable apex respects updatable property of updatable app",
9980 apex_is_updatable_bp: true,
9981 app_is_updatable_bp: true,
9982 app_is_updatable_expected: true,
9983 },
9984 {
9985 name: "Updatable apex sets updatable=true on non-updatable app",
9986 apex_is_updatable_bp: true,
9987 app_is_updatable_bp: false,
9988 app_is_updatable_expected: true,
9989 },
9990 }
9991 for _, testCase := range testCases {
9992 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9993 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9994 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9995 }
9996}
9997
Kiyoung Kim487689e2022-07-26 09:48:22 +09009998func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9999 bp := `
10000 apex {
10001 name: "myapex",
10002 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010003 native_shared_libs: ["libbaz"],
10004 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010005 min_sdk_version: "29",
10006 }
10007 apex_key {
10008 name: "myapex.key",
10009 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010010 cc_binary {
10011 name: "binfoo",
10012 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010013 apex_available: ["myapex"],
10014 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010015 recovery_available: false,
10016 }
10017 cc_library {
10018 name: "libbar",
10019 srcs: ["libbar.cc"],
10020 stubs: {
10021 symbol_file: "libbar.map.txt",
10022 versions: [
10023 "29",
10024 ],
10025 },
10026 }
10027 cc_library {
10028 name: "libbaz",
10029 srcs: ["libbaz.cc"],
10030 apex_available: ["myapex"],
10031 min_sdk_version: "29",
10032 stubs: {
10033 symbol_file: "libbaz.map.txt",
10034 versions: [
10035 "29",
10036 ],
10037 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010038 }
10039 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010040 name: "libbar",
10041 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010042 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010043 variants: ["apex.29"],
10044 }
10045 cc_api_variant {
10046 name: "libbar",
10047 variant: "apex",
10048 version: "29",
10049 src: "libbar_apex_29.so",
10050 }
10051 cc_api_library {
10052 name: "libbaz",
10053 src: "libbaz_stub.so",
10054 min_sdk_version: "29",
10055 variants: ["apex.29"],
10056 }
10057 cc_api_variant {
10058 name: "libbaz",
10059 variant: "apex",
10060 version: "29",
10061 src: "libbaz_apex_29.so",
10062 }
10063 cc_api_library {
10064 name: "libqux",
10065 src: "libqux_stub.so",
10066 min_sdk_version: "29",
10067 variants: ["apex.29"],
10068 }
10069 cc_api_variant {
10070 name: "libqux",
10071 variant: "apex",
10072 version: "29",
10073 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010074 }
10075 api_imports {
10076 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010077 apex_shared_libs: [
10078 "libbar",
10079 "libbaz",
10080 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010081 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010082 }
10083 `
10084 result := testApex(t, bp)
10085
10086 hasDep := func(m android.Module, wantDep android.Module) bool {
10087 t.Helper()
10088 var found bool
10089 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10090 if dep == wantDep {
10091 found = true
10092 }
10093 })
10094 return found
10095 }
10096
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010097 // Library defines stubs and cc_api_library should be used with cc_api_library
10098 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10099 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10100 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010101
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010102 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10103 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010104
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010105 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10106 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10107 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10108 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10109
10110 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10111 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10112 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10113 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10114 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10115
10116 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10117 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10118 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10119
10120 // cc_api_library defined without original library should be linked with cc_api_library
10121 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10122 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10123 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10124}
10125
10126func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10127 bp := `
10128 apex {
10129 name: "myapex",
10130 key: "myapex.key",
10131 native_shared_libs: ["libbar"],
10132 min_sdk_version: "29",
10133 }
10134 apex_key {
10135 name: "myapex.key",
10136 }
10137 cc_binary {
10138 name: "binfoo",
10139 shared_libs: ["libbar"],
10140 recovery_available: false,
10141 }
10142 cc_library {
10143 name: "libbar",
10144 srcs: ["libbar.cc"],
10145 apex_available: ["myapex"],
10146 min_sdk_version: "29",
10147 stubs: {
10148 symbol_file: "libbar.map.txt",
10149 versions: [
10150 "29",
10151 ],
10152 },
10153 }
10154 cc_api_library {
10155 name: "libbar",
10156 src: "libbar_stub.so",
10157 variants: ["apex.29"],
10158 }
10159 cc_api_variant {
10160 name: "libbar",
10161 variant: "apex",
10162 version: "29",
10163 src: "libbar_apex_29.so",
10164 }
10165 api_imports {
10166 name: "api_imports",
10167 apex_shared_libs: [
10168 "libbar",
10169 ],
10170 }
10171 `
10172
10173 result := testApex(t, bp)
10174
10175 hasDep := func(m android.Module, wantDep android.Module) bool {
10176 t.Helper()
10177 var found bool
10178 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10179 if dep == wantDep {
10180 found = true
10181 }
10182 })
10183 return found
10184 }
10185
10186 // Library defines stubs and cc_api_library should be used with cc_api_library
10187 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10188 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10189 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10190
10191 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10192 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10193
10194 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10195 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10196 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10197 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010198}
Dennis Shend4f5d932023-01-31 20:27:21 +000010199
10200func TestTrimmedApex(t *testing.T) {
10201 bp := `
10202 apex {
10203 name: "myapex",
10204 key: "myapex.key",
10205 native_shared_libs: ["libfoo","libbaz"],
10206 min_sdk_version: "29",
10207 trim_against: "mydcla",
10208 }
10209 apex {
10210 name: "mydcla",
10211 key: "myapex.key",
10212 native_shared_libs: ["libfoo","libbar"],
10213 min_sdk_version: "29",
10214 file_contexts: ":myapex-file_contexts",
10215 dynamic_common_lib_apex: true,
10216 }
10217 apex_key {
10218 name: "myapex.key",
10219 }
10220 cc_library {
10221 name: "libfoo",
10222 shared_libs: ["libc"],
10223 apex_available: ["myapex","mydcla"],
10224 min_sdk_version: "29",
10225 }
10226 cc_library {
10227 name: "libbar",
10228 shared_libs: ["libc"],
10229 apex_available: ["myapex","mydcla"],
10230 min_sdk_version: "29",
10231 }
10232 cc_library {
10233 name: "libbaz",
10234 shared_libs: ["libc"],
10235 apex_available: ["myapex","mydcla"],
10236 min_sdk_version: "29",
10237 }
10238 cc_api_library {
10239 name: "libc",
10240 src: "libc.so",
10241 min_sdk_version: "29",
10242 recovery_available: true,
10243 }
10244 api_imports {
10245 name: "api_imports",
10246 shared_libs: [
10247 "libc",
10248 ],
10249 header_libs: [],
10250 }
10251 `
10252 ctx := testApex(t, bp)
10253 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10254 apexRule := module.MaybeRule("apexRule")
10255 if apexRule.Rule == nil {
10256 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10257 }
10258
10259 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10260 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10261 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10262 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10263 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10264 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10265}
Jingwen Chendea7a642023-03-28 11:30:50 +000010266
10267func TestCannedFsConfig(t *testing.T) {
10268 ctx := testApex(t, `
10269 apex {
10270 name: "myapex",
10271 key: "myapex.key",
10272 updatable: false,
10273 }
10274
10275 apex_key {
10276 name: "myapex.key",
10277 public_key: "testkey.avbpubkey",
10278 private_key: "testkey.pem",
10279 }`)
10280 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10281 generateFsRule := mod.Rule("generateFsConfig")
10282 cmd := generateFsRule.RuleParams.Command
10283
10284 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10285}
10286
10287func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10288 ctx := testApex(t, `
10289 apex {
10290 name: "myapex",
10291 key: "myapex.key",
10292 canned_fs_config: "my_config",
10293 updatable: false,
10294 }
10295
10296 apex_key {
10297 name: "myapex.key",
10298 public_key: "testkey.avbpubkey",
10299 private_key: "testkey.pem",
10300 }`)
10301 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10302 generateFsRule := mod.Rule("generateFsConfig")
10303 cmd := generateFsRule.RuleParams.Command
10304
10305 // Ensure that canned_fs_config has "cat my_config" at the end
10306 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10307}
Spandan Das20fce2d2023-04-12 17:21:39 +000010308
10309func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10310 testCases := []struct {
10311 desc string
10312 hasStubs bool
10313 apexAvailable string
10314 expectedError string
10315 }{
10316 {
10317 desc: "non-stub library can have multiple apex_available",
10318 hasStubs: false,
10319 apexAvailable: `["myapex", "otherapex"]`,
10320 },
10321 {
10322 desc: "stub library should not be available to anyapex",
10323 hasStubs: true,
10324 apexAvailable: `["//apex_available:anyapex"]`,
10325 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10326 },
10327 {
10328 desc: "stub library should not be available to multiple apexes",
10329 hasStubs: true,
10330 apexAvailable: `["myapex", "otherapex"]`,
10331 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10332 },
10333 {
10334 desc: "stub library can be available to a core apex and a test apex",
10335 hasStubs: true,
10336 apexAvailable: `["myapex", "test_myapex"]`,
10337 },
10338 }
10339 bpTemplate := `
10340 cc_library {
10341 name: "libfoo",
10342 %v
10343 apex_available: %v,
10344 }
10345 apex {
10346 name: "myapex",
10347 key: "apex.key",
10348 updatable: false,
10349 native_shared_libs: ["libfoo"],
10350 }
10351 apex {
10352 name: "otherapex",
10353 key: "apex.key",
10354 updatable: false,
10355 }
10356 apex_test {
10357 name: "test_myapex",
10358 key: "apex.key",
10359 updatable: false,
10360 native_shared_libs: ["libfoo"],
10361 }
10362 apex_key {
10363 name: "apex.key",
10364 }
10365 `
10366 for _, tc := range testCases {
10367 stubs := ""
10368 if tc.hasStubs {
10369 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10370 }
10371 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10372 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10373 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10374 })
10375 if tc.expectedError == "" {
10376 testApex(t, bp, mockFsFixturePreparer)
10377 } else {
10378 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10379 }
10380 }
10381}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010382
10383func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10384 context := android.GroupFixturePreparers(
10385 android.PrepareForIntegrationTestWithAndroid,
10386 cc.PrepareForIntegrationTestWithCc,
10387 PrepareForTestWithApexBuildComponents,
10388 prepareForTestWithMyapex,
10389 filesystem.PrepareForTestWithFilesystemBuildComponents,
10390 )
10391 result := context.RunTestWithBp(t, `
10392 android_system_image {
10393 name: "myfilesystem",
10394 deps: [
10395 "libfoo",
10396 ],
10397 linker_config_src: "linker.config.json",
10398 }
10399
10400 cc_library {
10401 name: "libfoo",
10402 shared_libs: [
10403 "libbar",
10404 ],
10405 stl: "none",
10406 }
10407
10408 cc_library {
10409 name: "libbar",
10410 stl: "none",
10411 apex_available: ["myapex"],
10412 }
10413
10414 apex {
10415 name: "myapex",
10416 native_shared_libs: ["libbar"],
10417 key: "myapex.key",
10418 updatable: false,
10419 }
10420
10421 apex_key {
10422 name: "myapex.key",
10423 public_key: "testkey.avbpubkey",
10424 private_key: "testkey.pem",
10425 }
10426 `)
10427
10428 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10429 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10430 inputs.Strings(),
10431 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10432}