blob: 1f4e5eafaf4428a1bbc248d3a41a7511889cc7c1 [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
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900270 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jooyung Hana3fddf42024-09-03 13:22:21 +0900281func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
282 t.Helper()
283 p := regexp.MustCompile(expectedRex)
284 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
285 t.Errorf("%q is not found in %v", expectedRex, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if !android.InList(expected, result) {
292 t.Errorf("%q is not found in %v", expected, result)
293 }
294}
295
296func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900297 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900298 if android.InList(notExpected, result) {
299 t.Errorf("%q is found in %v", notExpected, result)
300 }
301}
302
Jooyung Hane1633032019-08-01 17:41:43 +0900303func ensureListEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) > 0 {
306 t.Errorf("%q is expected to be empty", result)
307 }
308}
309
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000310func ensureListNotEmpty(t *testing.T, result []string) {
311 t.Helper()
312 if len(result) == 0 {
313 t.Errorf("%q is expected to be not empty", result)
314 }
315}
316
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317// Minimal test
318func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800319 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900320 apex_defaults {
321 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900322 manifest: ":myapex.manifest",
323 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900326 native_shared_libs: [
327 "mylib",
328 "libfoo.ffi",
329 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900330 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800331 multilib: {
332 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900333 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800334 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900335 },
Jiyong Park77acec62020-06-01 21:39:15 +0900336 java_libs: [
337 "myjar",
338 "myjar_dex",
339 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000340 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 }
342
Jiyong Park30ca9372019-02-07 16:27:23 +0900343 apex {
344 name: "myapex",
345 defaults: ["myapex-defaults"],
346 }
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 apex_key {
349 name: "myapex.key",
350 public_key: "testkey.avbpubkey",
351 private_key: "testkey.pem",
352 }
353
Jiyong Park809bb722019-02-13 21:33:49 +0900354 filegroup {
355 name: "myapex.manifest",
356 srcs: ["apex_manifest.json"],
357 }
358
359 filegroup {
360 name: "myapex.androidmanifest",
361 srcs: ["AndroidManifest.xml"],
362 }
363
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 cc_library {
365 name: "mylib",
366 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900367 shared_libs: [
368 "mylib2",
369 "libbar.ffi",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 system_shared_libs: [],
372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000373 // TODO: remove //apex_available:platform
374 apex_available: [
375 "//apex_available:platform",
376 "myapex",
377 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900378 }
379
Alex Light3d673592019-01-18 14:37:31 -0800380 cc_binary {
381 name: "foo",
382 srcs: ["mylib.cpp"],
383 compile_multilib: "both",
384 multilib: {
385 lib32: {
386 suffix: "32",
387 },
388 lib64: {
389 suffix: "64",
390 },
391 },
392 symlinks: ["foo_link_"],
393 symlink_preferred_arch: true,
394 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800395 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900396 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700397 }
398
Jiyong Park99644e92020-11-17 22:21:02 +0900399 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000400 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900401 srcs: ["foo.rs"],
402 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400403 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900404 apex_available: ["myapex"],
405 }
406
407 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000408 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900412 shared_libs: ["libfoo.shared_from_rust"],
413 }
414
415 cc_library_shared {
416 name: "libfoo.shared_from_rust",
417 srcs: ["mylib.cpp"],
418 system_shared_libs: [],
419 stl: "none",
420 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900421 }
422
423 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000424 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900430 rust_ffi_shared {
431 name: "libfoo.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "foo",
434 apex_available: ["myapex"],
435 }
436
437 rust_ffi_shared {
438 name: "libbar.ffi",
439 srcs: ["foo.rs"],
440 crate_name: "bar",
441 apex_available: ["myapex"],
442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
465 }
466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Colin Crossf61d03d2023-11-02 16:56:39 -0700600 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
601 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
604 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
605 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100606
Colin Crossf61d03d2023-11-02 16:56:39 -0700607 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
608 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800613}
614
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800616 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 apex_defaults {
618 name: "myapex-defaults",
619 key: "myapex.key",
620 prebuilts: ["myetc"],
621 native_shared_libs: ["mylib"],
622 java_libs: ["myjar"],
623 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900624 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800625 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000626 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 }
628
629 prebuilt_etc {
630 name: "myetc",
631 src: "myprebuilt",
632 }
633
634 apex {
635 name: "myapex",
636 defaults: ["myapex-defaults"],
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
645 cc_library {
646 name: "mylib",
647 system_shared_libs: [],
648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 java_library {
653 name: "myjar",
654 srcs: ["foo/bar/MyClass.java"],
655 sdk_version: "none",
656 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000657 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658 }
659
660 android_app {
661 name: "AppFoo",
662 srcs: ["foo/bar/MyClass.java"],
663 sdk_version: "none",
664 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000665 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900667
668 runtime_resource_overlay {
669 name: "rro",
670 theme: "blue",
671 }
672
markchien2f59ec92020-09-02 16:23:38 +0800673 bpf {
674 name: "bpf",
675 srcs: ["bpf.c", "bpf2.c"],
676 }
677
Ken Chenfad7f9d2021-11-10 22:02:57 +0800678 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800679 name: "netdTest",
680 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800681 sub_dir: "netd",
682 }
683
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900685 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 "etc/myetc",
687 "javalib/myjar.jar",
688 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000689 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900690 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800691 "etc/bpf/bpf.o",
692 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800693 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 })
695}
696
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800698 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 apex {
700 name: "myapex",
701 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000702 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710 `)
711
Jooyung Hana0503a52023-08-23 13:12:50 +0900712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900713 args := module.Rule("apexRule").Args
714 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
715 t.Error("manifest should be apex_manifest.pb, but " + manifest)
716 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900717}
718
Liz Kammer4854a7d2021-05-27 14:28:27 -0400719func TestApexManifestMinSdkVersion(t *testing.T) {
720 ctx := testApex(t, `
721 apex_defaults {
722 name: "my_defaults",
723 key: "myapex.key",
724 product_specific: true,
725 file_contexts: ":my-file-contexts",
726 updatable: false,
727 }
728 apex {
729 name: "myapex_30",
730 min_sdk_version: "30",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_current",
736 min_sdk_version: "current",
737 defaults: ["my_defaults"],
738 }
739
740 apex {
741 name: "myapex_none",
742 defaults: ["my_defaults"],
743 }
744
745 apex_key {
746 name: "myapex.key",
747 public_key: "testkey.avbpubkey",
748 private_key: "testkey.pem",
749 }
750
751 filegroup {
752 name: "my-file-contexts",
753 srcs: ["product_specific_file_contexts"],
754 }
755 `, withFiles(map[string][]byte{
756 "product_specific_file_contexts": nil,
757 }), android.FixtureModifyProductVariables(
758 func(variables android.FixtureProductVariables) {
759 variables.Unbundled_build = proptools.BoolPtr(true)
760 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
761 }), android.FixtureMergeEnv(map[string]string{
762 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
763 }))
764
765 testCases := []struct {
766 module string
767 minSdkVersion string
768 }{
769 {
770 module: "myapex_30",
771 minSdkVersion: "30",
772 },
773 {
774 module: "myapex_current",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 {
778 module: "myapex_none",
779 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
780 },
781 }
782 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900783 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400784 args := module.Rule("apexRule").Args
785 optFlags := args["opt_flags"]
786 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
787 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
788 }
789 }
790}
791
Jihoon Kang842b9992024-02-08 01:41:51 +0000792func TestApexWithDessertSha(t *testing.T) {
793 ctx := testApex(t, `
794 apex_defaults {
795 name: "my_defaults",
796 key: "myapex.key",
797 product_specific: true,
798 file_contexts: ":my-file-contexts",
799 updatable: false,
800 }
801 apex {
802 name: "myapex_30",
803 min_sdk_version: "30",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_current",
809 min_sdk_version: "current",
810 defaults: ["my_defaults"],
811 }
812
813 apex {
814 name: "myapex_none",
815 defaults: ["my_defaults"],
816 }
817
818 apex_key {
819 name: "myapex.key",
820 public_key: "testkey.avbpubkey",
821 private_key: "testkey.pem",
822 }
823
824 filegroup {
825 name: "my-file-contexts",
826 srcs: ["product_specific_file_contexts"],
827 }
828 `, withFiles(map[string][]byte{
829 "product_specific_file_contexts": nil,
830 }), android.FixtureModifyProductVariables(
831 func(variables android.FixtureProductVariables) {
832 variables.Unbundled_build = proptools.BoolPtr(true)
833 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
834 }), android.FixtureMergeEnv(map[string]string{
835 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
836 }))
837
838 testCases := []struct {
839 module string
840 minSdkVersion string
841 }{
842 {
843 module: "myapex_30",
844 minSdkVersion: "30",
845 },
846 {
847 module: "myapex_current",
848 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
849 },
850 {
851 module: "myapex_none",
852 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
853 },
854 }
855 for _, tc := range testCases {
856 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
857 args := module.Rule("apexRule").Args
858 optFlags := args["opt_flags"]
859 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
860 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
861 }
862 }
863}
864
Jooyung Hanaf730952023-02-28 14:13:38 +0900865func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900866 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900867 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900868 if vendor {
869 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 }
871 ctx := testApex(t, `
872 apex {
873 name: "myapex",
874 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900875 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900876 `+prop+`
877 }
878
879 apex_key {
880 name: "myapex.key",
881 public_key: "testkey.avbpubkey",
882 private_key: "testkey.pem",
883 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900884 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900885
Jooyung Hana0503a52023-08-23 13:12:50 +0900886 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 if vendor {
888 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
889 rule.RuleParams.Command,
890 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900891 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900892 android.AssertStringDoesContain(t, "should force-label as system_file",
893 rule.RuleParams.Command,
894 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900895 }
896 }
897}
898
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800900 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 apex {
902 name: "myapex",
903 key: "myapex.key",
904 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900905 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000906 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000918 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 system_shared_libs: [],
920 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
923
924 cc_library {
925 name: "mylib2",
926 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900927 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 system_shared_libs: [],
929 stl: "none",
930 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000931 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 versions: ["1", "2", "3"],
933 },
934 }
935
936 cc_library {
937 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900938 srcs: ["mylib.cpp"],
939 shared_libs: ["mylib4"],
940 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 stl: "none",
942 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000943 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 versions: ["10", "11", "12"],
945 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000946 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900948
949 cc_library {
950 name: "mylib4",
951 srcs: ["mylib.cpp"],
952 system_shared_libs: [],
953 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900955 }
Jiyong Park105dc322021-06-11 17:22:09 +0900956
Spandan Das357ffcc2024-07-24 18:07:48 +0000957 cc_prebuilt_library_shared {
958 name: "my_prebuilt_platform_lib",
959 stubs: {
960 symbol_file: "my_prebuilt_platform_lib.map.txt",
961 versions: ["1", "2", "3"],
962 },
963 srcs: ["foo.so"],
964 }
965
966 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
967 cc_prebuilt_library_shared {
968 name: "my_prebuilt_platform_stub_only_lib",
969 stubs: {
970 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
971 versions: ["1", "2", "3"],
972 }
973 }
974
Jiyong Park105dc322021-06-11 17:22:09 +0900975 rust_binary {
976 name: "foo.rust",
977 srcs: ["foo.rs"],
978 shared_libs: ["libfoo.shared_from_rust"],
979 prefer_rlib: true,
980 apex_available: ["myapex"],
981 }
982
983 cc_library_shared {
984 name: "libfoo.shared_from_rust",
985 srcs: ["mylib.cpp"],
986 system_shared_libs: [],
987 stl: "none",
988 stubs: {
989 versions: ["10", "11", "12"],
990 },
991 }
992
Jiyong Park25fc6a92018-11-18 18:02:45 +0900993 `)
994
Jooyung Hana0503a52023-08-23 13:12:50 +0900995 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996 copyCmds := apexRule.Args["copy_commands"]
997
998 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800999 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001000
1001 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001002 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001003
1004 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001005 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001006
Colin Crossaede88c2020-08-11 12:17:01 -07001007 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008
1009 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001010 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001012 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001013
1014 // 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 -07001015 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001017 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001018
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001019 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1020 // is replaced by sharing of "cFlags" in cc/builder.go.
1021 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1022 // module variable representing "cflags". So it was not detected by ensureNotContains.
1023 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1024 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1025 // including the original cflags's "-include mylib.h".
1026 //
Jiyong Park64379952018-12-13 18:37:29 +09001027 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001028 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1029 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001030
Jiyong Park85cc35a2022-07-17 11:30:47 +09001031 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1032 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1033 // Ensure that genstub for apex-provided lib is invoked with --apex
1034 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001035
Jooyung Hana0503a52023-08-23 13:12:50 +09001036 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001037 "lib64/mylib.so",
1038 "lib64/mylib3.so",
1039 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001040 "bin/foo.rust",
1041 "lib64/libc++.so", // by the implicit dependency from foo.rust
1042 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001043 })
Jiyong Park105dc322021-06-11 17:22:09 +09001044
1045 // Ensure that stub dependency from a rust module is not included
1046 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1047 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001048 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001049 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1050 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001051
Jooyung Hana0503a52023-08-23 13:12:50 +09001052 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001053 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001054
1055 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1056 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1057 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1058 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1059 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1060 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1061
1062 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1063 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1064 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1065 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1066 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1067 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001068}
1069
Jooyung Han20348752023-12-05 15:23:56 +09001070func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1071 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1072 apex {
1073 name: "myapex",
1074 key: "myapex.key",
1075 vendor: true,
1076 updatable: false,
1077 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1078 }
1079
1080 apex_key {
1081 name: "myapex.key",
1082 public_key: "testkey.avbpubkey",
1083 private_key: "testkey.pem",
1084 }
1085
1086 cc_library {
1087 name: "libbar",
1088 srcs: ["mylib.cpp"],
1089 llndk: {
1090 symbol_file: "libbar.map.txt",
1091 }
1092 }
1093 `)
1094}
1095
Jiyong Park1bc84122021-06-22 20:23:05 +09001096func TestApexCanUsePrivateApis(t *testing.T) {
1097 ctx := testApex(t, `
1098 apex {
1099 name: "myapex",
1100 key: "myapex.key",
1101 native_shared_libs: ["mylib"],
1102 binaries: ["foo.rust"],
1103 updatable: false,
1104 platform_apis: true,
1105 }
1106
1107 apex_key {
1108 name: "myapex.key",
1109 public_key: "testkey.avbpubkey",
1110 private_key: "testkey.pem",
1111 }
1112
1113 cc_library {
1114 name: "mylib",
1115 srcs: ["mylib.cpp"],
1116 shared_libs: ["mylib2"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex" ],
1120 }
1121
1122 cc_library {
1123 name: "mylib2",
1124 srcs: ["mylib.cpp"],
1125 cflags: ["-include mylib.h"],
1126 system_shared_libs: [],
1127 stl: "none",
1128 stubs: {
1129 versions: ["1", "2", "3"],
1130 },
1131 }
1132
1133 rust_binary {
1134 name: "foo.rust",
1135 srcs: ["foo.rs"],
1136 shared_libs: ["libfoo.shared_from_rust"],
1137 prefer_rlib: true,
1138 apex_available: ["myapex"],
1139 }
1140
1141 cc_library_shared {
1142 name: "libfoo.shared_from_rust",
1143 srcs: ["mylib.cpp"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 stubs: {
1147 versions: ["10", "11", "12"],
1148 },
1149 }
1150 `)
1151
Jooyung Hana0503a52023-08-23 13:12:50 +09001152 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001153 copyCmds := apexRule.Args["copy_commands"]
1154
1155 // Ensure that indirect stubs dep is not included
1156 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1157 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1158
1159 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1160 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001161 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001162 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1163 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001164 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001165 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1166 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1167}
1168
Colin Cross7812fd32020-09-25 12:35:10 -07001169func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1170 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001171 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001172 apex {
1173 name: "myapex",
1174 key: "myapex.key",
1175 native_shared_libs: ["mylib", "mylib3"],
1176 min_sdk_version: "29",
1177 }
1178
1179 apex_key {
1180 name: "myapex.key",
1181 public_key: "testkey.avbpubkey",
1182 private_key: "testkey.pem",
1183 }
1184
1185 cc_library {
1186 name: "mylib",
1187 srcs: ["mylib.cpp"],
1188 shared_libs: ["mylib2", "mylib3"],
1189 system_shared_libs: [],
1190 stl: "none",
1191 apex_available: [ "myapex" ],
1192 min_sdk_version: "28",
1193 }
1194
1195 cc_library {
1196 name: "mylib2",
1197 srcs: ["mylib.cpp"],
1198 cflags: ["-include mylib.h"],
1199 system_shared_libs: [],
1200 stl: "none",
1201 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001202 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001203 versions: ["28", "29", "30", "current"],
1204 },
1205 min_sdk_version: "28",
1206 }
1207
1208 cc_library {
1209 name: "mylib3",
1210 srcs: ["mylib.cpp"],
1211 shared_libs: ["mylib4"],
1212 system_shared_libs: [],
1213 stl: "none",
1214 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001215 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001216 versions: ["28", "29", "30", "current"],
1217 },
1218 apex_available: [ "myapex" ],
1219 min_sdk_version: "28",
1220 }
1221
1222 cc_library {
1223 name: "mylib4",
1224 srcs: ["mylib.cpp"],
1225 system_shared_libs: [],
1226 stl: "none",
1227 apex_available: [ "myapex" ],
1228 min_sdk_version: "28",
1229 }
1230 `)
1231
Jooyung Hana0503a52023-08-23 13:12:50 +09001232 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001233 copyCmds := apexRule.Args["copy_commands"]
1234
1235 // Ensure that direct non-stubs dep is always included
1236 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1237
1238 // Ensure that indirect stubs dep is not included
1239 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1240
1241 // Ensure that direct stubs dep is included
1242 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1243
1244 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1245
Jiyong Park55549df2021-02-26 23:57:23 +09001246 // Ensure that mylib is linking with the latest version of stub for mylib2
1247 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001248 // ... and not linking to the non-stub (impl) variant of mylib2
1249 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1250
1251 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1252 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1253 // .. and not linking to the stubs variant of mylib3
1254 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1255
1256 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001257 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001258 ensureNotContains(t, mylib2Cflags, "-include ")
1259
Jiyong Park85cc35a2022-07-17 11:30:47 +09001260 // Ensure that genstub is invoked with --systemapi
1261 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001262
Jooyung Hana0503a52023-08-23 13:12:50 +09001263 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001264 "lib64/mylib.so",
1265 "lib64/mylib3.so",
1266 "lib64/mylib4.so",
1267 })
1268}
1269
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001270func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1271 t.Parallel()
1272 // myapex (Z)
1273 // mylib -----------------.
1274 // |
1275 // otherapex (29) |
1276 // libstub's versions: 29 Z current
1277 // |
1278 // <platform> |
1279 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001280 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001281 apex {
1282 name: "myapex",
1283 key: "myapex.key",
1284 native_shared_libs: ["mylib"],
1285 min_sdk_version: "Z", // non-final
1286 }
1287
1288 cc_library {
1289 name: "mylib",
1290 srcs: ["mylib.cpp"],
1291 shared_libs: ["libstub"],
1292 apex_available: ["myapex"],
1293 min_sdk_version: "Z",
1294 }
1295
1296 apex_key {
1297 name: "myapex.key",
1298 public_key: "testkey.avbpubkey",
1299 private_key: "testkey.pem",
1300 }
1301
1302 apex {
1303 name: "otherapex",
1304 key: "myapex.key",
1305 native_shared_libs: ["libstub"],
1306 min_sdk_version: "29",
1307 }
1308
1309 cc_library {
1310 name: "libstub",
1311 srcs: ["mylib.cpp"],
1312 stubs: {
1313 versions: ["29", "Z", "current"],
1314 },
1315 apex_available: ["otherapex"],
1316 min_sdk_version: "29",
1317 }
1318
1319 // platform module depending on libstub from otherapex should use the latest stub("current")
1320 cc_library {
1321 name: "libplatform",
1322 srcs: ["mylib.cpp"],
1323 shared_libs: ["libstub"],
1324 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001325 `,
1326 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1327 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1328 variables.Platform_sdk_final = proptools.BoolPtr(false)
1329 variables.Platform_version_active_codenames = []string{"Z"}
1330 }),
1331 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332
Jiyong Park55549df2021-02-26 23:57:23 +09001333 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001337 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001338
1339 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1340 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1341 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1342 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1343 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1344}
1345
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001346func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001347 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001348 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001349 name: "myapex2",
1350 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001351 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001352 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001353 }
1354
1355 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001356 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001357 public_key: "testkey.avbpubkey",
1358 private_key: "testkey.pem",
1359 }
1360
1361 cc_library {
1362 name: "mylib",
1363 srcs: ["mylib.cpp"],
1364 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001365 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001366 system_shared_libs: [],
1367 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001368 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001369 }
1370
1371 cc_library {
1372 name: "libfoo",
1373 srcs: ["mylib.cpp"],
1374 shared_libs: ["libbar"],
1375 system_shared_libs: [],
1376 stl: "none",
1377 stubs: {
1378 versions: ["10", "20", "30"],
1379 },
1380 }
1381
1382 cc_library {
1383 name: "libbar",
1384 srcs: ["mylib.cpp"],
1385 system_shared_libs: [],
1386 stl: "none",
1387 }
1388
Jiyong Park678c8812020-02-07 17:25:49 +09001389 cc_library_static {
1390 name: "libbaz",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 apex_available: [ "myapex2" ],
1395 }
1396
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001397 `)
1398
Jooyung Hana0503a52023-08-23 13:12:50 +09001399 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001400 copyCmds := apexRule.Args["copy_commands"]
1401
1402 // Ensure that direct non-stubs dep is always included
1403 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1404
1405 // Ensure that indirect stubs dep is not included
1406 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1407
1408 // Ensure that dependency of stubs is not included
1409 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1410
Colin Crossaede88c2020-08-11 12:17:01 -07001411 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001412
1413 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001414 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001415 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001416 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001417
Jiyong Park3ff16992019-12-27 14:11:47 +09001418 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419
1420 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1421 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001422
Colin Crossf61d03d2023-11-02 16:56:39 -07001423 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1424 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001425 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001426
Colin Crossf61d03d2023-11-02 16:56:39 -07001427 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1428 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001429 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001430}
1431
Jooyung Hand3639552019-08-09 12:57:43 +09001432func TestApexWithRuntimeLibsDependency(t *testing.T) {
1433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001561 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 cc_library {
1563 name: "libc",
1564 no_libcrt: true,
1565 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001566 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567 stl: "none",
1568 system_shared_libs: [],
1569 stubs: { versions: ["1"] },
1570 apex_available: ["com.android.runtime"],
1571
1572 sanitize: {
1573 hwaddress: true,
1574 }
1575 }
1576
1577 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001578 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001579 no_libcrt: true,
1580 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001581 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001582 stl: "none",
1583 system_shared_libs: [],
1584 srcs: [""],
1585 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001586 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001587
1588 sanitize: {
1589 never: true,
1590 },
Spandan Das4de7b492023-05-05 21:13:01 +00001591 apex_available: [
1592 "//apex_available:anyapex",
1593 "//apex_available:platform",
1594 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001595 } `)
1596 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001597
Jooyung Hana0503a52023-08-23 13:12:50 +09001598 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001599 "lib64/bionic/libc.so",
1600 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1601 })
1602
Colin Cross4c4c1be2022-02-10 11:41:18 -08001603 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604
1605 installed := hwasan.Description("install libclang_rt.hwasan")
1606 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1607
1608 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1609 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1610 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1611}
1612
1613func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001614 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001615 prepareForTestOfRuntimeApexWithHwasan,
1616 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1617 variables.SanitizeDevice = []string{"hwaddress"}
1618 }),
1619 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001620 cc_library {
1621 name: "libc",
1622 no_libcrt: true,
1623 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001624 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625 stl: "none",
1626 system_shared_libs: [],
1627 stubs: { versions: ["1"] },
1628 apex_available: ["com.android.runtime"],
1629 }
1630
1631 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001632 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001633 no_libcrt: true,
1634 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001635 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001636 stl: "none",
1637 system_shared_libs: [],
1638 srcs: [""],
1639 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001640 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001641
1642 sanitize: {
1643 never: true,
1644 },
Spandan Das4de7b492023-05-05 21:13:01 +00001645 apex_available: [
1646 "//apex_available:anyapex",
1647 "//apex_available:platform",
1648 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001649 }
Paul Duffina02cae32021-03-09 01:44:06 +00001650 `)
1651 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001652
Jooyung Hana0503a52023-08-23 13:12:50 +09001653 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654 "lib64/bionic/libc.so",
1655 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1656 })
1657
Colin Cross4c4c1be2022-02-10 11:41:18 -08001658 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001659
1660 installed := hwasan.Description("install libclang_rt.hwasan")
1661 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1662
1663 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1664 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1665 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1666}
1667
Jooyung Han61b66e92020-03-21 14:21:46 +00001668func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1669 testcases := []struct {
1670 name string
1671 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001672 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 shouldLink string
1674 shouldNotLink []string
1675 }{
1676 {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001678 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001679 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001680 shouldLink: "current",
1681 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 },
1683 {
Jiyong Park55549df2021-02-26 23:57:23 +09001684 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001685 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001686 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001687 shouldLink: "current",
1688 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001689 },
1690 }
1691 for _, tc := range testcases {
1692 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001693 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001694 apex {
1695 name: "myapex",
1696 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001697 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001698 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001699 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001701
Jooyung Han61b66e92020-03-21 14:21:46 +00001702 apex_key {
1703 name: "myapex.key",
1704 public_key: "testkey.avbpubkey",
1705 private_key: "testkey.pem",
1706 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001707
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 cc_library {
1709 name: "mylib",
1710 srcs: ["mylib.cpp"],
1711 vendor_available: true,
1712 shared_libs: ["libbar"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001717 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001718
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 cc_library {
1720 name: "libbar",
1721 srcs: ["mylib.cpp"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001725 llndk: {
1726 symbol_file: "libbar.map.txt",
1727 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001728 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001729 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001730 withUnbundledBuild,
1731 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001732
Jooyung Han61b66e92020-03-21 14:21:46 +00001733 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001734 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001735 "lib64/mylib.so",
1736 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001737
Jooyung Han61b66e92020-03-21 14:21:46 +00001738 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001739 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001740 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1741 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001742
Steven Moreland2c4000c2021-04-27 02:08:49 +00001743 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001745 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001746 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001747 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001748
Steven Moreland2c4000c2021-04-27 02:08:49 +00001749 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001750 ver := tc.shouldLink
1751 if tc.shouldLink == "current" {
1752 ver = strconv.Itoa(android.FutureApiLevelInt)
1753 }
1754 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001755 })
1756 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001757}
1758
Jiyong Park25fc6a92018-11-18 18:02:45 +09001759func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001760 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001761 apex {
1762 name: "myapex",
1763 key: "myapex.key",
1764 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001765 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 }
1767
1768 apex_key {
1769 name: "myapex.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
1773
1774 cc_library {
1775 name: "mylib",
1776 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001777 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001778 shared_libs: ["libdl#27"],
1779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001780 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781 }
1782
1783 cc_library_shared {
1784 name: "mylib_shared",
1785 srcs: ["mylib.cpp"],
1786 shared_libs: ["libdl#27"],
1787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001788 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 }
1790
1791 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001792 name: "libBootstrap",
1793 srcs: ["mylib.cpp"],
1794 stl: "none",
1795 bootstrap: true,
1796 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001797 `)
1798
Jooyung Hana0503a52023-08-23 13:12:50 +09001799 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800 copyCmds := apexRule.Args["copy_commands"]
1801
1802 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001803 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001804 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1805 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806
1807 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001808 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001809
Colin Crossaede88c2020-08-11 12:17:01 -07001810 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1811 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1812 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001813
1814 // For dependency to libc
1815 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001816 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001818 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001819 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001820 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1821 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822
1823 // For dependency to libm
1824 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001825 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001827 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001828 // ... and is not compiling with the stub
1829 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1830 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1831
1832 // For dependency to libdl
1833 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001834 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001835 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001836 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1837 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001838 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001839 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... Cflags from stub is correctly exported to mylib
1841 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1842 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001843
1844 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001845 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1846 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1847 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1848 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001849}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001850
Jooyung Han749dc692020-04-15 11:03:39 +09001851func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001852 // there are three links between liba --> libz.
1853 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001854 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001855 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001856 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001857 apex {
1858 name: "myapex",
1859 key: "myapex.key",
1860 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001861 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001862 }
1863
1864 apex {
1865 name: "otherapex",
1866 key: "myapex.key",
1867 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001868 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001869 }
1870
1871 apex_key {
1872 name: "myapex.key",
1873 public_key: "testkey.avbpubkey",
1874 private_key: "testkey.pem",
1875 }
1876
1877 cc_library {
1878 name: "libx",
1879 shared_libs: ["liba"],
1880 system_shared_libs: [],
1881 stl: "none",
1882 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001883 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001884 }
1885
1886 cc_library {
1887 name: "liby",
1888 shared_libs: ["liba"],
1889 system_shared_libs: [],
1890 stl: "none",
1891 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001892 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001893 }
1894
1895 cc_library {
1896 name: "liba",
1897 shared_libs: ["libz"],
1898 system_shared_libs: [],
1899 stl: "none",
1900 apex_available: [
1901 "//apex_available:anyapex",
1902 "//apex_available:platform",
1903 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001904 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001905 }
1906
1907 cc_library {
1908 name: "libz",
1909 system_shared_libs: [],
1910 stl: "none",
1911 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001912 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001913 },
1914 }
Jooyung Han749dc692020-04-15 11:03:39 +09001915 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001916
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 }
1925 // platform liba is linked to non-stub version
1926 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001927 // liba in myapex is linked to current
1928 expectLink("liba", "shared_apex29", "libz", "shared_current")
1929 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001930 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001931 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001932 // liba in otherapex is linked to current
1933 expectLink("liba", "shared_apex30", "libz", "shared_current")
1934 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001935 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1936 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001937}
1938
Jooyung Hanaed150d2020-04-02 01:41:41 +09001939func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001940 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001941 apex {
1942 name: "myapex",
1943 key: "myapex.key",
1944 native_shared_libs: ["libx"],
1945 min_sdk_version: "R",
1946 }
1947
1948 apex_key {
1949 name: "myapex.key",
1950 public_key: "testkey.avbpubkey",
1951 private_key: "testkey.pem",
1952 }
1953
1954 cc_library {
1955 name: "libx",
1956 shared_libs: ["libz"],
1957 system_shared_libs: [],
1958 stl: "none",
1959 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001960 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001961 }
1962
1963 cc_library {
1964 name: "libz",
1965 system_shared_libs: [],
1966 stl: "none",
1967 stubs: {
1968 versions: ["29", "R"],
1969 },
1970 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001971 `,
1972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1973 variables.Platform_version_active_codenames = []string{"R"}
1974 }),
1975 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001976
1977 expectLink := func(from, from_variant, to, to_variant string) {
1978 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1979 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1980 }
1981 expectNoLink := func(from, from_variant, to, to_variant string) {
1982 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1983 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1984 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001985 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1986 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001987 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1988 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001989}
1990
Jooyung Han4c4da062021-06-23 10:23:16 +09001991func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1992 testApex(t, `
1993 apex {
1994 name: "myapex",
1995 key: "myapex.key",
1996 java_libs: ["libx"],
1997 min_sdk_version: "S",
1998 }
1999
2000 apex_key {
2001 name: "myapex.key",
2002 public_key: "testkey.avbpubkey",
2003 private_key: "testkey.pem",
2004 }
2005
2006 java_library {
2007 name: "libx",
2008 srcs: ["a.java"],
2009 apex_available: [ "myapex" ],
2010 sdk_version: "current",
2011 min_sdk_version: "S", // should be okay
2012 }
2013 `,
2014 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2015 variables.Platform_version_active_codenames = []string{"S"}
2016 variables.Platform_sdk_codename = proptools.StringPtr("S")
2017 }),
2018 )
2019}
2020
Jooyung Han749dc692020-04-15 11:03:39 +09002021func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002022 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002023 apex {
2024 name: "myapex",
2025 key: "myapex.key",
2026 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002027 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002028 }
2029
2030 apex_key {
2031 name: "myapex.key",
2032 public_key: "testkey.avbpubkey",
2033 private_key: "testkey.pem",
2034 }
2035
2036 cc_library {
2037 name: "libx",
2038 shared_libs: ["libz"],
2039 system_shared_libs: [],
2040 stl: "none",
2041 apex_available: [ "myapex" ],
2042 }
2043
2044 cc_library {
2045 name: "libz",
2046 system_shared_libs: [],
2047 stl: "none",
2048 stubs: {
2049 versions: ["1", "2"],
2050 },
2051 }
2052 `)
2053
2054 expectLink := func(from, from_variant, to, to_variant string) {
2055 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2056 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2057 }
2058 expectNoLink := func(from, from_variant, to, to_variant string) {
2059 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2060 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2061 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002062 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002063 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002064 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002065 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002066}
2067
Jooyung Handfc864c2023-03-20 18:19:07 +09002068func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002069 ctx := testApex(t, `
2070 apex {
2071 name: "myapex",
2072 key: "myapex.key",
2073 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002074 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002075 vendor: true,
2076 min_sdk_version: "29",
2077 }
2078
2079 apex_key {
2080 name: "myapex.key",
2081 public_key: "testkey.avbpubkey",
2082 private_key: "testkey.pem",
2083 }
2084
2085 cc_library {
2086 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002087 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002088 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002089 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002090 shared_libs: ["libbar"],
2091 }
2092
2093 cc_library {
2094 name: "libbar",
2095 stubs: { versions: ["29", "30"] },
2096 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002097 }
2098 `)
2099
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002100 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002101
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002102 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002103
2104 // Ensure that mylib links with "current" LLNDK
2105 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002106 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002107
2108 // Ensure that mylib is targeting 29
2109 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2110 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2111
2112 // Ensure that the correct variant of crtbegin_so is used.
2113 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2114 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002115
2116 // Ensure that the crtbegin_so used by the APEX is targeting 29
2117 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2118 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2119}
2120
Jooyung Han4495f842023-04-25 16:39:59 +09002121func TestTrackAllowedDeps(t *testing.T) {
2122 ctx := testApex(t, `
2123 apex {
2124 name: "myapex",
2125 key: "myapex.key",
2126 updatable: true,
2127 native_shared_libs: [
2128 "mylib",
2129 "yourlib",
2130 ],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex {
2135 name: "myapex2",
2136 key: "myapex.key",
2137 updatable: false,
2138 native_shared_libs: ["yourlib"],
2139 }
2140
2141 apex_key {
2142 name: "myapex.key",
2143 public_key: "testkey.avbpubkey",
2144 private_key: "testkey.pem",
2145 }
2146
2147 cc_library {
2148 name: "mylib",
2149 srcs: ["mylib.cpp"],
2150 shared_libs: ["libbar"],
2151 min_sdk_version: "29",
2152 apex_available: ["myapex"],
2153 }
2154
2155 cc_library {
2156 name: "libbar",
2157 stubs: { versions: ["29", "30"] },
2158 }
2159
2160 cc_library {
2161 name: "yourlib",
2162 srcs: ["mylib.cpp"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2165 }
2166 `, withFiles(android.MockFS{
2167 "packages/modules/common/build/allowed_deps.txt": nil,
2168 }))
2169
2170 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2171 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2172 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002173 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002174 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002175 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002176
Jooyung Hana0503a52023-08-23 13:12:50 +09002177 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002178 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2179 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002180 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2181 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2182 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2183 flatlist, "mylib:(minSdkVersion:29)")
2184 android.AssertStringListContains(t, "track platform-available lib",
2185 flatlist, "yourlib(minSdkVersion:29)")
2186}
2187
2188func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2189 ctx := testApex(t, `
2190 apex {
2191 name: "myapex",
2192 key: "myapex.key",
2193 updatable: true,
2194 min_sdk_version: "29",
2195 }
2196
2197 apex_key {
2198 name: "myapex.key",
2199 public_key: "testkey.avbpubkey",
2200 private_key: "testkey.pem",
2201 }
2202 `)
2203 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2204 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2205 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2206 }
2207}
2208
Jooyung Han03b51852020-02-26 22:45:42 +09002209func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002210 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002211 apex {
2212 name: "myapex",
2213 key: "myapex.key",
2214 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002215 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002216 }
2217
2218 apex_key {
2219 name: "myapex.key",
2220 public_key: "testkey.avbpubkey",
2221 private_key: "testkey.pem",
2222 }
2223
2224 cc_library {
2225 name: "libx",
2226 system_shared_libs: [],
2227 stl: "none",
2228 apex_available: [ "myapex" ],
2229 stubs: {
2230 versions: ["1", "2"],
2231 },
2232 }
2233
2234 cc_library {
2235 name: "libz",
2236 shared_libs: ["libx"],
2237 system_shared_libs: [],
2238 stl: "none",
2239 }
2240 `)
2241
2242 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002243 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002244 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2245 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2246 }
2247 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002248 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002249 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2250 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2251 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002252 expectLink("libz", "shared", "libx", "shared_current")
2253 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002254 expectNoLink("libz", "shared", "libz", "shared_1")
2255 expectNoLink("libz", "shared", "libz", "shared")
2256}
2257
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002258var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2259 func(variables android.FixtureProductVariables) {
2260 variables.SanitizeDevice = []string{"hwaddress"}
2261 },
2262)
2263
Jooyung Han75568392020-03-20 04:29:24 +09002264func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002265 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["libx"],
2270 min_sdk_version: "29",
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 cc_library {
2280 name: "libx",
2281 shared_libs: ["libbar"],
2282 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002283 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002284 }
2285
2286 cc_library {
2287 name: "libbar",
2288 stubs: {
2289 versions: ["29", "30"],
2290 },
2291 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002292 `,
2293 prepareForTestWithSantitizeHwaddress,
2294 )
Jooyung Han03b51852020-02-26 22:45:42 +09002295 expectLink := func(from, from_variant, to, to_variant string) {
2296 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2297 libFlags := ld.Args["libFlags"]
2298 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2299 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002300 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002301}
2302
Jooyung Han75568392020-03-20 04:29:24 +09002303func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002304 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002305 apex {
2306 name: "myapex",
2307 key: "myapex.key",
2308 native_shared_libs: ["libx"],
2309 min_sdk_version: "29",
2310 }
2311
2312 apex_key {
2313 name: "myapex.key",
2314 public_key: "testkey.avbpubkey",
2315 private_key: "testkey.pem",
2316 }
2317
2318 cc_library {
2319 name: "libx",
2320 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002321 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002322 }
Jooyung Han75568392020-03-20 04:29:24 +09002323 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002324
2325 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002326 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002327 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002328 // note that platform variant is not.
2329 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002330 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002331}
2332
Jooyung Han749dc692020-04-15 11:03:39 +09002333func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2334 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002335 apex {
2336 name: "myapex",
2337 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002338 native_shared_libs: ["mylib"],
2339 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002340 }
2341
2342 apex_key {
2343 name: "myapex.key",
2344 public_key: "testkey.avbpubkey",
2345 private_key: "testkey.pem",
2346 }
Jooyung Han749dc692020-04-15 11:03:39 +09002347
2348 cc_library {
2349 name: "mylib",
2350 srcs: ["mylib.cpp"],
2351 system_shared_libs: [],
2352 stl: "none",
2353 apex_available: [
2354 "myapex",
2355 ],
2356 min_sdk_version: "30",
2357 }
2358 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002359
2360 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["libfoo.ffi"],
2365 min_sdk_version: "29",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373
2374 rust_ffi_shared {
2375 name: "libfoo.ffi",
2376 srcs: ["foo.rs"],
2377 crate_name: "foo",
2378 apex_available: [
2379 "myapex",
2380 ],
2381 min_sdk_version: "30",
2382 }
2383 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002384
2385 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2386 apex {
2387 name: "myapex",
2388 key: "myapex.key",
2389 java_libs: ["libfoo"],
2390 min_sdk_version: "29",
2391 }
2392
2393 apex_key {
2394 name: "myapex.key",
2395 public_key: "testkey.avbpubkey",
2396 private_key: "testkey.pem",
2397 }
2398
2399 java_import {
2400 name: "libfoo",
2401 jars: ["libfoo.jar"],
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "30",
2406 }
2407 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002408
2409 // Skip check for modules compiling against core API surface
2410 testApex(t, `
2411 apex {
2412 name: "myapex",
2413 key: "myapex.key",
2414 java_libs: ["libfoo"],
2415 min_sdk_version: "29",
2416 }
2417
2418 apex_key {
2419 name: "myapex.key",
2420 public_key: "testkey.avbpubkey",
2421 private_key: "testkey.pem",
2422 }
2423
2424 java_library {
2425 name: "libfoo",
2426 srcs: ["Foo.java"],
2427 apex_available: [
2428 "myapex",
2429 ],
2430 // Compile against core API surface
2431 sdk_version: "core_current",
2432 min_sdk_version: "30",
2433 }
2434 `)
2435
Jooyung Han749dc692020-04-15 11:03:39 +09002436}
2437
2438func TestApexMinSdkVersion_Okay(t *testing.T) {
2439 testApex(t, `
2440 apex {
2441 name: "myapex",
2442 key: "myapex.key",
2443 native_shared_libs: ["libfoo"],
2444 java_libs: ["libbar"],
2445 min_sdk_version: "29",
2446 }
2447
2448 apex_key {
2449 name: "myapex.key",
2450 public_key: "testkey.avbpubkey",
2451 private_key: "testkey.pem",
2452 }
2453
2454 cc_library {
2455 name: "libfoo",
2456 srcs: ["mylib.cpp"],
2457 shared_libs: ["libfoo_dep"],
2458 apex_available: ["myapex"],
2459 min_sdk_version: "29",
2460 }
2461
2462 cc_library {
2463 name: "libfoo_dep",
2464 srcs: ["mylib.cpp"],
2465 apex_available: ["myapex"],
2466 min_sdk_version: "29",
2467 }
2468
2469 java_library {
2470 name: "libbar",
2471 sdk_version: "current",
2472 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002473 static_libs: [
2474 "libbar_dep",
2475 "libbar_import_dep",
2476 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002477 apex_available: ["myapex"],
2478 min_sdk_version: "29",
2479 }
2480
2481 java_library {
2482 name: "libbar_dep",
2483 sdk_version: "current",
2484 srcs: ["a.java"],
2485 apex_available: ["myapex"],
2486 min_sdk_version: "29",
2487 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002488
2489 java_import {
2490 name: "libbar_import_dep",
2491 jars: ["libbar.jar"],
2492 apex_available: ["myapex"],
2493 min_sdk_version: "29",
2494 }
Jooyung Han03b51852020-02-26 22:45:42 +09002495 `)
2496}
2497
Colin Cross8ca61c12022-10-06 21:00:14 -07002498func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2499 // Tests that an apex dependency with min_sdk_version higher than the
2500 // min_sdk_version of the apex is allowed as long as the dependency's
2501 // min_sdk_version is less than or equal to the api level that the
2502 // architecture was introduced in. In this case, arm64 didn't exist
2503 // until api level 21, so the arm64 code will never need to run on
2504 // an api level 20 device, even if other architectures of the apex
2505 // will.
2506 testApex(t, `
2507 apex {
2508 name: "myapex",
2509 key: "myapex.key",
2510 native_shared_libs: ["libfoo"],
2511 min_sdk_version: "20",
2512 }
2513
2514 apex_key {
2515 name: "myapex.key",
2516 public_key: "testkey.avbpubkey",
2517 private_key: "testkey.pem",
2518 }
2519
2520 cc_library {
2521 name: "libfoo",
2522 srcs: ["mylib.cpp"],
2523 apex_available: ["myapex"],
2524 min_sdk_version: "21",
2525 stl: "none",
2526 }
2527 `)
2528}
2529
Artur Satayev8cf899a2020-04-15 17:29:42 +01002530func TestJavaStableSdkVersion(t *testing.T) {
2531 testCases := []struct {
2532 name string
2533 expectedError string
2534 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 }{
2537 {
2538 name: "Non-updatable apex with non-stable dep",
2539 bp: `
2540 apex {
2541 name: "myapex",
2542 java_libs: ["myjar"],
2543 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002544 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002545 }
2546 apex_key {
2547 name: "myapex.key",
2548 public_key: "testkey.avbpubkey",
2549 private_key: "testkey.pem",
2550 }
2551 java_library {
2552 name: "myjar",
2553 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002554 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002555 apex_available: ["myapex"],
2556 }
2557 `,
2558 },
2559 {
2560 name: "Updatable apex with stable dep",
2561 bp: `
2562 apex {
2563 name: "myapex",
2564 java_libs: ["myjar"],
2565 key: "myapex.key",
2566 updatable: true,
2567 min_sdk_version: "29",
2568 }
2569 apex_key {
2570 name: "myapex.key",
2571 public_key: "testkey.avbpubkey",
2572 private_key: "testkey.pem",
2573 }
2574 java_library {
2575 name: "myjar",
2576 srcs: ["foo/bar/MyClass.java"],
2577 sdk_version: "current",
2578 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002579 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002580 }
2581 `,
2582 },
2583 {
2584 name: "Updatable apex with non-stable dep",
2585 expectedError: "cannot depend on \"myjar\"",
2586 bp: `
2587 apex {
2588 name: "myapex",
2589 java_libs: ["myjar"],
2590 key: "myapex.key",
2591 updatable: true,
2592 }
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598 java_library {
2599 name: "myjar",
2600 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002601 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002602 apex_available: ["myapex"],
2603 }
2604 `,
2605 },
2606 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002607 name: "Updatable apex with non-stable legacy core platform dep",
2608 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2609 bp: `
2610 apex {
2611 name: "myapex",
2612 java_libs: ["myjar-uses-legacy"],
2613 key: "myapex.key",
2614 updatable: true,
2615 }
2616 apex_key {
2617 name: "myapex.key",
2618 public_key: "testkey.avbpubkey",
2619 private_key: "testkey.pem",
2620 }
2621 java_library {
2622 name: "myjar-uses-legacy",
2623 srcs: ["foo/bar/MyClass.java"],
2624 sdk_version: "core_platform",
2625 apex_available: ["myapex"],
2626 }
2627 `,
2628 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2629 },
2630 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002631 name: "Updatable apex with non-stable transitive dep",
2632 // This is not actually detecting that the transitive dependency is unstable, rather it is
2633 // detecting that the transitive dependency is building against a wider API surface than the
2634 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002635 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002636 bp: `
2637 apex {
2638 name: "myapex",
2639 java_libs: ["myjar"],
2640 key: "myapex.key",
2641 updatable: true,
2642 }
2643 apex_key {
2644 name: "myapex.key",
2645 public_key: "testkey.avbpubkey",
2646 private_key: "testkey.pem",
2647 }
2648 java_library {
2649 name: "myjar",
2650 srcs: ["foo/bar/MyClass.java"],
2651 sdk_version: "current",
2652 apex_available: ["myapex"],
2653 static_libs: ["transitive-jar"],
2654 }
2655 java_library {
2656 name: "transitive-jar",
2657 srcs: ["foo/bar/MyClass.java"],
2658 sdk_version: "core_platform",
2659 apex_available: ["myapex"],
2660 }
2661 `,
2662 },
2663 }
2664
2665 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002666 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2667 continue
2668 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002669 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002670 errorHandler := android.FixtureExpectsNoErrors
2671 if test.expectedError != "" {
2672 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002673 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002674 android.GroupFixturePreparers(
2675 java.PrepareForTestWithJavaDefaultModules,
2676 PrepareForTestWithApexBuildComponents,
2677 prepareForTestWithMyapex,
2678 android.OptionalFixturePreparer(test.preparer),
2679 ).
2680 ExtendWithErrorHandler(errorHandler).
2681 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002682 })
2683 }
2684}
2685
Jooyung Han749dc692020-04-15 11:03:39 +09002686func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2687 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2688 apex {
2689 name: "myapex",
2690 key: "myapex.key",
2691 native_shared_libs: ["mylib"],
2692 min_sdk_version: "29",
2693 }
2694
2695 apex_key {
2696 name: "myapex.key",
2697 public_key: "testkey.avbpubkey",
2698 private_key: "testkey.pem",
2699 }
2700
2701 cc_library {
2702 name: "mylib",
2703 srcs: ["mylib.cpp"],
2704 shared_libs: ["mylib2"],
2705 system_shared_libs: [],
2706 stl: "none",
2707 apex_available: [
2708 "myapex",
2709 ],
2710 min_sdk_version: "29",
2711 }
2712
2713 // indirect part of the apex
2714 cc_library {
2715 name: "mylib2",
2716 srcs: ["mylib.cpp"],
2717 system_shared_libs: [],
2718 stl: "none",
2719 apex_available: [
2720 "myapex",
2721 ],
2722 min_sdk_version: "30",
2723 }
2724 `)
2725}
2726
2727func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2728 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 apps: ["AppFoo"],
2733 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002734 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002735 }
2736
2737 apex_key {
2738 name: "myapex.key",
2739 public_key: "testkey.avbpubkey",
2740 private_key: "testkey.pem",
2741 }
2742
2743 android_app {
2744 name: "AppFoo",
2745 srcs: ["foo/bar/MyClass.java"],
2746 sdk_version: "current",
2747 min_sdk_version: "29",
2748 system_modules: "none",
2749 stl: "none",
2750 static_libs: ["bar"],
2751 apex_available: [ "myapex" ],
2752 }
2753
2754 java_library {
2755 name: "bar",
2756 sdk_version: "current",
2757 srcs: ["a.java"],
2758 apex_available: [ "myapex" ],
2759 }
2760 `)
2761}
2762
2763func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002764 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002765 apex {
2766 name: "myapex",
2767 key: "myapex.key",
2768 native_shared_libs: ["mylib"],
2769 min_sdk_version: "29",
2770 }
2771
2772 apex_key {
2773 name: "myapex.key",
2774 public_key: "testkey.avbpubkey",
2775 private_key: "testkey.pem",
2776 }
2777
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002778 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002779 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2780 cc_library {
2781 name: "mylib",
2782 srcs: ["mylib.cpp"],
2783 shared_libs: ["mylib2"],
2784 system_shared_libs: [],
2785 stl: "none",
2786 apex_available: ["myapex", "otherapex"],
2787 min_sdk_version: "29",
2788 }
2789
2790 cc_library {
2791 name: "mylib2",
2792 srcs: ["mylib.cpp"],
2793 system_shared_libs: [],
2794 stl: "none",
2795 apex_available: ["otherapex"],
2796 stubs: { versions: ["29", "30"] },
2797 min_sdk_version: "30",
2798 }
2799
2800 apex {
2801 name: "otherapex",
2802 key: "myapex.key",
2803 native_shared_libs: ["mylib", "mylib2"],
2804 min_sdk_version: "30",
2805 }
2806 `)
2807 expectLink := func(from, from_variant, to, to_variant string) {
2808 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2809 libFlags := ld.Args["libFlags"]
2810 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2811 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002812 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002813 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002814}
2815
Jooyung Haned124c32021-01-26 11:43:46 +09002816func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002817 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2818 func(variables android.FixtureProductVariables) {
2819 variables.Platform_sdk_codename = proptools.StringPtr("S")
2820 variables.Platform_version_active_codenames = []string{"S"}
2821 },
2822 )
Jooyung Haned124c32021-01-26 11:43:46 +09002823 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2824 apex {
2825 name: "myapex",
2826 key: "myapex.key",
2827 native_shared_libs: ["libfoo"],
2828 min_sdk_version: "S",
2829 }
2830 apex_key {
2831 name: "myapex.key",
2832 public_key: "testkey.avbpubkey",
2833 private_key: "testkey.pem",
2834 }
2835 cc_library {
2836 name: "libfoo",
2837 shared_libs: ["libbar"],
2838 apex_available: ["myapex"],
2839 min_sdk_version: "29",
2840 }
2841 cc_library {
2842 name: "libbar",
2843 apex_available: ["myapex"],
2844 }
2845 `, withSAsActiveCodeNames)
2846}
2847
2848func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002849 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2850 variables.Platform_sdk_codename = proptools.StringPtr("S")
2851 variables.Platform_version_active_codenames = []string{"S", "T"}
2852 })
Colin Cross1c460562021-02-16 17:55:47 -08002853 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002854 apex {
2855 name: "myapex",
2856 key: "myapex.key",
2857 native_shared_libs: ["libfoo"],
2858 min_sdk_version: "S",
2859 }
2860 apex_key {
2861 name: "myapex.key",
2862 public_key: "testkey.avbpubkey",
2863 private_key: "testkey.pem",
2864 }
2865 cc_library {
2866 name: "libfoo",
2867 shared_libs: ["libbar"],
2868 apex_available: ["myapex"],
2869 min_sdk_version: "S",
2870 }
2871 cc_library {
2872 name: "libbar",
2873 stubs: {
2874 symbol_file: "libbar.map.txt",
2875 versions: ["30", "S", "T"],
2876 },
2877 }
2878 `, withSAsActiveCodeNames)
2879
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002880 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002881 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2882 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002883 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002884}
2885
Jiyong Park7c2ee712018-12-07 00:42:25 +09002886func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002887 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002888 apex {
2889 name: "myapex",
2890 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002891 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002892 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002893 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002894 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002895 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002896 }
2897
2898 apex_key {
2899 name: "myapex.key",
2900 public_key: "testkey.avbpubkey",
2901 private_key: "testkey.pem",
2902 }
2903
2904 prebuilt_etc {
2905 name: "myetc",
2906 src: "myprebuilt",
2907 sub_dir: "foo/bar",
2908 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002909
2910 cc_library {
2911 name: "mylib",
2912 srcs: ["mylib.cpp"],
2913 relative_install_path: "foo/bar",
2914 system_shared_libs: [],
2915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002916 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002917 }
2918
2919 cc_binary {
2920 name: "mybin",
2921 srcs: ["mylib.cpp"],
2922 relative_install_path: "foo/bar",
2923 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002924 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002925 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002926 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002927
2928 rust_binary {
2929 name: "mybin.rust",
2930 srcs: ["foo.rs"],
2931 relative_install_path: "rust_subdir",
2932 apex_available: [ "myapex" ],
2933 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002934 `)
2935
Jooyung Hana0503a52023-08-23 13:12:50 +09002936 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002937 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002938
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002939 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002940 ensureContains(t, cmd, "/etc ")
2941 ensureContains(t, cmd, "/etc/foo ")
2942 ensureContains(t, cmd, "/etc/foo/bar ")
2943 ensureContains(t, cmd, "/lib64 ")
2944 ensureContains(t, cmd, "/lib64/foo ")
2945 ensureContains(t, cmd, "/lib64/foo/bar ")
2946 ensureContains(t, cmd, "/lib ")
2947 ensureContains(t, cmd, "/lib/foo ")
2948 ensureContains(t, cmd, "/lib/foo/bar ")
2949 ensureContains(t, cmd, "/bin ")
2950 ensureContains(t, cmd, "/bin/foo ")
2951 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002952 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002953}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002954
Jooyung Han35155c42020-02-06 17:33:20 +09002955func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002956 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 multilib: {
2961 both: {
2962 native_shared_libs: ["mylib"],
2963 binaries: ["mybin"],
2964 },
2965 },
2966 compile_multilib: "both",
2967 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002968 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002969 }
2970
2971 apex_key {
2972 name: "myapex.key",
2973 public_key: "testkey.avbpubkey",
2974 private_key: "testkey.pem",
2975 }
2976
2977 cc_library {
2978 name: "mylib",
2979 relative_install_path: "foo/bar",
2980 system_shared_libs: [],
2981 stl: "none",
2982 apex_available: [ "myapex" ],
2983 native_bridge_supported: true,
2984 }
2985
2986 cc_binary {
2987 name: "mybin",
2988 relative_install_path: "foo/bar",
2989 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002990 stl: "none",
2991 apex_available: [ "myapex" ],
2992 native_bridge_supported: true,
2993 compile_multilib: "both", // default is "first" for binary
2994 multilib: {
2995 lib64: {
2996 suffix: "64",
2997 },
2998 },
2999 }
3000 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003001 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003002 "bin/foo/bar/mybin",
3003 "bin/foo/bar/mybin64",
3004 "bin/arm/foo/bar/mybin",
3005 "bin/arm64/foo/bar/mybin64",
3006 "lib/foo/bar/mylib.so",
3007 "lib/arm/foo/bar/mylib.so",
3008 "lib64/foo/bar/mylib.so",
3009 "lib64/arm64/foo/bar/mylib.so",
3010 })
3011}
3012
Jooyung Han85d61762020-06-24 23:50:26 +09003013func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08003014 result := android.GroupFixturePreparers(
3015 prepareForApexTest,
3016 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3017 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003018 apex {
3019 name: "myapex",
3020 key: "myapex.key",
3021 binaries: ["mybin"],
3022 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003023 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003024 }
3025 apex_key {
3026 name: "myapex.key",
3027 public_key: "testkey.avbpubkey",
3028 private_key: "testkey.pem",
3029 }
3030 cc_binary {
3031 name: "mybin",
3032 vendor: true,
3033 shared_libs: ["libfoo"],
3034 }
3035 cc_library {
3036 name: "libfoo",
3037 proprietary: true,
3038 }
3039 `)
3040
Jooyung Hana0503a52023-08-23 13:12:50 +09003041 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003042 "bin/mybin",
3043 "lib64/libfoo.so",
3044 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3045 "lib64/libc++.so",
3046 })
3047
Jooyung Hana0503a52023-08-23 13:12:50 +09003048 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003049 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003050 name := apexBundle.BaseModuleName()
3051 prefix := "TARGET_"
3052 var builder strings.Builder
3053 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003054 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003055 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003056 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003057
Jooyung Hana0503a52023-08-23 13:12:50 +09003058 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003059 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3060 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003061}
3062
Justin Yun13decfb2021-03-08 19:25:55 +09003063func TestProductVariant(t *testing.T) {
3064 ctx := testApex(t, `
3065 apex {
3066 name: "myapex",
3067 key: "myapex.key",
3068 updatable: false,
3069 product_specific: true,
3070 binaries: ["foo"],
3071 }
3072
3073 apex_key {
3074 name: "myapex.key",
3075 public_key: "testkey.avbpubkey",
3076 private_key: "testkey.pem",
3077 }
3078
3079 cc_binary {
3080 name: "foo",
3081 product_available: true,
3082 apex_available: ["myapex"],
3083 srcs: ["foo.cpp"],
3084 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003085 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003086
3087 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003088 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003089 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3090 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3091 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3092 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3093}
3094
Jooyung Han8e5685d2020-09-21 11:02:57 +09003095func TestApex_withPrebuiltFirmware(t *testing.T) {
3096 testCases := []struct {
3097 name string
3098 additionalProp string
3099 }{
3100 {"system apex with prebuilt_firmware", ""},
3101 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3102 }
3103 for _, tc := range testCases {
3104 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003105 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003106 apex {
3107 name: "myapex",
3108 key: "myapex.key",
3109 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003110 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003111 `+tc.additionalProp+`
3112 }
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }
3118 prebuilt_firmware {
3119 name: "myfirmware",
3120 src: "myfirmware.bin",
3121 filename_from_src: true,
3122 `+tc.additionalProp+`
3123 }
3124 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003125 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003126 "etc/firmware/myfirmware.bin",
3127 })
3128 })
3129 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003130}
3131
Jooyung Hanefb184e2020-06-25 17:14:25 +09003132func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003133 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003134 apex {
3135 name: "myapex",
3136 key: "myapex.key",
3137 vendor: true,
3138 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003139 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140 }
3141
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }
3147
3148 cc_library {
3149 name: "mylib",
3150 vendor_available: true,
3151 }
3152 `)
3153
Jooyung Hana0503a52023-08-23 13:12:50 +09003154 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003155 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003156 name := apexBundle.BaseModuleName()
3157 prefix := "TARGET_"
3158 var builder strings.Builder
3159 data.Custom(&builder, name, prefix, "", data)
3160 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003161 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003162}
3163
Jooyung Han2ed99d02020-06-24 23:26:26 +09003164func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003165 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003166 apex {
3167 name: "myapex",
3168 key: "myapex.key",
3169 vintf_fragments: ["fragment.xml"],
3170 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003171 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172 }
3173 apex_key {
3174 name: "myapex.key",
3175 public_key: "testkey.avbpubkey",
3176 private_key: "testkey.pem",
3177 }
3178 cc_binary {
3179 name: "mybin",
3180 }
3181 `)
3182
Jooyung Hana0503a52023-08-23 13:12:50 +09003183 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003184 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003185 name := apexBundle.BaseModuleName()
3186 prefix := "TARGET_"
3187 var builder strings.Builder
3188 data.Custom(&builder, name, prefix, "", data)
3189 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003190 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003191 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003192}
3193
Jiyong Park16e91a02018-12-20 18:18:08 +09003194func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003195 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003196 apex {
3197 name: "myapex",
3198 key: "myapex.key",
3199 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003200 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003201 }
3202
3203 apex_key {
3204 name: "myapex.key",
3205 public_key: "testkey.avbpubkey",
3206 private_key: "testkey.pem",
3207 }
3208
3209 cc_library {
3210 name: "mylib",
3211 srcs: ["mylib.cpp"],
3212 system_shared_libs: [],
3213 stl: "none",
3214 stubs: {
3215 versions: ["1", "2", "3"],
3216 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003217 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003218 }
3219
3220 cc_binary {
3221 name: "not_in_apex",
3222 srcs: ["mylib.cpp"],
3223 static_libs: ["mylib"],
3224 static_executable: true,
3225 system_shared_libs: [],
3226 stl: "none",
3227 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003228 `)
3229
Colin Cross7113d202019-11-20 16:39:12 -08003230 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003231
3232 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003233 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003234}
Jiyong Park9335a262018-12-24 11:31:58 +09003235
3236func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003237 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003238 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003239 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003240 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003241 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003242 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003243 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003244 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003245 }
3246
3247 cc_library {
3248 name: "mylib",
3249 srcs: ["mylib.cpp"],
3250 system_shared_libs: [],
3251 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003252 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254
3255 apex_key {
3256 name: "myapex.key",
3257 public_key: "testkey.avbpubkey",
3258 private_key: "testkey.pem",
3259 }
3260
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003261 android_app_certificate {
3262 name: "myapex.certificate",
3263 certificate: "testkey",
3264 }
3265
3266 android_app_certificate {
3267 name: "myapex.certificate.override",
3268 certificate: "testkey.override",
3269 }
3270
Jiyong Park9335a262018-12-24 11:31:58 +09003271 `)
3272
3273 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003274 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003275
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003276 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3277 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003278 "vendor/foo/devkeys/testkey.avbpubkey")
3279 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003280 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3281 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003282 "vendor/foo/devkeys/testkey.pem")
3283 }
3284
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003285 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003286 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003287 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003288 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003289 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003290 }
3291}
Jiyong Park58e364a2019-01-19 19:24:06 +09003292
Jooyung Hanf121a652019-12-17 14:30:11 +09003293func TestCertificate(t *testing.T) {
3294 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003295 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003296 apex {
3297 name: "myapex",
3298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003299 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003300 }
3301 apex_key {
3302 name: "myapex.key",
3303 public_key: "testkey.avbpubkey",
3304 private_key: "testkey.pem",
3305 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003306 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003307 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3308 if actual := rule.Args["certificates"]; actual != expected {
3309 t.Errorf("certificates should be %q, not %q", expected, actual)
3310 }
3311 })
3312 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003313 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003314 apex {
3315 name: "myapex_keytest",
3316 key: "myapex.key",
3317 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003318 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003319 }
3320 apex_key {
3321 name: "myapex.key",
3322 public_key: "testkey.avbpubkey",
3323 private_key: "testkey.pem",
3324 }
3325 android_app_certificate {
3326 name: "myapex.certificate.override",
3327 certificate: "testkey.override",
3328 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003329 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003330 expected := "testkey.override.x509.pem testkey.override.pk8"
3331 if actual := rule.Args["certificates"]; actual != expected {
3332 t.Errorf("certificates should be %q, not %q", expected, actual)
3333 }
3334 })
3335 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003336 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003337 apex {
3338 name: "myapex",
3339 key: "myapex.key",
3340 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003341 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003342 }
3343 apex_key {
3344 name: "myapex.key",
3345 public_key: "testkey.avbpubkey",
3346 private_key: "testkey.pem",
3347 }
3348 android_app_certificate {
3349 name: "myapex.certificate",
3350 certificate: "testkey",
3351 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003352 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003353 expected := "testkey.x509.pem testkey.pk8"
3354 if actual := rule.Args["certificates"]; actual != expected {
3355 t.Errorf("certificates should be %q, not %q", expected, actual)
3356 }
3357 })
3358 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003359 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003360 apex {
3361 name: "myapex_keytest",
3362 key: "myapex.key",
3363 file_contexts: ":myapex-file_contexts",
3364 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003365 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 }
3367 apex_key {
3368 name: "myapex.key",
3369 public_key: "testkey.avbpubkey",
3370 private_key: "testkey.pem",
3371 }
3372 android_app_certificate {
3373 name: "myapex.certificate.override",
3374 certificate: "testkey.override",
3375 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003376 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003377 expected := "testkey.override.x509.pem testkey.override.pk8"
3378 if actual := rule.Args["certificates"]; actual != expected {
3379 t.Errorf("certificates should be %q, not %q", expected, actual)
3380 }
3381 })
3382 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003383 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003384 apex {
3385 name: "myapex",
3386 key: "myapex.key",
3387 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003388 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003389 }
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003395 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003396 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3397 if actual := rule.Args["certificates"]; actual != expected {
3398 t.Errorf("certificates should be %q, not %q", expected, actual)
3399 }
3400 })
3401 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003403 apex {
3404 name: "myapex_keytest",
3405 key: "myapex.key",
3406 file_contexts: ":myapex-file_contexts",
3407 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003408 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 }
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415 android_app_certificate {
3416 name: "myapex.certificate.override",
3417 certificate: "testkey.override",
3418 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003419 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003420 expected := "testkey.override.x509.pem testkey.override.pk8"
3421 if actual := rule.Args["certificates"]; actual != expected {
3422 t.Errorf("certificates should be %q, not %q", expected, actual)
3423 }
3424 })
3425}
3426
Jiyong Park58e364a2019-01-19 19:24:06 +09003427func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003428 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003429 apex {
3430 name: "myapex",
3431 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003432 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003433 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003434 }
3435
3436 apex {
3437 name: "otherapex",
3438 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003439 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003440 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
3449 cc_library {
3450 name: "mylib",
3451 srcs: ["mylib.cpp"],
3452 system_shared_libs: [],
3453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003454 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003455 "myapex",
3456 "otherapex",
3457 ],
Jooyung Han24282772020-03-21 23:20:55 +09003458 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003459 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003460 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003461 cc_library {
3462 name: "mylib2",
3463 srcs: ["mylib.cpp"],
3464 system_shared_libs: [],
3465 stl: "none",
3466 apex_available: [
3467 "myapex",
3468 "otherapex",
3469 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003470 static_libs: ["mylib3"],
3471 recovery_available: true,
3472 min_sdk_version: "29",
3473 }
3474 cc_library {
3475 name: "mylib3",
3476 srcs: ["mylib.cpp"],
3477 system_shared_libs: [],
3478 stl: "none",
3479 apex_available: [
3480 "myapex",
3481 "otherapex",
3482 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003483 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003484 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003485 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003486 `)
3487
Jooyung Hanc87a0592020-03-02 17:44:33 +09003488 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003489 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003490 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003491
Vinh Tranf9754732023-01-19 22:41:46 -05003492 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003493 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003495
Vinh Tranf9754732023-01-19 22:41:46 -05003496 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003497 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003498 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003499
Colin Crossaede88c2020-08-11 12:17:01 -07003500 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3501 // each variant defines additional macros to distinguish which apex variant it is built for
3502
3503 // non-APEX variant does not have __ANDROID_APEX__ defined
3504 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3505 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3506
Vinh Tranf9754732023-01-19 22:41:46 -05003507 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003508 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3509 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003510
Jooyung Hanc87a0592020-03-02 17:44:33 +09003511 // non-APEX variant does not have __ANDROID_APEX__ defined
3512 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3513 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3514
Vinh Tranf9754732023-01-19 22:41:46 -05003515 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003516 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003517 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003518}
Jiyong Park7e636d02019-01-28 16:16:54 +09003519
3520func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003521 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003522 apex {
3523 name: "myapex",
3524 key: "myapex.key",
3525 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003526 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003527 }
3528
3529 apex_key {
3530 name: "myapex.key",
3531 public_key: "testkey.avbpubkey",
3532 private_key: "testkey.pem",
3533 }
3534
3535 cc_library_headers {
3536 name: "mylib_headers",
3537 export_include_dirs: ["my_include"],
3538 system_shared_libs: [],
3539 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003540 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003541 }
3542
3543 cc_library {
3544 name: "mylib",
3545 srcs: ["mylib.cpp"],
3546 system_shared_libs: [],
3547 stl: "none",
3548 header_libs: ["mylib_headers"],
3549 export_header_lib_headers: ["mylib_headers"],
3550 stubs: {
3551 versions: ["1", "2", "3"],
3552 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003553 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003554 }
3555
3556 cc_library {
3557 name: "otherlib",
3558 srcs: ["mylib.cpp"],
3559 system_shared_libs: [],
3560 stl: "none",
3561 shared_libs: ["mylib"],
3562 }
3563 `)
3564
Colin Cross7113d202019-11-20 16:39:12 -08003565 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003566
3567 // Ensure that the include path of the header lib is exported to 'otherlib'
3568 ensureContains(t, cFlags, "-Imy_include")
3569}
Alex Light9670d332019-01-29 18:07:33 -08003570
Jiyong Park7cd10e32020-01-14 09:22:18 +09003571type fileInApex struct {
3572 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003573 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003574 isLink bool
3575}
3576
Jooyung Han1724d582022-12-21 10:17:44 +09003577func (f fileInApex) String() string {
3578 return f.src + ":" + f.path
3579}
3580
3581func (f fileInApex) match(expectation string) bool {
3582 parts := strings.Split(expectation, ":")
3583 if len(parts) == 1 {
3584 match, _ := path.Match(parts[0], f.path)
3585 return match
3586 }
3587 if len(parts) == 2 {
3588 matchSrc, _ := path.Match(parts[0], f.src)
3589 matchDst, _ := path.Match(parts[1], f.path)
3590 return matchSrc && matchDst
3591 }
3592 panic("invalid expected file specification: " + expectation)
3593}
3594
Jooyung Hana57af4a2020-01-23 05:36:59 +00003595func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003596 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003597 module := ctx.ModuleForTests(moduleName, variant)
3598 apexRule := module.MaybeRule("apexRule")
3599 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003601 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003602 for _, cmd := range strings.Split(copyCmds, "&&") {
3603 cmd = strings.TrimSpace(cmd)
3604 if cmd == "" {
3605 continue
3606 }
3607 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 switch terms[0] {
3611 case "mkdir":
3612 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003613 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 t.Fatal("copyCmds contains invalid cp command", cmd)
3615 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003616 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 isLink = false
3619 case "ln":
3620 if len(terms) != 3 && len(terms) != 4 {
3621 // ln LINK TARGET or ln -s LINK TARGET
3622 t.Fatal("copyCmds contains invalid ln command", cmd)
3623 }
3624 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink = true
3627 default:
3628 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3629 }
3630 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003631 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003633 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 }
Jooyung Han1724d582022-12-21 10:17:44 +09003635 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003636 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003637 }
3638 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003639 return ret
3640}
3641
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003642func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003643 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003644 var failed bool
3645 var surplus []string
3646 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003647 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003648 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003649 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003650 if file.match(expected) {
3651 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003653 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003654 }
3655 }
Jooyung Han1724d582022-12-21 10:17:44 +09003656 if !matchFound {
3657 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003658 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003659 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003660
Jooyung Han31c470b2019-10-18 16:26:59 +09003661 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003662 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003663 t.Log("surplus files", surplus)
3664 failed = true
3665 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003666
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003667 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003669 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003670 if !filesMatched[expected] {
3671 missing = append(missing, expected)
3672 }
3673 }
3674 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003675 t.Log("missing files", missing)
3676 failed = true
3677 }
3678 if failed {
3679 t.Fail()
3680 }
3681}
3682
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003683func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3684 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3685}
3686
3687func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003688 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3690 if deapexer.Output != nil {
3691 outputs = append(outputs, deapexer.Output.String())
3692 }
3693 for _, output := range deapexer.ImplicitOutputs {
3694 outputs = append(outputs, output.String())
3695 }
3696 actualFiles := make([]fileInApex, 0, len(outputs))
3697 for _, output := range outputs {
3698 dir := "/deapexer/"
3699 pos := strings.LastIndex(output, dir)
3700 if pos == -1 {
3701 t.Fatal("Unknown deapexer output ", output)
3702 }
3703 path := output[pos+len(dir):]
3704 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3705 }
3706 assertFileListEquals(t, files, actualFiles)
3707}
3708
Jooyung Han39edb6c2019-11-06 16:53:07 +09003709func vndkLibrariesTxtFiles(vers ...string) (result string) {
3710 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003711 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003712 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003713 prebuilt_etc {
3714 name: "` + txt + `.libraries.` + v + `.txt",
3715 src: "dummy.txt",
3716 }
3717 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003718 }
3719 }
3720 return
3721}
3722
Jooyung Han344d5432019-08-23 11:17:39 +09003723func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003724 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003725 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003726 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003727 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003728 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003729 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003730 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003731 }
3732
3733 apex_key {
3734 name: "myapex.key",
3735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 vndk_prebuilt_shared {
3740 name: "libvndk27",
3741 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003743 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003744 vndk: {
3745 enabled: true,
3746 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003747 target_arch: "arm64",
3748 arch: {
3749 arm: {
3750 srcs: ["libvndk27_arm.so"],
3751 },
3752 arm64: {
3753 srcs: ["libvndk27_arm64.so"],
3754 },
3755 },
Colin Cross2807f002021-03-02 10:15:29 -08003756 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003757 }
3758
3759 vndk_prebuilt_shared {
3760 name: "libvndk27",
3761 version: "27",
3762 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003763 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003764 vndk: {
3765 enabled: true,
3766 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003767 target_arch: "x86_64",
3768 arch: {
3769 x86: {
3770 srcs: ["libvndk27_x86.so"],
3771 },
3772 x86_64: {
3773 srcs: ["libvndk27_x86_64.so"],
3774 },
3775 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003776 }
3777 `+vndkLibrariesTxtFiles("27"),
3778 withFiles(map[string][]byte{
3779 "libvndk27_arm.so": nil,
3780 "libvndk27_arm64.so": nil,
3781 "libvndk27_x86.so": nil,
3782 "libvndk27_x86_64.so": nil,
3783 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003784
Jooyung Hana0503a52023-08-23 13:12:50 +09003785 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003786 "lib/libvndk27_arm.so",
3787 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003789 })
Jooyung Han344d5432019-08-23 11:17:39 +09003790}
3791
Jooyung Han90eee022019-10-01 20:02:42 +09003792func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003793 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003794 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003795 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003796 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003798 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003799 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003800 }
3801 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003802 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003803 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003804 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003805 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003806 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003807 }
3808 apex_key {
3809 name: "myapex.key",
3810 public_key: "testkey.avbpubkey",
3811 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003812 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003813
3814 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003815 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003816 apexManifestRule := module.Rule("apexManifestRule")
3817 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003818 }
3819
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003820 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003821 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003822}
3823
Jooyung Han344d5432019-08-23 11:17:39 +09003824func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003825 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003827 name: "com.android.vndk.v30",
3828 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003829 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003830 native_bridge_supported: true,
3831 }
3832
3833 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003834 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003839 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003840 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003841 version: "30",
3842 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003843 srcs: ["mylib.cpp"],
3844 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003845 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003846 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003847 vndk: {
3848 enabled: true,
3849 },
Jooyung Han344d5432019-08-23 11:17:39 +09003850 }
3851 `)
3852}
3853
Jooyung Han31c470b2019-10-18 16:26:59 +09003854func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003855 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003857 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003859 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003860 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003861 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 }
3863
3864 apex_key {
3865 name: "myapex.key",
3866 public_key: "testkey.avbpubkey",
3867 private_key: "testkey.pem",
3868 }
3869
3870 vndk_prebuilt_shared {
3871 name: "libvndk27",
3872 version: "27",
3873 target_arch: "arm",
3874 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003875 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 vndk: {
3877 enabled: true,
3878 },
3879 arch: {
3880 arm: {
3881 srcs: ["libvndk27.so"],
3882 }
3883 },
3884 }
3885
3886 vndk_prebuilt_shared {
3887 name: "libvndk27",
3888 version: "27",
3889 target_arch: "arm",
3890 binder32bit: true,
3891 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003892 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 vndk: {
3894 enabled: true,
3895 },
3896 arch: {
3897 arm: {
3898 srcs: ["libvndk27binder32.so"],
3899 }
3900 },
Colin Cross2807f002021-03-02 10:15:29 -08003901 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003903 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 withFiles(map[string][]byte{
3905 "libvndk27.so": nil,
3906 "libvndk27binder32.so": nil,
3907 }),
3908 withBinder32bit,
3909 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003910 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003911 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3912 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 },
3914 }),
3915 )
3916
Jooyung Hana0503a52023-08-23 13:12:50 +09003917 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003918 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003920 })
3921}
3922
Jooyung Hane1633032019-08-01 17:41:43 +09003923func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003924 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003925 apex {
3926 name: "myapex_nodep",
3927 key: "myapex.key",
3928 native_shared_libs: ["lib_nodep"],
3929 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 apex {
3935 name: "myapex_dep",
3936 key: "myapex.key",
3937 native_shared_libs: ["lib_dep"],
3938 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003939 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003940 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 apex {
3944 name: "myapex_provider",
3945 key: "myapex.key",
3946 native_shared_libs: ["libfoo"],
3947 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 apex {
3953 name: "myapex_selfcontained",
3954 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003955 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003956 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003957 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
3967 cc_library {
3968 name: "lib_nodep",
3969 srcs: ["mylib.cpp"],
3970 system_shared_libs: [],
3971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003972 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003973 }
3974
3975 cc_library {
3976 name: "lib_dep",
3977 srcs: ["mylib.cpp"],
3978 shared_libs: ["libfoo"],
3979 system_shared_libs: [],
3980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003981 apex_available: [
3982 "myapex_dep",
3983 "myapex_provider",
3984 "myapex_selfcontained",
3985 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003986 }
3987
3988 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003989 name: "lib_dep_on_bar",
3990 srcs: ["mylib.cpp"],
3991 shared_libs: ["libbar"],
3992 system_shared_libs: [],
3993 stl: "none",
3994 apex_available: [
3995 "myapex_selfcontained",
3996 ],
3997 }
3998
3999
4000 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004001 name: "libfoo",
4002 srcs: ["mytest.cpp"],
4003 stubs: {
4004 versions: ["1"],
4005 },
4006 system_shared_libs: [],
4007 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004008 apex_available: [
4009 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004010 ],
4011 }
4012
4013 cc_library {
4014 name: "libbar",
4015 srcs: ["mytest.cpp"],
4016 stubs: {
4017 versions: ["1"],
4018 },
4019 system_shared_libs: [],
4020 stl: "none",
4021 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004022 "myapex_selfcontained",
4023 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004024 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004025
Jooyung Hane1633032019-08-01 17:41:43 +09004026 `)
4027
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004028 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004029 var provideNativeLibs, requireNativeLibs []string
4030
Jooyung Hana0503a52023-08-23 13:12:50 +09004031 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004032 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4033 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004034 ensureListEmpty(t, provideNativeLibs)
4035 ensureListEmpty(t, requireNativeLibs)
4036
Jooyung Hana0503a52023-08-23 13:12:50 +09004037 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004038 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4039 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004040 ensureListEmpty(t, provideNativeLibs)
4041 ensureListContains(t, requireNativeLibs, "libfoo.so")
4042
Jooyung Hana0503a52023-08-23 13:12:50 +09004043 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004044 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4045 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004046 ensureListContains(t, provideNativeLibs, "libfoo.so")
4047 ensureListEmpty(t, requireNativeLibs)
4048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004050 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4051 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004052 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004053 ensureListEmpty(t, requireNativeLibs)
4054}
4055
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004056func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4057 ctx := testApex(t, `
4058 apex {
4059 name: "myapex",
4060 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004061 native_shared_libs: ["mylib"],
4062 updatable: false,
4063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 cc_library {
4072 name: "mylib",
4073 srcs: ["mylib.cpp"],
4074 system_shared_libs: [],
4075 stl: "none",
4076 apex_available: [
4077 "//apex_available:platform",
4078 "myapex",
4079 ],
4080 }
4081 `, android.FixtureMergeEnv(map[string]string{
4082 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4083 }))
4084
Jooyung Hana0503a52023-08-23 13:12:50 +09004085 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004086 apexManifestRule := module.Rule("apexManifestRule")
4087 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4088}
4089
Vinh Tran8f5310f2022-10-07 18:16:47 -04004090func TestCompileMultilibProp(t *testing.T) {
4091 testCases := []struct {
4092 compileMultiLibProp string
4093 containedLibs []string
4094 notContainedLibs []string
4095 }{
4096 {
4097 containedLibs: []string{
4098 "image.apex/lib64/mylib.so",
4099 "image.apex/lib/mylib.so",
4100 },
4101 compileMultiLibProp: `compile_multilib: "both",`,
4102 },
4103 {
4104 containedLibs: []string{"image.apex/lib64/mylib.so"},
4105 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4106 compileMultiLibProp: `compile_multilib: "first",`,
4107 },
4108 {
4109 containedLibs: []string{"image.apex/lib64/mylib.so"},
4110 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4111 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4112 },
4113 {
4114 containedLibs: []string{"image.apex/lib64/mylib.so"},
4115 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4116 compileMultiLibProp: `compile_multilib: "64",`,
4117 },
4118 {
4119 containedLibs: []string{"image.apex/lib/mylib.so"},
4120 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4121 compileMultiLibProp: `compile_multilib: "32",`,
4122 },
4123 }
4124 for _, testCase := range testCases {
4125 ctx := testApex(t, fmt.Sprintf(`
4126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
4129 %s
4130 native_shared_libs: ["mylib"],
4131 updatable: false,
4132 }
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138 cc_library {
4139 name: "mylib",
4140 srcs: ["mylib.cpp"],
4141 apex_available: [
4142 "//apex_available:platform",
4143 "myapex",
4144 ],
4145 }
4146 `, testCase.compileMultiLibProp),
4147 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004148 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004149 apexRule := module.Rule("apexRule")
4150 copyCmds := apexRule.Args["copy_commands"]
4151 for _, containedLib := range testCase.containedLibs {
4152 ensureContains(t, copyCmds, containedLib)
4153 }
4154 for _, notContainedLib := range testCase.notContainedLibs {
4155 ensureNotContains(t, copyCmds, notContainedLib)
4156 }
4157 }
4158}
4159
Alex Light0851b882019-02-07 13:20:53 -08004160func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004161 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004162 apex {
4163 name: "myapex",
4164 key: "myapex.key",
4165 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004166 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004167 }
4168
4169 apex_key {
4170 name: "myapex.key",
4171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
4174
4175 cc_library {
4176 name: "mylib_common",
4177 srcs: ["mylib.cpp"],
4178 system_shared_libs: [],
4179 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004180 apex_available: [
4181 "//apex_available:platform",
4182 "myapex",
4183 ],
Alex Light0851b882019-02-07 13:20:53 -08004184 }
4185 `)
4186
Jooyung Hana0503a52023-08-23 13:12:50 +09004187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004188 apexRule := module.Rule("apexRule")
4189 copyCmds := apexRule.Args["copy_commands"]
4190
4191 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4192 t.Log("Apex was a test apex!")
4193 t.Fail()
4194 }
4195 // Ensure that main rule creates an output
4196 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4197
4198 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004199 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004200
4201 // Ensure that both direct and indirect deps are copied into apex
4202 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4203
Colin Cross7113d202019-11-20 16:39:12 -08004204 // Ensure that the platform variant ends with _shared
4205 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004206
Colin Cross56a83212020-09-15 18:30:11 -07004207 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004208 t.Log("Found mylib_common not in any apex!")
4209 t.Fail()
4210 }
4211}
4212
4213func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004214 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004215 apex_test {
4216 name: "myapex",
4217 key: "myapex.key",
4218 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004219 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004220 }
4221
4222 apex_key {
4223 name: "myapex.key",
4224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227
4228 cc_library {
4229 name: "mylib_common_test",
4230 srcs: ["mylib.cpp"],
4231 system_shared_libs: [],
4232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 // TODO: remove //apex_available:platform
4234 apex_available: [
4235 "//apex_available:platform",
4236 "myapex",
4237 ],
Alex Light0851b882019-02-07 13:20:53 -08004238 }
4239 `)
4240
Jooyung Hana0503a52023-08-23 13:12:50 +09004241 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004242 apexRule := module.Rule("apexRule")
4243 copyCmds := apexRule.Args["copy_commands"]
4244
4245 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4246 t.Log("Apex was not a test apex!")
4247 t.Fail()
4248 }
4249 // Ensure that main rule creates an output
4250 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4251
4252 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004253 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004254
4255 // Ensure that both direct and indirect deps are copied into apex
4256 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4257
Colin Cross7113d202019-11-20 16:39:12 -08004258 // Ensure that the platform variant ends with _shared
4259 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004260}
4261
Jooyung Han85707de2023-12-01 14:21:13 +09004262func TestLibzVendorIsntStable(t *testing.T) {
4263 ctx := testApex(t, `
4264 apex {
4265 name: "myapex",
4266 key: "myapex.key",
4267 updatable: false,
4268 binaries: ["mybin"],
4269 }
4270 apex {
4271 name: "myvendorapex",
4272 key: "myapex.key",
4273 file_contexts: "myvendorapex_file_contexts",
4274 vendor: true,
4275 updatable: false,
4276 binaries: ["mybin"],
4277 }
4278 apex_key {
4279 name: "myapex.key",
4280 public_key: "testkey.avbpubkey",
4281 private_key: "testkey.pem",
4282 }
4283 cc_binary {
4284 name: "mybin",
4285 vendor_available: true,
4286 system_shared_libs: [],
4287 stl: "none",
4288 shared_libs: ["libz"],
4289 apex_available: ["//apex_available:anyapex"],
4290 }
4291 cc_library {
4292 name: "libz",
4293 vendor_available: true,
4294 system_shared_libs: [],
4295 stl: "none",
4296 stubs: {
4297 versions: ["28", "30"],
4298 },
4299 target: {
4300 vendor: {
4301 no_stubs: true,
4302 },
4303 },
4304 }
4305 `, withFiles(map[string][]byte{
4306 "myvendorapex_file_contexts": nil,
4307 }))
4308
4309 // libz provides stubs for core variant.
4310 {
4311 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4312 "bin/mybin",
4313 })
4314 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4315 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4316 }
4317 // libz doesn't provide stubs for vendor variant.
4318 {
4319 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4320 "bin/mybin",
4321 "lib64/libz.so",
4322 })
4323 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4324 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4325 }
4326}
4327
Alex Light9670d332019-01-29 18:07:33 -08004328func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004329 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004330 apex {
4331 name: "myapex",
4332 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004333 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004334 multilib: {
4335 first: {
4336 native_shared_libs: ["mylib_common"],
4337 }
4338 },
4339 target: {
4340 android: {
4341 multilib: {
4342 first: {
4343 native_shared_libs: ["mylib"],
4344 }
4345 }
4346 },
4347 host: {
4348 multilib: {
4349 first: {
4350 native_shared_libs: ["mylib2"],
4351 }
4352 }
4353 }
4354 }
4355 }
4356
4357 apex_key {
4358 name: "myapex.key",
4359 public_key: "testkey.avbpubkey",
4360 private_key: "testkey.pem",
4361 }
4362
4363 cc_library {
4364 name: "mylib",
4365 srcs: ["mylib.cpp"],
4366 system_shared_libs: [],
4367 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004368 // TODO: remove //apex_available:platform
4369 apex_available: [
4370 "//apex_available:platform",
4371 "myapex",
4372 ],
Alex Light9670d332019-01-29 18:07:33 -08004373 }
4374
4375 cc_library {
4376 name: "mylib_common",
4377 srcs: ["mylib.cpp"],
4378 system_shared_libs: [],
4379 stl: "none",
4380 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004381 // TODO: remove //apex_available:platform
4382 apex_available: [
4383 "//apex_available:platform",
4384 "myapex",
4385 ],
Alex Light9670d332019-01-29 18:07:33 -08004386 }
4387
4388 cc_library {
4389 name: "mylib2",
4390 srcs: ["mylib.cpp"],
4391 system_shared_libs: [],
4392 stl: "none",
4393 compile_multilib: "first",
4394 }
4395 `)
4396
Jooyung Hana0503a52023-08-23 13:12:50 +09004397 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004398 copyCmds := apexRule.Args["copy_commands"]
4399
4400 // Ensure that main rule creates an output
4401 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4402
4403 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004404 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4405 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4406 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004407
4408 // Ensure that both direct and indirect deps are copied into apex
4409 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4410 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4411 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4412
Colin Cross7113d202019-11-20 16:39:12 -08004413 // Ensure that the platform variant ends with _shared
4414 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4415 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4416 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004417}
Jiyong Park04480cf2019-02-06 00:16:29 +09004418
Jiyong Park59140302020-12-14 18:44:04 +09004419func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004420 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004421 apex {
4422 name: "myapex",
4423 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004424 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004425 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004426 arch: {
4427 arm64: {
4428 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004429 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004430 },
4431 x86_64: {
4432 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004433 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004434 },
4435 }
4436 }
4437
4438 apex_key {
4439 name: "myapex.key",
4440 public_key: "testkey.avbpubkey",
4441 private_key: "testkey.pem",
4442 }
4443
4444 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004445 name: "mylib.generic",
4446 srcs: ["mylib.cpp"],
4447 system_shared_libs: [],
4448 stl: "none",
4449 // TODO: remove //apex_available:platform
4450 apex_available: [
4451 "//apex_available:platform",
4452 "myapex",
4453 ],
4454 }
4455
4456 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004457 name: "mylib.arm64",
4458 srcs: ["mylib.cpp"],
4459 system_shared_libs: [],
4460 stl: "none",
4461 // TODO: remove //apex_available:platform
4462 apex_available: [
4463 "//apex_available:platform",
4464 "myapex",
4465 ],
4466 }
4467
4468 cc_library {
4469 name: "mylib.x64",
4470 srcs: ["mylib.cpp"],
4471 system_shared_libs: [],
4472 stl: "none",
4473 // TODO: remove //apex_available:platform
4474 apex_available: [
4475 "//apex_available:platform",
4476 "myapex",
4477 ],
4478 }
4479 `)
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004482 copyCmds := apexRule.Args["copy_commands"]
4483
4484 // Ensure that apex variant is created for the direct dep
4485 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004486 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004487 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4488
4489 // Ensure that both direct and indirect deps are copied into apex
4490 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4491 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4492}
4493
Jiyong Park04480cf2019-02-06 00:16:29 +09004494func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004495 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004499 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004500 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004501 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004502 }
4503
4504 apex_key {
4505 name: "myapex.key",
4506 public_key: "testkey.avbpubkey",
4507 private_key: "testkey.pem",
4508 }
4509
4510 sh_binary {
4511 name: "myscript",
4512 src: "mylib.cpp",
4513 filename: "myscript.sh",
4514 sub_dir: "script",
4515 }
4516 `)
4517
Jooyung Hana0503a52023-08-23 13:12:50 +09004518 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004519 copyCmds := apexRule.Args["copy_commands"]
4520
4521 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4522}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004523
Jooyung Han91df2082019-11-20 01:49:42 +09004524func TestApexInVariousPartition(t *testing.T) {
4525 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004526 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004527 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004528 {"", "system"},
4529 {"product_specific: true", "product"},
4530 {"soc_specific: true", "vendor"},
4531 {"proprietary: true", "vendor"},
4532 {"vendor: true", "vendor"},
4533 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004534 }
4535 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004536 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004537 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004538 apex {
4539 name: "myapex",
4540 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004541 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004542 `+tc.propName+`
4543 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004544
Jooyung Han91df2082019-11-20 01:49:42 +09004545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
4550 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004551
Jooyung Hana0503a52023-08-23 13:12:50 +09004552 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004553 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004554 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004555 if actual != expected {
4556 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4557 }
Jooyung Han91df2082019-11-20 01:49:42 +09004558 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004559 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004560}
Jiyong Park67882562019-03-21 01:11:21 +09004561
Jooyung Han580eb4f2020-06-24 19:33:06 +09004562func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004563 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004564 apex {
4565 name: "myapex",
4566 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004567 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004568 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004569
Jooyung Han580eb4f2020-06-24 19:33:06 +09004570 apex_key {
4571 name: "myapex.key",
4572 public_key: "testkey.avbpubkey",
4573 private_key: "testkey.pem",
4574 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004575 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004576 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004577 rule := module.Output("file_contexts")
4578 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4579}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004582 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004587 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004588 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004589
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 apex_key {
4591 name: "myapex.key",
4592 public_key: "testkey.avbpubkey",
4593 private_key: "testkey.pem",
4594 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004595 `, withFiles(map[string][]byte{
4596 "my_own_file_contexts": nil,
4597 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004598}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004599
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004601 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
4605 product_specific: true,
4606 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004607 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004609
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 apex_key {
4611 name: "myapex.key",
4612 public_key: "testkey.avbpubkey",
4613 private_key: "testkey.pem",
4614 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004615 `)
4616
Colin Cross1c460562021-02-16 17:55:47 -08004617 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 apex {
4619 name: "myapex",
4620 key: "myapex.key",
4621 product_specific: true,
4622 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004623 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004624 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004625
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 apex_key {
4627 name: "myapex.key",
4628 public_key: "testkey.avbpubkey",
4629 private_key: "testkey.pem",
4630 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004631 `, withFiles(map[string][]byte{
4632 "product_specific_file_contexts": nil,
4633 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004635 rule := module.Output("file_contexts")
4636 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4637}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004638
Jooyung Han580eb4f2020-06-24 19:33:06 +09004639func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004640 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004641 apex {
4642 name: "myapex",
4643 key: "myapex.key",
4644 product_specific: true,
4645 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004648
Jooyung Han580eb4f2020-06-24 19:33:06 +09004649 apex_key {
4650 name: "myapex.key",
4651 public_key: "testkey.avbpubkey",
4652 private_key: "testkey.pem",
4653 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004654
Jooyung Han580eb4f2020-06-24 19:33:06 +09004655 filegroup {
4656 name: "my-file-contexts",
4657 srcs: ["product_specific_file_contexts"],
4658 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004659 `, withFiles(map[string][]byte{
4660 "product_specific_file_contexts": nil,
4661 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004662 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004663 rule := module.Output("file_contexts")
4664 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004665}
4666
Jiyong Park67882562019-03-21 01:11:21 +09004667func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004668 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004669 apex_key {
4670 name: "myapex.key",
4671 public_key: ":my.avbpubkey",
4672 private_key: ":my.pem",
4673 product_specific: true,
4674 }
4675
4676 filegroup {
4677 name: "my.avbpubkey",
4678 srcs: ["testkey2.avbpubkey"],
4679 }
4680
4681 filegroup {
4682 name: "my.pem",
4683 srcs: ["testkey2.pem"],
4684 }
4685 `)
4686
4687 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4688 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004689 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004690 if actual_pubkey != expected_pubkey {
4691 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4692 }
4693 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004694 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004695 if actual_privkey != expected_privkey {
4696 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4697 }
4698}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004699
4700func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004701 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004702 prebuilt_apex {
4703 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004704 arch: {
4705 arm64: {
4706 src: "myapex-arm64.apex",
4707 },
4708 arm: {
4709 src: "myapex-arm.apex",
4710 },
4711 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004712 }
4713 `)
4714
Wei Li340ee8e2022-03-18 17:33:24 -07004715 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4716 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004717
Jiyong Parkc95714e2019-03-29 14:23:10 +09004718 expectedInput := "myapex-arm64.apex"
4719 if prebuilt.inputApex.String() != expectedInput {
4720 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4721 }
Wei Li340ee8e2022-03-18 17:33:24 -07004722 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4723 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4724 rule := testingModule.Rule("genProvenanceMetaData")
4725 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4726 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4727 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4728 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004729
4730 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4731 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004732}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733
Paul Duffinc0609c62021-03-01 17:27:16 +00004734func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004735 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004736 prebuilt_apex {
4737 name: "myapex",
4738 }
4739 `)
4740}
4741
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004742func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004743 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004744 prebuilt_apex {
4745 name: "myapex",
4746 src: "myapex-arm.apex",
4747 filename: "notmyapex.apex",
4748 }
4749 `)
4750
Wei Li340ee8e2022-03-18 17:33:24 -07004751 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4752 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004753
4754 expected := "notmyapex.apex"
4755 if p.installFilename != expected {
4756 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4757 }
Wei Li340ee8e2022-03-18 17:33:24 -07004758 rule := testingModule.Rule("genProvenanceMetaData")
4759 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4760 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4761 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4762 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004763}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004764
Samiul Islam7c02e262021-09-08 17:48:28 +01004765func TestApexSetFilenameOverride(t *testing.T) {
4766 testApex(t, `
4767 apex_set {
4768 name: "com.company.android.myapex",
4769 apex_name: "com.android.myapex",
4770 set: "company-myapex.apks",
4771 filename: "com.company.android.myapex.apex"
4772 }
4773 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4774
4775 testApex(t, `
4776 apex_set {
4777 name: "com.company.android.myapex",
4778 apex_name: "com.android.myapex",
4779 set: "company-myapex.apks",
4780 filename: "com.company.android.myapex.capex"
4781 }
4782 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4783
4784 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4785 apex_set {
4786 name: "com.company.android.myapex",
4787 apex_name: "com.android.myapex",
4788 set: "company-myapex.apks",
4789 filename: "some-random-suffix"
4790 }
4791 `)
4792}
4793
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004794func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004795 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004796 prebuilt_apex {
4797 name: "myapex.prebuilt",
4798 src: "myapex-arm.apex",
4799 overrides: [
4800 "myapex",
4801 ],
4802 }
4803 `)
4804
Wei Li340ee8e2022-03-18 17:33:24 -07004805 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4806 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004807
4808 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004809 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004810 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004811 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004812 }
Wei Li340ee8e2022-03-18 17:33:24 -07004813 rule := testingModule.Rule("genProvenanceMetaData")
4814 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4815 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4816 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4817 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004818}
4819
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004820func TestPrebuiltApexName(t *testing.T) {
4821 testApex(t, `
4822 prebuilt_apex {
4823 name: "com.company.android.myapex",
4824 apex_name: "com.android.myapex",
4825 src: "company-myapex-arm.apex",
4826 }
4827 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4828
4829 testApex(t, `
4830 apex_set {
4831 name: "com.company.android.myapex",
4832 apex_name: "com.android.myapex",
4833 set: "company-myapex.apks",
4834 }
4835 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4836}
4837
4838func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4839 _ = android.GroupFixturePreparers(
4840 java.PrepareForTestWithJavaDefaultModules,
4841 PrepareForTestWithApexBuildComponents,
4842 android.FixtureWithRootAndroidBp(`
4843 platform_bootclasspath {
4844 name: "platform-bootclasspath",
4845 fragments: [
4846 {
4847 apex: "com.android.art",
4848 module: "art-bootclasspath-fragment",
4849 },
4850 ],
4851 }
4852
4853 prebuilt_apex {
4854 name: "com.company.android.art",
4855 apex_name: "com.android.art",
4856 src: "com.company.android.art-arm.apex",
4857 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4858 }
4859
4860 prebuilt_bootclasspath_fragment {
4861 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004862 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004863 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004864 hidden_api: {
4865 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4866 metadata: "my-bootclasspath-fragment/metadata.csv",
4867 index: "my-bootclasspath-fragment/index.csv",
4868 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4869 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4870 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004871 }
4872
4873 java_import {
4874 name: "core-oj",
4875 jars: ["prebuilt.jar"],
4876 }
4877 `),
4878 ).RunTest(t)
4879}
4880
Spandan Das59a4a2b2024-01-09 21:35:56 +00004881// A minimal context object for use with DexJarBuildPath
4882type moduleErrorfTestCtx struct {
4883}
4884
4885func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4886}
4887
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004888func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004889 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004890 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004891 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4892 // is disabled.
4893 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00004894
4895 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
4896 // file creation.
4897 java.FixtureConfigureBootJars("platform:foo"),
4898 android.FixtureModifyMockFS(func(fs android.MockFS) {
4899 fs["platform/Android.bp"] = []byte(`
4900 java_library {
4901 name: "foo",
4902 srcs: ["Test.java"],
4903 compile_dex: true,
4904 }
4905 `)
4906 fs["platform/Test.java"] = nil
4907 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004908 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004909
Paul Duffin40a3f652021-07-19 13:11:24 +01004910 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004911 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004912 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004913 var rule android.TestingBuildParams
4914
4915 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4916 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004917 }
4918
Paul Duffin40a3f652021-07-19 13:11:24 +01004919 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4920 t.Helper()
4921 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4922 var rule android.TestingBuildParams
4923
4924 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4925 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4926 }
4927
Paul Duffin89f570a2021-06-16 01:42:33 +01004928 fragment := java.ApexVariantReference{
4929 Apex: proptools.StringPtr("myapex"),
4930 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4931 }
4932
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004933 t.Run("prebuilt only", func(t *testing.T) {
4934 bp := `
4935 prebuilt_apex {
4936 name: "myapex",
4937 arch: {
4938 arm64: {
4939 src: "myapex-arm64.apex",
4940 },
4941 arm: {
4942 src: "myapex-arm.apex",
4943 },
4944 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004945 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4946 }
4947
4948 prebuilt_bootclasspath_fragment {
4949 name: "my-bootclasspath-fragment",
4950 contents: ["libfoo", "libbar"],
4951 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004952 hidden_api: {
4953 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4954 metadata: "my-bootclasspath-fragment/metadata.csv",
4955 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004956 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4957 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4958 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004959 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004960 }
4961
Spandan Das52c01a12024-09-20 01:09:48 +00004962 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004963 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00004964 public: {
4965 jars: ["libfoo.jar"],
4966 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004967 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00004968 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004969 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004970 }
Paul Duffin37856732021-02-26 14:24:15 +00004971
4972 java_sdk_library_import {
4973 name: "libbar",
4974 public: {
4975 jars: ["libbar.jar"],
4976 },
4977 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004978 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004979 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004980 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004981 `
4982
Paul Duffin89f570a2021-06-16 01:42:33 +01004983 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004984
Paul Duffin537ea3d2021-05-14 10:38:00 +01004985 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00004986 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01004987 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004988 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004989 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01004990 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004991 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004992 })
4993
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004994 t.Run("apex_set only", func(t *testing.T) {
4995 bp := `
4996 apex_set {
4997 name: "myapex",
4998 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004999 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005000 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5001 }
5002
Paul Duffin89f570a2021-06-16 01:42:33 +01005003 prebuilt_bootclasspath_fragment {
5004 name: "my-bootclasspath-fragment",
5005 contents: ["libfoo", "libbar"],
5006 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005007 hidden_api: {
5008 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5009 metadata: "my-bootclasspath-fragment/metadata.csv",
5010 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005011 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5012 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5013 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005014 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005015 }
5016
Liz Kammer2dc72442023-04-20 10:10:48 -04005017 prebuilt_systemserverclasspath_fragment {
5018 name: "my-systemserverclasspath-fragment",
5019 contents: ["libbaz"],
5020 apex_available: ["myapex"],
5021 }
5022
Spandan Das52c01a12024-09-20 01:09:48 +00005023 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005024 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005025 public: {
5026 jars: ["libfoo.jar"],
5027 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005028 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005029 shared_library: false,
5030 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005031 }
5032
Spandan Das52c01a12024-09-20 01:09:48 +00005033
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005034 java_sdk_library_import {
5035 name: "libbar",
5036 public: {
5037 jars: ["libbar.jar"],
5038 },
5039 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005040 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005041 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005042 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005043
5044 java_sdk_library_import {
5045 name: "libbaz",
5046 public: {
5047 jars: ["libbaz.jar"],
5048 },
5049 apex_available: ["myapex"],
5050 shared_library: false,
5051 permitted_packages: ["baz"],
5052 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005053 `
5054
Paul Duffin89f570a2021-06-16 01:42:33 +01005055 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005056
Paul Duffin537ea3d2021-05-14 10:38:00 +01005057 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005058 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005059 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005060 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005061 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005062 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005063 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005064
5065 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5066
5067 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005068 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005069 "myjavalib.myapex",
5070 "libfoo.myapex",
5071 "libbar.myapex",
5072 "libbaz.myapex",
5073 }
5074 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5075 for i, e := range mkEntries {
5076 g := e.OverrideName
5077 if w := overrideNames[i]; w != g {
5078 t.Errorf("Expected override name %q, got %q", w, g)
5079 }
5080 }
5081
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005082 })
5083
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005084 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5085 bp := `
5086 prebuilt_apex {
5087 name: "myapex",
5088 arch: {
5089 arm64: {
5090 src: "myapex-arm64.apex",
5091 },
5092 arm: {
5093 src: "myapex-arm.apex",
5094 },
5095 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005096 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5097 }
5098
5099 prebuilt_bootclasspath_fragment {
5100 name: "my-bootclasspath-fragment",
5101 contents: ["libfoo", "libbar"],
5102 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005103 hidden_api: {
5104 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5105 metadata: "my-bootclasspath-fragment/metadata.csv",
5106 index: "my-bootclasspath-fragment/index.csv",
5107 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5108 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5109 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005110 }
5111
5112 java_import {
5113 name: "libfoo",
5114 jars: ["libfoo.jar"],
5115 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005116 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005117 }
5118
5119 java_library {
5120 name: "libfoo",
5121 srcs: ["foo/bar/MyClass.java"],
5122 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005123 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005124 }
Paul Duffin37856732021-02-26 14:24:15 +00005125
5126 java_sdk_library_import {
5127 name: "libbar",
5128 public: {
5129 jars: ["libbar.jar"],
5130 },
5131 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005132 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005133 }
5134
5135 java_sdk_library {
5136 name: "libbar",
5137 srcs: ["foo/bar/MyClass.java"],
5138 unsafe_ignore_missing_latest_api: true,
5139 apex_available: ["myapex"],
5140 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141 `
5142
5143 // In this test the source (java_library) libfoo is active since the
5144 // prebuilt (java_import) defaults to prefer:false. However the
5145 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5146 // find the dex boot jar in it. We either need to disable the source libfoo
5147 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005148 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005149 // dexbootjar check is skipped if AllowMissingDependencies is true
5150 preparerAllowMissingDeps := android.GroupFixturePreparers(
5151 preparer,
5152 android.PrepareForTestWithAllowMissingDependencies,
5153 )
5154 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005155 })
5156
5157 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5158 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005159 apex {
5160 name: "myapex",
5161 key: "myapex.key",
5162 updatable: false,
5163 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5164 }
5165
5166 apex_key {
5167 name: "myapex.key",
5168 public_key: "testkey.avbpubkey",
5169 private_key: "testkey.pem",
5170 }
5171
5172 bootclasspath_fragment {
5173 name: "my-bootclasspath-fragment",
5174 contents: ["libfoo", "libbar"],
5175 apex_available: ["myapex"],
5176 hidden_api: {
5177 split_packages: ["*"],
5178 },
5179 }
5180
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005181 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 Duffin89f570a2021-06-16 01:42:33 +01005191 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5192 }
5193
5194 prebuilt_bootclasspath_fragment {
5195 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005196 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005197 contents: ["libfoo", "libbar"],
5198 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005199 hidden_api: {
5200 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5201 metadata: "my-bootclasspath-fragment/metadata.csv",
5202 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005203 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5204 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5205 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005206 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005207 }
5208
Spandan Das52c01a12024-09-20 01:09:48 +00005209 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005210 name: "libfoo",
5211 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005212 public: {
5213 jars: ["libfoo.jar"],
5214 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005216 shared_library: false,
5217 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 }
5219
5220 java_library {
5221 name: "libfoo",
5222 srcs: ["foo/bar/MyClass.java"],
5223 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005224 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005225 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005226 }
Paul Duffin37856732021-02-26 14:24:15 +00005227
5228 java_sdk_library_import {
5229 name: "libbar",
5230 prefer: true,
5231 public: {
5232 jars: ["libbar.jar"],
5233 },
5234 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005236 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005237 }
5238
5239 java_sdk_library {
5240 name: "libbar",
5241 srcs: ["foo/bar/MyClass.java"],
5242 unsafe_ignore_missing_latest_api: true,
5243 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005244 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005245 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 `
5247
Paul Duffin89f570a2021-06-16 01:42:33 +01005248 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005249
Paul Duffin537ea3d2021-05-14 10:38:00 +01005250 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005251 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005252 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005253 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005254 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005255 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005256 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005257 })
5258
5259 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5260 bp := `
5261 apex {
5262 name: "myapex",
5263 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005264 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005265 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005266 }
5267
5268 apex_key {
5269 name: "myapex.key",
5270 public_key: "testkey.avbpubkey",
5271 private_key: "testkey.pem",
5272 }
5273
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005274 bootclasspath_fragment {
5275 name: "my-bootclasspath-fragment",
5276 contents: ["libfoo", "libbar"],
5277 apex_available: ["myapex"],
5278 hidden_api: {
5279 split_packages: ["*"],
5280 },
5281 }
5282
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 prebuilt_apex {
5284 name: "myapex",
5285 arch: {
5286 arm64: {
5287 src: "myapex-arm64.apex",
5288 },
5289 arm: {
5290 src: "myapex-arm.apex",
5291 },
5292 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005293 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5294 }
5295
5296 prebuilt_bootclasspath_fragment {
5297 name: "my-bootclasspath-fragment",
5298 contents: ["libfoo", "libbar"],
5299 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005300 hidden_api: {
5301 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5302 metadata: "my-bootclasspath-fragment/metadata.csv",
5303 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005304 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5305 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5306 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005307 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005308 }
5309
5310 java_import {
5311 name: "libfoo",
5312 jars: ["libfoo.jar"],
5313 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005314 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005315 }
5316
5317 java_library {
5318 name: "libfoo",
5319 srcs: ["foo/bar/MyClass.java"],
5320 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005321 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005322 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005323 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 }
Paul Duffin37856732021-02-26 14:24:15 +00005325
5326 java_sdk_library_import {
5327 name: "libbar",
5328 public: {
5329 jars: ["libbar.jar"],
5330 },
5331 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005332 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005333 }
5334
5335 java_sdk_library {
5336 name: "libbar",
5337 srcs: ["foo/bar/MyClass.java"],
5338 unsafe_ignore_missing_latest_api: true,
5339 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005340 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005341 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005342 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005343 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005344 `
5345
Paul Duffin89f570a2021-06-16 01:42:33 +01005346 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005347
Paul Duffin537ea3d2021-05-14 10:38:00 +01005348 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005349 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005350 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5351 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005352 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5353 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005354 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005355 })
5356
5357 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5358 bp := `
5359 apex {
5360 name: "myapex",
5361 enabled: false,
5362 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005363 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 apex_key {
5367 name: "myapex.key",
5368 public_key: "testkey.avbpubkey",
5369 private_key: "testkey.pem",
5370 }
5371
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005372 bootclasspath_fragment {
5373 name: "my-bootclasspath-fragment",
5374 enabled: false,
5375 contents: ["libfoo", "libbar"],
5376 apex_available: ["myapex"],
5377 hidden_api: {
5378 split_packages: ["*"],
5379 },
5380 }
5381
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 prebuilt_apex {
5383 name: "myapex",
5384 arch: {
5385 arm64: {
5386 src: "myapex-arm64.apex",
5387 },
5388 arm: {
5389 src: "myapex-arm.apex",
5390 },
5391 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005392 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5393 }
5394
5395 prebuilt_bootclasspath_fragment {
5396 name: "my-bootclasspath-fragment",
5397 contents: ["libfoo", "libbar"],
5398 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005399 hidden_api: {
5400 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5401 metadata: "my-bootclasspath-fragment/metadata.csv",
5402 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005403 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5404 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5405 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005406 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005407 }
5408
5409 java_import {
5410 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 jars: ["libfoo.jar"],
5412 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005413 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005414 }
5415
5416 java_library {
5417 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005418 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 srcs: ["foo/bar/MyClass.java"],
5420 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005421 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005422 }
Paul Duffin37856732021-02-26 14:24:15 +00005423
5424 java_sdk_library_import {
5425 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005426 public: {
5427 jars: ["libbar.jar"],
5428 },
5429 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005430 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005431 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005432 }
5433
5434 java_sdk_library {
5435 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005436 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005437 srcs: ["foo/bar/MyClass.java"],
5438 unsafe_ignore_missing_latest_api: true,
5439 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005440 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005441 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005442 `
Cole Fausta963b942024-04-11 17:43:00 -07005443 // This test disables libbar, which causes the ComponentDepsMutator to add
5444 // deps on libbar.stubs and other sub-modules that don't exist. We can
5445 // enable AllowMissingDependencies to work around that, but enabling that
5446 // causes extra checks for missing source files to dex_bootjars, so add those
5447 // to the mock fs as well.
5448 preparer2 := android.GroupFixturePreparers(
5449 preparer,
5450 android.PrepareForTestWithAllowMissingDependencies,
5451 android.FixtureMergeMockFs(map[string][]byte{
5452 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5453 "frameworks/base/config/boot-profile.txt": nil,
5454 }),
5455 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456
Cole Fausta963b942024-04-11 17:43:00 -07005457 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005458
Paul Duffin537ea3d2021-05-14 10:38:00 +01005459 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005460 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005461 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005462 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005463 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005464 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005465 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466 })
Spandan Das3a392012024-01-17 18:26:27 +00005467
Spandan Dasf2c10572024-02-27 04:49:52 +00005468 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005469 bp := `
5470 // Source
5471 apex {
5472 name: "myapex",
5473 enabled: false,
5474 key: "myapex.key",
5475 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5476 }
5477
5478 apex_key {
5479 name: "myapex.key",
5480 public_key: "testkey.avbpubkey",
5481 private_key: "testkey.pem",
5482 }
5483
5484 // Prebuilt
5485 prebuilt_apex {
5486 name: "myapex.v1",
5487 source_apex_name: "myapex",
5488 arch: {
5489 arm64: {
5490 src: "myapex-arm64.apex",
5491 },
5492 arm: {
5493 src: "myapex-arm.apex",
5494 },
5495 },
5496 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5497 prefer: true,
5498 }
5499 prebuilt_apex {
5500 name: "myapex.v2",
5501 source_apex_name: "myapex",
5502 arch: {
5503 arm64: {
5504 src: "myapex-arm64.apex",
5505 },
5506 arm: {
5507 src: "myapex-arm.apex",
5508 },
5509 },
5510 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5511 prefer: true,
5512 }
5513
5514 prebuilt_bootclasspath_fragment {
5515 name: "my-bootclasspath-fragment",
5516 contents: ["libfoo", "libbar"],
5517 apex_available: ["myapex"],
5518 hidden_api: {
5519 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5520 metadata: "my-bootclasspath-fragment/metadata.csv",
5521 index: "my-bootclasspath-fragment/index.csv",
5522 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5523 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5524 },
5525 prefer: true,
5526 }
5527
5528 java_import {
5529 name: "libfoo",
5530 jars: ["libfoo.jar"],
5531 apex_available: ["myapex"],
5532 prefer: true,
5533 }
5534 java_import {
5535 name: "libbar",
5536 jars: ["libbar.jar"],
5537 apex_available: ["myapex"],
5538 prefer: true,
5539 }
5540 `
5541
Spandan Dasf2c10572024-02-27 04:49:52 +00005542 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005543 })
5544
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005545}
5546
Roland Levillain630846d2019-06-26 12:48:34 +01005547func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005548 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005549 apex_test {
5550 name: "myapex",
5551 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005552 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005553 tests: [
5554 "mytest",
5555 ],
5556 }
5557
5558 apex_key {
5559 name: "myapex.key",
5560 public_key: "testkey.avbpubkey",
5561 private_key: "testkey.pem",
5562 }
5563
Liz Kammer1c14a212020-05-12 15:26:55 -07005564 filegroup {
5565 name: "fg",
5566 srcs: [
5567 "baz",
5568 "bar/baz"
5569 ],
5570 }
5571
Roland Levillain630846d2019-06-26 12:48:34 +01005572 cc_test {
5573 name: "mytest",
5574 gtest: false,
5575 srcs: ["mytest.cpp"],
5576 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005577 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005578 system_shared_libs: [],
5579 static_executable: true,
5580 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005581 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005582 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005583
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005584 cc_library {
5585 name: "mylib",
5586 srcs: ["mylib.cpp"],
5587 system_shared_libs: [],
5588 stl: "none",
5589 }
5590
Liz Kammer5bd365f2020-05-27 15:15:11 -07005591 filegroup {
5592 name: "fg2",
5593 srcs: [
5594 "testdata/baz"
5595 ],
5596 }
Roland Levillain630846d2019-06-26 12:48:34 +01005597 `)
5598
Jooyung Hana0503a52023-08-23 13:12:50 +09005599 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005600 copyCmds := apexRule.Args["copy_commands"]
5601
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005602 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005603 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005604 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005605
Liz Kammer1c14a212020-05-12 15:26:55 -07005606 //Ensure that test data are copied into apex.
5607 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5608 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5609
Roland Levillainf89cd092019-07-29 16:22:59 +01005610 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005611 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005612 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005613 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005614 prefix := "TARGET_"
5615 var builder strings.Builder
5616 data.Custom(&builder, name, prefix, "", data)
5617 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005618 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005619 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005620}
5621
Jooyung Hand48f3c32019-08-23 11:18:57 +09005622func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5623 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5624 apex {
5625 name: "myapex",
5626 key: "myapex.key",
5627 native_shared_libs: ["libfoo"],
5628 }
5629
5630 apex_key {
5631 name: "myapex.key",
5632 public_key: "testkey.avbpubkey",
5633 private_key: "testkey.pem",
5634 }
5635
5636 cc_library {
5637 name: "libfoo",
5638 stl: "none",
5639 system_shared_libs: [],
5640 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005641 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005642 }
5643 `)
5644 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5645 apex {
5646 name: "myapex",
5647 key: "myapex.key",
5648 java_libs: ["myjar"],
5649 }
5650
5651 apex_key {
5652 name: "myapex.key",
5653 public_key: "testkey.avbpubkey",
5654 private_key: "testkey.pem",
5655 }
5656
5657 java_library {
5658 name: "myjar",
5659 srcs: ["foo/bar/MyClass.java"],
5660 sdk_version: "none",
5661 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005662 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005663 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005664 }
5665 `)
5666}
5667
Bill Peckhama41a6962021-01-11 10:58:54 -08005668func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005669 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005670 apex {
5671 name: "myapex",
5672 key: "myapex.key",
5673 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005674 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005675 }
5676
5677 apex_key {
5678 name: "myapex.key",
5679 public_key: "testkey.avbpubkey",
5680 private_key: "testkey.pem",
5681 }
5682
5683 java_import {
5684 name: "myjavaimport",
5685 apex_available: ["myapex"],
5686 jars: ["my.jar"],
5687 compile_dex: true,
5688 }
5689 `)
5690
Jooyung Hana0503a52023-08-23 13:12:50 +09005691 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005692 apexRule := module.Rule("apexRule")
5693 copyCmds := apexRule.Args["copy_commands"]
5694 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5695}
5696
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005697func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005698 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005699 apex {
5700 name: "myapex",
5701 key: "myapex.key",
5702 apps: [
5703 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005704 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005705 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005706 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005707 }
5708
5709 apex_key {
5710 name: "myapex.key",
5711 public_key: "testkey.avbpubkey",
5712 private_key: "testkey.pem",
5713 }
5714
5715 android_app {
5716 name: "AppFoo",
5717 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005718 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005719 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005720 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005721 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005723 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005724 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005725
5726 android_app {
5727 name: "AppFooPriv",
5728 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005729 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005730 system_modules: "none",
5731 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005732 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005733 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005734 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005735 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005736
5737 cc_library_shared {
5738 name: "libjni",
5739 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005740 shared_libs: ["libfoo"],
5741 stl: "none",
5742 system_shared_libs: [],
5743 apex_available: [ "myapex" ],
5744 sdk_version: "current",
5745 }
5746
5747 cc_library_shared {
5748 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005749 stl: "none",
5750 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005751 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005752 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005753 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005754 `)
5755
Jooyung Hana0503a52023-08-23 13:12:50 +09005756 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005757 apexRule := module.Rule("apexRule")
5758 copyCmds := apexRule.Args["copy_commands"]
5759
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005760 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5761 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005762 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005763
Colin Crossaede88c2020-08-11 12:17:01 -07005764 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005765 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005766 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005767 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005768 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005769 // JNI libraries including transitive deps are
5770 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005771 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005772 // ... embedded inside APK (jnilibs.zip)
5773 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5774 // ... and not directly inside the APEX
5775 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5776 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005777
5778 apexBundle := module.Module().(*apexBundle)
5779 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5780 var builder strings.Builder
5781 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5782 androidMk := builder.String()
5783 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5784 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5785 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5786 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5787 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5788 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01005789}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005790
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005791func TestApexWithAppImportBuildId(t *testing.T) {
5792 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5793 for _, id := range invalidBuildIds {
5794 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5795 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5796 variables.BuildId = proptools.StringPtr(id)
5797 })
5798 testApexError(t, message, `apex {
5799 name: "myapex",
5800 key: "myapex.key",
5801 apps: ["AppFooPrebuilt"],
5802 updatable: false,
5803 }
5804
5805 apex_key {
5806 name: "myapex.key",
5807 public_key: "testkey.avbpubkey",
5808 private_key: "testkey.pem",
5809 }
5810
5811 android_app_import {
5812 name: "AppFooPrebuilt",
5813 apk: "PrebuiltAppFoo.apk",
5814 presigned: true,
5815 apex_available: ["myapex"],
5816 }
5817 `, fixture)
5818 }
5819}
5820
Dario Frenicde2a032019-10-27 00:29:22 +01005821func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005822 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005823 apex {
5824 name: "myapex",
5825 key: "myapex.key",
5826 apps: [
5827 "AppFooPrebuilt",
5828 "AppFooPrivPrebuilt",
5829 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005830 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005831 }
5832
5833 apex_key {
5834 name: "myapex.key",
5835 public_key: "testkey.avbpubkey",
5836 private_key: "testkey.pem",
5837 }
5838
5839 android_app_import {
5840 name: "AppFooPrebuilt",
5841 apk: "PrebuiltAppFoo.apk",
5842 presigned: true,
5843 dex_preopt: {
5844 enabled: false,
5845 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005846 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005847 }
5848
5849 android_app_import {
5850 name: "AppFooPrivPrebuilt",
5851 apk: "PrebuiltAppFooPriv.apk",
5852 privileged: true,
5853 presigned: true,
5854 dex_preopt: {
5855 enabled: false,
5856 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005857 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005858 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005859 }
5860 `)
5861
Jooyung Hana0503a52023-08-23 13:12:50 +09005862 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01005863 apexRule := module.Rule("apexRule")
5864 copyCmds := apexRule.Args["copy_commands"]
5865
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005866 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5867 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005868}
5869
5870func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005871 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005872 apex {
5873 name: "myapex",
5874 key: "myapex.key",
5875 apps: [
5876 "AppFoo",
5877 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005878 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005879 }
5880
5881 apex_key {
5882 name: "myapex.key",
5883 public_key: "testkey.avbpubkey",
5884 private_key: "testkey.pem",
5885 }
5886
5887 android_app {
5888 name: "AppFoo",
5889 srcs: ["foo/bar/MyClass.java"],
5890 sdk_version: "none",
5891 system_modules: "none",
5892 apex_available: [ "myapex" ],
5893 }
5894
5895 android_app_import {
5896 name: "AppFoo",
5897 apk: "AppFooPrebuilt.apk",
5898 filename: "AppFooPrebuilt.apk",
5899 presigned: true,
5900 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005901 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005902 }
5903 `, withFiles(map[string][]byte{
5904 "AppFooPrebuilt.apk": nil,
5905 }))
5906
Jooyung Hana0503a52023-08-23 13:12:50 +09005907 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005908 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005909 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005910}
5911
Dario Freni6f3937c2019-12-20 22:58:03 +00005912func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005913 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005914 apex {
5915 name: "myapex",
5916 key: "myapex.key",
5917 apps: [
5918 "TesterHelpAppFoo",
5919 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005920 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005921 }
5922
5923 apex_key {
5924 name: "myapex.key",
5925 public_key: "testkey.avbpubkey",
5926 private_key: "testkey.pem",
5927 }
5928
5929 android_test_helper_app {
5930 name: "TesterHelpAppFoo",
5931 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005932 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005933 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00005934 }
5935
5936 `)
5937
Jooyung Hana0503a52023-08-23 13:12:50 +09005938 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00005939 apexRule := module.Rule("apexRule")
5940 copyCmds := apexRule.Args["copy_commands"]
5941
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005942 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005943}
5944
Jooyung Han18020ea2019-11-13 10:50:48 +09005945func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5946 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005947 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005948 apex {
5949 name: "myapex",
5950 key: "myapex.key",
5951 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005952 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005953 }
5954
5955 apex_key {
5956 name: "myapex.key",
5957 public_key: "testkey.avbpubkey",
5958 private_key: "testkey.pem",
5959 }
5960
5961 apex {
5962 name: "otherapex",
5963 key: "myapex.key",
5964 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005965 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005966 }
5967
5968 cc_defaults {
5969 name: "libfoo-defaults",
5970 apex_available: ["otherapex"],
5971 }
5972
5973 cc_library {
5974 name: "libfoo",
5975 defaults: ["libfoo-defaults"],
5976 stl: "none",
5977 system_shared_libs: [],
5978 }`)
5979}
5980
Paul Duffine52e66f2020-03-30 17:54:29 +01005981func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005982 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005983 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005984 apex {
5985 name: "myapex",
5986 key: "myapex.key",
5987 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005988 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005989 }
5990
5991 apex_key {
5992 name: "myapex.key",
5993 public_key: "testkey.avbpubkey",
5994 private_key: "testkey.pem",
5995 }
5996
5997 apex {
5998 name: "otherapex",
5999 key: "otherapex.key",
6000 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006001 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006002 }
6003
6004 apex_key {
6005 name: "otherapex.key",
6006 public_key: "testkey.avbpubkey",
6007 private_key: "testkey.pem",
6008 }
6009
6010 cc_library {
6011 name: "libfoo",
6012 stl: "none",
6013 system_shared_libs: [],
6014 apex_available: ["otherapex"],
6015 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006016}
Jiyong Park127b40b2019-09-30 16:04:35 +09006017
Paul Duffine52e66f2020-03-30 17:54:29 +01006018func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006019 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006020 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006021.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006022.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006023.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006024.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006025.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006026.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006027 apex {
6028 name: "myapex",
6029 key: "myapex.key",
6030 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006031 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006032 }
6033
6034 apex_key {
6035 name: "myapex.key",
6036 public_key: "testkey.avbpubkey",
6037 private_key: "testkey.pem",
6038 }
6039
Jiyong Park127b40b2019-09-30 16:04:35 +09006040 cc_library {
6041 name: "libfoo",
6042 stl: "none",
6043 shared_libs: ["libbar"],
6044 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006045 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006046 }
6047
6048 cc_library {
6049 name: "libbar",
6050 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006051 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006052 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006053 apex_available: ["myapex"],
6054 }
6055
6056 cc_library {
6057 name: "libbaz",
6058 stl: "none",
6059 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006060 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006061}
Jiyong Park127b40b2019-09-30 16:04:35 +09006062
Liz Kammer5f108fa2023-05-11 14:33:17 -04006063func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6064 testApex(t, `
6065 apex {
6066 name: "myapex",
6067 key: "myapex.key",
6068 native_shared_libs: ["libfoo"],
6069 updatable: false,
6070 }
6071
6072 apex_key {
6073 name: "myapex.key",
6074 public_key: "testkey.avbpubkey",
6075 private_key: "testkey.pem",
6076 }
6077
6078 cc_library {
6079 name: "libfoo",
6080 stl: "none",
6081 static_libs: ["libbar"],
6082 system_shared_libs: [],
6083 apex_available: ["myapex"],
6084 }
6085
6086 cc_library {
6087 name: "libbar",
6088 stl: "none",
6089 shared_libs: ["libbaz"],
6090 system_shared_libs: [],
6091 apex_available: ["myapex"],
6092 }
6093
6094 cc_library {
6095 name: "libbaz",
6096 stl: "none",
6097 system_shared_libs: [],
6098 }`)
6099
6100 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6101 apex {
6102 name: "myapex",
6103 key: "myapex.key",
6104 native_shared_libs: ["libfoo"],
6105 updatable: false,
6106 }
6107
6108 apex_key {
6109 name: "myapex.key",
6110 public_key: "testkey.avbpubkey",
6111 private_key: "testkey.pem",
6112 }
6113
6114 cc_library {
6115 name: "libfoo",
6116 stl: "none",
6117 static_libs: ["libbar"],
6118 system_shared_libs: [],
6119 apex_available: ["myapex"],
6120 }
6121
6122 cc_library {
6123 name: "libbar",
6124 stl: "none",
6125 system_shared_libs: [],
6126 }`)
6127}
6128
Paul Duffine52e66f2020-03-30 17:54:29 +01006129func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006130 testApexError(t, "\"otherapex\" is not a valid module name", `
6131 apex {
6132 name: "myapex",
6133 key: "myapex.key",
6134 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006135 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 cc_library {
6145 name: "libfoo",
6146 stl: "none",
6147 system_shared_libs: [],
6148 apex_available: ["otherapex"],
6149 }`)
6150
Paul Duffine52e66f2020-03-30 17:54:29 +01006151 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006152 apex {
6153 name: "myapex",
6154 key: "myapex.key",
6155 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006156 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006157 }
6158
6159 apex_key {
6160 name: "myapex.key",
6161 public_key: "testkey.avbpubkey",
6162 private_key: "testkey.pem",
6163 }
6164
6165 cc_library {
6166 name: "libfoo",
6167 stl: "none",
6168 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006169 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006170 apex_available: ["myapex"],
6171 }
6172
6173 cc_library {
6174 name: "libbar",
6175 stl: "none",
6176 system_shared_libs: [],
6177 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006178 }
6179
6180 cc_library {
6181 name: "libbaz",
6182 stl: "none",
6183 system_shared_libs: [],
6184 stubs: {
6185 versions: ["10", "20", "30"],
6186 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006187 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006188}
Jiyong Park127b40b2019-09-30 16:04:35 +09006189
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006190func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6191 t.Run("negative variant_version produces error", func(t *testing.T) {
6192 testApexError(t, "expected an integer between 0-9; got -1", `
6193 apex {
6194 name: "myapex",
6195 key: "myapex.key",
6196 apex_available_name: "com.android.foo",
6197 variant_version: "-1",
6198 updatable: false,
6199 }
6200 apex_key {
6201 name: "myapex.key",
6202 public_key: "testkey.avbpubkey",
6203 private_key: "testkey.pem",
6204 }
6205 `)
6206 })
6207
6208 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6209 testApexError(t, "expected an integer between 0-9; got 10", `
6210 apex {
6211 name: "myapex",
6212 key: "myapex.key",
6213 apex_available_name: "com.android.foo",
6214 variant_version: "10",
6215 updatable: false,
6216 }
6217 apex_key {
6218 name: "myapex.key",
6219 public_key: "testkey.avbpubkey",
6220 private_key: "testkey.pem",
6221 }
6222 `)
6223 })
6224}
6225
6226func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6227 context := android.GroupFixturePreparers(
6228 android.PrepareForIntegrationTestWithAndroid,
6229 PrepareForTestWithApexBuildComponents,
6230 android.FixtureMergeMockFs(android.MockFS{
6231 "system/sepolicy/apex/foo-file_contexts": nil,
6232 "system/sepolicy/apex/bar-file_contexts": nil,
6233 }),
6234 )
6235 result := context.RunTestWithBp(t, `
6236 apex {
6237 name: "foo",
6238 key: "myapex.key",
6239 apex_available_name: "com.android.foo",
6240 variant_version: "0",
6241 updatable: false,
6242 }
6243 apex {
6244 name: "bar",
6245 key: "myapex.key",
6246 apex_available_name: "com.android.foo",
6247 variant_version: "3",
6248 updatable: false,
6249 }
6250 apex_key {
6251 name: "myapex.key",
6252 public_key: "testkey.avbpubkey",
6253 private_key: "testkey.pem",
6254 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006255 override_apex {
6256 name: "myoverrideapex",
6257 base: "bar",
6258 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006259 `)
6260
Jooyung Hana0503a52023-08-23 13:12:50 +09006261 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006262 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6263 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6264 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6265 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6266 }
6267
Jooyung Hana0503a52023-08-23 13:12:50 +09006268 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006269 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6270 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6271 barActualDefaultVersion := barManifestRule.Args["default_version"]
6272 if barActualDefaultVersion != barExpectedDefaultVersion {
6273 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6274 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006275
Spandan Das50801e22024-05-13 18:29:45 +00006276 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006277 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6278 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6279 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6280 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006281}
6282
Sam Delmericoca816532023-06-02 14:09:50 -04006283func TestApexAvailable_ApexAvailableName(t *testing.T) {
6284 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6285 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6286 apex {
6287 name: "myapex_sminus",
6288 key: "myapex.key",
6289 apps: ["AppFoo"],
6290 apex_available_name: "myapex",
6291 updatable: false,
6292 }
6293 apex {
6294 name: "myapex",
6295 key: "myapex.key",
6296 apps: ["AppFoo"],
6297 updatable: false,
6298 }
6299 apex_key {
6300 name: "myapex.key",
6301 public_key: "testkey.avbpubkey",
6302 private_key: "testkey.pem",
6303 }
6304 android_app {
6305 name: "AppFoo",
6306 srcs: ["foo/bar/MyClass.java"],
6307 sdk_version: "none",
6308 system_modules: "none",
6309 apex_available: [ "myapex_sminus" ],
6310 }`,
6311 android.FixtureMergeMockFs(android.MockFS{
6312 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6313 }),
6314 )
6315 })
6316
6317 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6318 testApex(t, `
6319 apex {
6320 name: "myapex_sminus",
6321 key: "myapex.key",
6322 apps: ["AppFoo"],
6323 apex_available_name: "myapex",
6324 updatable: false,
6325 }
6326 apex {
6327 name: "myapex",
6328 key: "myapex.key",
6329 apps: ["AppFoo"],
6330 updatable: false,
6331 }
6332 apex_key {
6333 name: "myapex.key",
6334 public_key: "testkey.avbpubkey",
6335 private_key: "testkey.pem",
6336 }
6337 android_app {
6338 name: "AppFoo",
6339 srcs: ["foo/bar/MyClass.java"],
6340 sdk_version: "none",
6341 system_modules: "none",
6342 apex_available: [ "myapex" ],
6343 }`,
6344 android.FixtureMergeMockFs(android.MockFS{
6345 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6346 }),
6347 )
6348 })
6349
6350 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6351 testApex(t, `
6352 override_apex {
6353 name: "myoverrideapex_sminus",
6354 base: "myapex_sminus",
6355 key: "myapex.key",
6356 apps: ["AppFooOverride"],
6357 }
6358 override_apex {
6359 name: "myoverrideapex",
6360 base: "myapex",
6361 key: "myapex.key",
6362 apps: ["AppFooOverride"],
6363 }
6364 apex {
6365 name: "myapex_sminus",
6366 key: "myapex.key",
6367 apps: ["AppFoo"],
6368 apex_available_name: "myapex",
6369 updatable: false,
6370 }
6371 apex {
6372 name: "myapex",
6373 key: "myapex.key",
6374 apps: ["AppFoo"],
6375 updatable: false,
6376 }
6377 apex_key {
6378 name: "myapex.key",
6379 public_key: "testkey.avbpubkey",
6380 private_key: "testkey.pem",
6381 }
6382 android_app {
6383 name: "AppFooOverride",
6384 srcs: ["foo/bar/MyClass.java"],
6385 sdk_version: "none",
6386 system_modules: "none",
6387 apex_available: [ "myapex" ],
6388 }
6389 android_app {
6390 name: "AppFoo",
6391 srcs: ["foo/bar/MyClass.java"],
6392 sdk_version: "none",
6393 system_modules: "none",
6394 apex_available: [ "myapex" ],
6395 }`,
6396 android.FixtureMergeMockFs(android.MockFS{
6397 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6398 }),
6399 )
6400 })
6401}
6402
6403func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6404 context := android.GroupFixturePreparers(
6405 android.PrepareForIntegrationTestWithAndroid,
6406 PrepareForTestWithApexBuildComponents,
6407 java.PrepareForTestWithDexpreopt,
6408 android.FixtureMergeMockFs(android.MockFS{
6409 "system/sepolicy/apex/myapex-file_contexts": nil,
6410 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6411 }),
6412 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6413 variables.BuildId = proptools.StringPtr("buildid")
6414 }),
6415 )
6416 context.RunTestWithBp(t, `
6417 override_apex {
6418 name: "myoverrideapex_sminus",
6419 base: "myapex_sminus",
6420 }
6421 override_apex {
6422 name: "myoverrideapex",
6423 base: "myapex",
6424 }
6425 apex {
6426 name: "myapex",
6427 key: "myapex.key",
6428 apps: ["AppFoo"],
6429 updatable: false,
6430 }
6431 apex {
6432 name: "myapex_sminus",
6433 apex_available_name: "myapex",
6434 key: "myapex.key",
6435 apps: ["AppFoo_sminus"],
6436 updatable: false,
6437 }
6438 apex_key {
6439 name: "myapex.key",
6440 public_key: "testkey.avbpubkey",
6441 private_key: "testkey.pem",
6442 }
6443 android_app {
6444 name: "AppFoo",
6445 srcs: ["foo/bar/MyClass.java"],
6446 sdk_version: "none",
6447 system_modules: "none",
6448 apex_available: [ "myapex" ],
6449 }
6450 android_app {
6451 name: "AppFoo_sminus",
6452 srcs: ["foo/bar/MyClass.java"],
6453 sdk_version: "none",
6454 min_sdk_version: "29",
6455 system_modules: "none",
6456 apex_available: [ "myapex" ],
6457 }`)
6458}
6459
Jiyong Park89e850a2020-04-07 16:37:39 +09006460func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006461 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006462 apex {
6463 name: "myapex",
6464 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006465 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006466 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006467 }
6468
6469 apex_key {
6470 name: "myapex.key",
6471 public_key: "testkey.avbpubkey",
6472 private_key: "testkey.pem",
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 stl: "none",
6478 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006479 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006480 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006481 }
6482
6483 cc_library {
6484 name: "libfoo2",
6485 stl: "none",
6486 system_shared_libs: [],
6487 shared_libs: ["libbaz"],
6488 apex_available: ["//apex_available:platform"],
6489 }
6490
6491 cc_library {
6492 name: "libbar",
6493 stl: "none",
6494 system_shared_libs: [],
6495 apex_available: ["myapex"],
6496 }
6497
6498 cc_library {
6499 name: "libbaz",
6500 stl: "none",
6501 system_shared_libs: [],
6502 apex_available: ["myapex"],
6503 stubs: {
6504 versions: ["1"],
6505 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006506 }`)
6507
Jiyong Park89e850a2020-04-07 16:37:39 +09006508 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6509 // because it depends on libbar which isn't available to platform
6510 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6511 if libfoo.NotAvailableForPlatform() != true {
6512 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6513 }
6514
6515 // libfoo2 however can be available to platform because it depends on libbaz which provides
6516 // stubs
6517 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6518 if libfoo2.NotAvailableForPlatform() == true {
6519 t.Errorf("%q should be available to platform", libfoo2.String())
6520 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006521}
Jiyong Parka90ca002019-10-07 15:47:24 +09006522
Paul Duffine52e66f2020-03-30 17:54:29 +01006523func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006524 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006529 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537
6538 cc_library {
6539 name: "libfoo",
6540 stl: "none",
6541 system_shared_libs: [],
6542 apex_available: ["myapex"],
6543 static: {
6544 apex_available: ["//apex_available:platform"],
6545 },
6546 }`)
6547
Jiyong Park89e850a2020-04-07 16:37:39 +09006548 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6549 if libfooShared.NotAvailableForPlatform() != true {
6550 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6551 }
6552 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6553 if libfooStatic.NotAvailableForPlatform() != false {
6554 t.Errorf("%q should be available to platform", libfooStatic.String())
6555 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006556}
6557
Jooyung Han9a419e22024-08-16 17:14:21 +09006558func TestApexAvailable_PrefixMatch(t *testing.T) {
6559
6560 for _, tc := range []struct {
6561 name string
6562 apexAvailable string
6563 expectedError string
6564 }{
6565 {
6566 name: "prefix matches correctly",
6567 apexAvailable: "com.foo.*",
6568 },
6569 {
6570 name: "prefix doesn't match",
6571 apexAvailable: "com.bar.*",
6572 expectedError: `Consider .* "com.foo\.\*"`,
6573 },
6574 {
6575 name: "short prefix",
6576 apexAvailable: "com.*",
6577 expectedError: "requires two or more components",
6578 },
6579 {
6580 name: "wildcard not in the end",
6581 apexAvailable: "com.*.foo",
6582 expectedError: "should end with .*",
6583 },
6584 {
6585 name: "wildcard in the middle",
6586 apexAvailable: "com.foo*.*",
6587 expectedError: "not allowed in the middle",
6588 },
6589 {
6590 name: "hint with prefix pattern",
6591 apexAvailable: "//apex_available:platform",
6592 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6593 },
6594 } {
6595 t.Run(tc.name, func(t *testing.T) {
6596 errorHandler := android.FixtureExpectsNoErrors
6597 if tc.expectedError != "" {
6598 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6599 }
6600 context := android.GroupFixturePreparers(
6601 prepareForApexTest,
6602 android.FixtureMergeMockFs(android.MockFS{
6603 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6604 }),
6605 ).ExtendWithErrorHandler(errorHandler)
6606
6607 context.RunTestWithBp(t, `
6608 apex {
6609 name: "com.foo.bar",
6610 key: "myapex.key",
6611 native_shared_libs: ["libfoo"],
6612 updatable: false,
6613 }
6614
6615 apex_key {
6616 name: "myapex.key",
6617 public_key: "testkey.avbpubkey",
6618 private_key: "testkey.pem",
6619 }
6620
6621 cc_library {
6622 name: "libfoo",
6623 stl: "none",
6624 system_shared_libs: [],
6625 apex_available: ["`+tc.apexAvailable+`"],
6626 }`)
6627 })
6628 }
6629 testApexError(t, `Consider adding "com.foo" to`, `
6630 apex {
6631 name: "com.foo", // too short for a partner apex
6632 key: "myapex.key",
6633 native_shared_libs: ["libfoo"],
6634 updatable: false,
6635 }
6636
6637 apex_key {
6638 name: "myapex.key",
6639 public_key: "testkey.avbpubkey",
6640 private_key: "testkey.pem",
6641 }
6642
6643 cc_library {
6644 name: "libfoo",
6645 stl: "none",
6646 system_shared_libs: [],
6647 }
6648 `)
6649}
6650
Jiyong Park5d790c32019-11-15 18:40:32 +09006651func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006652 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
6656 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006657 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006658 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006659 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006660 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006661 }
6662
6663 override_apex {
6664 name: "override_myapex",
6665 base: "myapex",
6666 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006667 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006668 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006669 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006670 compile_multilib: "first",
6671 multilib: {
6672 lib32: {
6673 native_shared_libs: ["mylib32"],
6674 },
6675 lib64: {
6676 native_shared_libs: ["mylib64"],
6677 },
6678 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006679 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006680 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006681 key: "mynewapex.key",
6682 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006683 }
6684
6685 apex_key {
6686 name: "myapex.key",
6687 public_key: "testkey.avbpubkey",
6688 private_key: "testkey.pem",
6689 }
6690
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006691 apex_key {
6692 name: "mynewapex.key",
6693 public_key: "testkey2.avbpubkey",
6694 private_key: "testkey2.pem",
6695 }
6696
6697 android_app_certificate {
6698 name: "myapex.certificate",
6699 certificate: "testkey",
6700 }
6701
Jiyong Park5d790c32019-11-15 18:40:32 +09006702 android_app {
6703 name: "app",
6704 srcs: ["foo/bar/MyClass.java"],
6705 package_name: "foo",
6706 sdk_version: "none",
6707 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006708 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006709 }
6710
6711 override_android_app {
6712 name: "override_app",
6713 base: "app",
6714 package_name: "bar",
6715 }
markchien7c803b82021-08-26 22:10:06 +08006716
6717 bpf {
6718 name: "bpf",
6719 srcs: ["bpf.c"],
6720 }
6721
6722 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006723 name: "overrideBpf",
6724 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006725 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006726
6727 prebuilt_etc {
6728 name: "myetc",
6729 src: "myprebuilt",
6730 }
6731
6732 prebuilt_etc {
6733 name: "override_myetc",
6734 src: "override_myprebuilt",
6735 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006736
6737 cc_library {
6738 name: "mylib32",
6739 apex_available: [ "myapex" ],
6740 }
6741
6742 cc_library {
6743 name: "mylib64",
6744 apex_available: [ "myapex" ],
6745 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006746 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006747
Jooyung Hana0503a52023-08-23 13:12:50 +09006748 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006749 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006750 if originalVariant.GetOverriddenBy() != "" {
6751 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6752 }
6753 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6754 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6755 }
6756
Spandan Das50801e22024-05-13 18:29:45 +00006757 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006758 apexRule := module.Rule("apexRule")
6759 copyCmds := apexRule.Args["copy_commands"]
6760
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006761 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6762 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006763
markchien7c803b82021-08-26 22:10:06 +08006764 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006765 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006766
Daniel Norman5a3ce132021-08-26 15:44:43 -07006767 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6768 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6769
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006770 apexBundle := module.Module().(*apexBundle)
6771 name := apexBundle.Name()
6772 if name != "override_myapex" {
6773 t.Errorf("name should be \"override_myapex\", but was %q", name)
6774 }
6775
Baligh Uddin004d7172020-02-19 21:29:28 -08006776 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6777 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6778 }
6779
Jiyong Park20bacab2020-03-03 11:45:41 +09006780 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006781 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006782 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6783
6784 signApkRule := module.Rule("signapk")
6785 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006786
Colin Crossaa255532020-07-03 13:18:24 -07006787 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006788 var builder strings.Builder
6789 data.Custom(&builder, name, "TARGET_", "", data)
6790 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006791 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6792 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006793 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006794 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006795 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006796 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006797 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006798 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006799}
6800
Albert Martineefabcf2022-03-21 20:11:16 +00006801func TestMinSdkVersionOverride(t *testing.T) {
6802 // Override from 29 to 31
6803 minSdkOverride31 := "31"
6804 ctx := testApex(t, `
6805 apex {
6806 name: "myapex",
6807 key: "myapex.key",
6808 native_shared_libs: ["mylib"],
6809 updatable: true,
6810 min_sdk_version: "29"
6811 }
6812
6813 override_apex {
6814 name: "override_myapex",
6815 base: "myapex",
6816 logging_parent: "com.foo.bar",
6817 package_name: "test.overridden.package"
6818 }
6819
6820 apex_key {
6821 name: "myapex.key",
6822 public_key: "testkey.avbpubkey",
6823 private_key: "testkey.pem",
6824 }
6825
6826 cc_library {
6827 name: "mylib",
6828 srcs: ["mylib.cpp"],
6829 runtime_libs: ["libbar"],
6830 system_shared_libs: [],
6831 stl: "none",
6832 apex_available: [ "myapex" ],
6833 min_sdk_version: "apex_inherit"
6834 }
6835
6836 cc_library {
6837 name: "libbar",
6838 srcs: ["mylib.cpp"],
6839 system_shared_libs: [],
6840 stl: "none",
6841 apex_available: [ "myapex" ],
6842 min_sdk_version: "apex_inherit"
6843 }
6844
6845 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6846
Jooyung Hana0503a52023-08-23 13:12:50 +09006847 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006848 copyCmds := apexRule.Args["copy_commands"]
6849
6850 // Ensure that direct non-stubs dep is always included
6851 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6852
6853 // Ensure that runtime_libs dep in included
6854 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6855
6856 // Ensure libraries target overridden min_sdk_version value
6857 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6858}
6859
6860func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6861 // Attempt to override from 31 to 29, should be a NOOP
6862 minSdkOverride29 := "29"
6863 ctx := testApex(t, `
6864 apex {
6865 name: "myapex",
6866 key: "myapex.key",
6867 native_shared_libs: ["mylib"],
6868 updatable: true,
6869 min_sdk_version: "31"
6870 }
6871
6872 override_apex {
6873 name: "override_myapex",
6874 base: "myapex",
6875 logging_parent: "com.foo.bar",
6876 package_name: "test.overridden.package"
6877 }
6878
6879 apex_key {
6880 name: "myapex.key",
6881 public_key: "testkey.avbpubkey",
6882 private_key: "testkey.pem",
6883 }
6884
6885 cc_library {
6886 name: "mylib",
6887 srcs: ["mylib.cpp"],
6888 runtime_libs: ["libbar"],
6889 system_shared_libs: [],
6890 stl: "none",
6891 apex_available: [ "myapex" ],
6892 min_sdk_version: "apex_inherit"
6893 }
6894
6895 cc_library {
6896 name: "libbar",
6897 srcs: ["mylib.cpp"],
6898 system_shared_libs: [],
6899 stl: "none",
6900 apex_available: [ "myapex" ],
6901 min_sdk_version: "apex_inherit"
6902 }
6903
6904 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6905
Jooyung Hana0503a52023-08-23 13:12:50 +09006906 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006907 copyCmds := apexRule.Args["copy_commands"]
6908
6909 // Ensure that direct non-stubs dep is always included
6910 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6911
6912 // Ensure that runtime_libs dep in included
6913 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6914
6915 // Ensure libraries target the original min_sdk_version value rather than the overridden
6916 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6917}
6918
Jooyung Han214bf372019-11-12 13:03:50 +09006919func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006920 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006921 apex {
6922 name: "myapex",
6923 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006924 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006925 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006926 }
6927
6928 apex_key {
6929 name: "myapex.key",
6930 public_key: "testkey.avbpubkey",
6931 private_key: "testkey.pem",
6932 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006933
6934 cc_library {
6935 name: "mylib",
6936 srcs: ["mylib.cpp"],
6937 stl: "libc++",
6938 system_shared_libs: [],
6939 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006940 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006941 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006942 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006943
Jooyung Hana0503a52023-08-23 13:12:50 +09006944 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09006945 args := module.Rule("apexRule").Args
6946 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006947 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006948
6949 // The copies of the libraries in the apex should have one more dependency than
6950 // the ones outside the apex, namely the unwinder. Ideally we should check
6951 // the dependency names directly here but for some reason the names are blank in
6952 // this test.
6953 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006954 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006955 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6956 if len(apexImplicits) != len(nonApexImplicits)+1 {
6957 t.Errorf("%q missing unwinder dep", lib)
6958 }
6959 }
Jooyung Han214bf372019-11-12 13:03:50 +09006960}
6961
Paul Duffine05480a2021-03-08 15:07:14 +00006962var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006963 "api/current.txt": nil,
6964 "api/removed.txt": nil,
6965 "api/system-current.txt": nil,
6966 "api/system-removed.txt": nil,
6967 "api/test-current.txt": nil,
6968 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006969
Anton Hanssondff2c782020-12-21 17:10:01 +00006970 "100/public/api/foo.txt": nil,
6971 "100/public/api/foo-removed.txt": nil,
6972 "100/system/api/foo.txt": nil,
6973 "100/system/api/foo-removed.txt": nil,
6974
Paul Duffineedc5d52020-06-12 17:46:39 +01006975 // For java_sdk_library_import
6976 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006977}
6978
Jooyung Han58f26ab2019-12-18 15:34:32 +09006979func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006980 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006981 apex {
6982 name: "myapex",
6983 key: "myapex.key",
6984 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006985 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006986 }
6987
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993
6994 java_sdk_library {
6995 name: "foo",
6996 srcs: ["a.java"],
6997 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006998 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006999 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007000
7001 prebuilt_apis {
7002 name: "sdk",
7003 api_dirs: ["100"],
7004 }
Paul Duffin9b879592020-05-26 13:21:35 +01007005 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007006
7007 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007008 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007009 "javalib/foo.jar",
7010 "etc/permissions/foo.xml",
7011 })
7012 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007013 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7014 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7015 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007016}
7017
Spandan Das3ee19692024-06-19 04:47:40 +00007018func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7019 ctx := testApex(t, `
7020 override_apex {
7021 name: "mycompanyapex",
7022 base: "myapex",
7023 }
7024 apex {
7025 name: "myapex",
7026 key: "myapex.key",
7027 java_libs: ["foo"],
7028 updatable: false,
7029 }
7030
7031 apex_key {
7032 name: "myapex.key",
7033 public_key: "testkey.avbpubkey",
7034 private_key: "testkey.pem",
7035 }
7036
7037 java_sdk_library {
7038 name: "foo",
7039 srcs: ["a.java"],
7040 api_packages: ["foo"],
7041 apex_available: [ "myapex" ],
7042 }
7043
7044 prebuilt_apis {
7045 name: "sdk",
7046 api_dirs: ["100"],
7047 }
7048 `, withFiles(filesForSdkLibrary))
7049
7050 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7051 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7052 // (com.android.foo), the filepath should not contain override apex name.
7053 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7054 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7055 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7056}
7057
Paul Duffin9b879592020-05-26 13:21:35 +01007058func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007059 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007060 apex {
7061 name: "myapex",
7062 key: "myapex.key",
7063 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007064 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007065 }
7066
7067 apex_key {
7068 name: "myapex.key",
7069 public_key: "testkey.avbpubkey",
7070 private_key: "testkey.pem",
7071 }
7072
7073 java_sdk_library {
7074 name: "foo",
7075 srcs: ["a.java"],
7076 api_packages: ["foo"],
7077 apex_available: ["myapex"],
7078 sdk_version: "none",
7079 system_modules: "none",
7080 }
7081
7082 java_library {
7083 name: "bar",
7084 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007085 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007086 apex_available: ["myapex"],
7087 sdk_version: "none",
7088 system_modules: "none",
7089 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007090
7091 prebuilt_apis {
7092 name: "sdk",
7093 api_dirs: ["100"],
7094 }
Paul Duffin9b879592020-05-26 13:21:35 +01007095 `, withFiles(filesForSdkLibrary))
7096
7097 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007098 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007099 "javalib/bar.jar",
7100 "javalib/foo.jar",
7101 "etc/permissions/foo.xml",
7102 })
7103
7104 // The bar library should depend on the implementation jar.
7105 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007106 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007107 t.Errorf("expected %q, found %#q", expected, actual)
7108 }
7109}
7110
7111func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007112 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007113 apex {
7114 name: "myapex",
7115 key: "myapex.key",
7116 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007117 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007118 }
7119
7120 apex_key {
7121 name: "myapex.key",
7122 public_key: "testkey.avbpubkey",
7123 private_key: "testkey.pem",
7124 }
7125
7126 java_sdk_library {
7127 name: "foo",
7128 srcs: ["a.java"],
7129 api_packages: ["foo"],
7130 apex_available: ["myapex"],
7131 sdk_version: "none",
7132 system_modules: "none",
7133 }
7134
7135 java_library {
7136 name: "bar",
7137 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007138 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007139 sdk_version: "none",
7140 system_modules: "none",
7141 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007142
7143 prebuilt_apis {
7144 name: "sdk",
7145 api_dirs: ["100"],
7146 }
Paul Duffin9b879592020-05-26 13:21:35 +01007147 `, withFiles(filesForSdkLibrary))
7148
7149 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007150 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007151 "javalib/foo.jar",
7152 "etc/permissions/foo.xml",
7153 })
7154
7155 // The bar library should depend on the stubs jar.
7156 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007157 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007158 t.Errorf("expected %q, found %#q", expected, actual)
7159 }
7160}
7161
Paul Duffineedc5d52020-06-12 17:46:39 +01007162func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007163 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007164 prebuilt_apis {
7165 name: "sdk",
7166 api_dirs: ["100"],
7167 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007168 withFiles(map[string][]byte{
7169 "apex/a.java": nil,
7170 "apex/apex_manifest.json": nil,
7171 "apex/Android.bp": []byte(`
7172 package {
7173 default_visibility: ["//visibility:private"],
7174 }
7175
7176 apex {
7177 name: "myapex",
7178 key: "myapex.key",
7179 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007180 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007181 }
7182
7183 apex_key {
7184 name: "myapex.key",
7185 public_key: "testkey.avbpubkey",
7186 private_key: "testkey.pem",
7187 }
7188
7189 java_library {
7190 name: "bar",
7191 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007192 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007193 apex_available: ["myapex"],
7194 sdk_version: "none",
7195 system_modules: "none",
7196 }
7197`),
7198 "source/a.java": nil,
7199 "source/api/current.txt": nil,
7200 "source/api/removed.txt": nil,
7201 "source/Android.bp": []byte(`
7202 package {
7203 default_visibility: ["//visibility:private"],
7204 }
7205
7206 java_sdk_library {
7207 name: "foo",
7208 visibility: ["//apex"],
7209 srcs: ["a.java"],
7210 api_packages: ["foo"],
7211 apex_available: ["myapex"],
7212 sdk_version: "none",
7213 system_modules: "none",
7214 public: {
7215 enabled: true,
7216 },
7217 }
7218`),
7219 "prebuilt/a.jar": nil,
7220 "prebuilt/Android.bp": []byte(`
7221 package {
7222 default_visibility: ["//visibility:private"],
7223 }
7224
7225 java_sdk_library_import {
7226 name: "foo",
7227 visibility: ["//apex", "//source"],
7228 apex_available: ["myapex"],
7229 prefer: true,
7230 public: {
7231 jars: ["a.jar"],
7232 },
7233 }
7234`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007235 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007236 )
7237
7238 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007239 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007240 "javalib/bar.jar",
7241 "javalib/foo.jar",
7242 "etc/permissions/foo.xml",
7243 })
7244
7245 // The bar library should depend on the implementation jar.
7246 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007247 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007248 t.Errorf("expected %q, found %#q", expected, actual)
7249 }
7250}
7251
7252func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7253 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7254 apex {
7255 name: "myapex",
7256 key: "myapex.key",
7257 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007258 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007259 }
7260
7261 apex_key {
7262 name: "myapex.key",
7263 public_key: "testkey.avbpubkey",
7264 private_key: "testkey.pem",
7265 }
7266
7267 java_sdk_library_import {
7268 name: "foo",
7269 apex_available: ["myapex"],
7270 prefer: true,
7271 public: {
7272 jars: ["a.jar"],
7273 },
7274 }
7275
7276 `, withFiles(filesForSdkLibrary))
7277}
7278
atrost6e126252020-01-27 17:01:16 +00007279func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007280 result := android.GroupFixturePreparers(
7281 prepareForApexTest,
7282 java.PrepareForTestWithPlatformCompatConfig,
7283 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007284 apex {
7285 name: "myapex",
7286 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007287 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007288 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007289 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007290 }
7291
7292 apex_key {
7293 name: "myapex.key",
7294 public_key: "testkey.avbpubkey",
7295 private_key: "testkey.pem",
7296 }
7297
7298 platform_compat_config {
7299 name: "myjar-platform-compat-config",
7300 src: ":myjar",
7301 }
7302
7303 java_library {
7304 name: "myjar",
7305 srcs: ["foo/bar/MyClass.java"],
7306 sdk_version: "none",
7307 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007308 apex_available: [ "myapex" ],
7309 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007310
7311 // Make sure that a preferred prebuilt does not affect the apex contents.
7312 prebuilt_platform_compat_config {
7313 name: "myjar-platform-compat-config",
7314 metadata: "compat-config/metadata.xml",
7315 prefer: true,
7316 }
atrost6e126252020-01-27 17:01:16 +00007317 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007318 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007319 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007320 "etc/compatconfig/myjar-platform-compat-config.xml",
7321 "javalib/myjar.jar",
7322 })
7323}
7324
Jooyung Han862c0d62022-12-21 10:15:37 +09007325func TestNoDupeApexFiles(t *testing.T) {
7326 android.GroupFixturePreparers(
7327 android.PrepareForTestWithAndroidBuildComponents,
7328 PrepareForTestWithApexBuildComponents,
7329 prepareForTestWithMyapex,
7330 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7331 ).
7332 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7333 RunTestWithBp(t, `
7334 apex {
7335 name: "myapex",
7336 key: "myapex.key",
7337 prebuilts: ["foo", "bar"],
7338 updatable: false,
7339 }
7340
7341 apex_key {
7342 name: "myapex.key",
7343 public_key: "testkey.avbpubkey",
7344 private_key: "testkey.pem",
7345 }
7346
7347 prebuilt_etc {
7348 name: "foo",
7349 src: "myprebuilt",
7350 filename_from_src: true,
7351 }
7352
7353 prebuilt_etc {
7354 name: "bar",
7355 src: "myprebuilt",
7356 filename_from_src: true,
7357 }
7358 `)
7359}
7360
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007361func TestApexUnwantedTransitiveDeps(t *testing.T) {
7362 bp := `
7363 apex {
7364 name: "myapex",
7365 key: "myapex.key",
7366 native_shared_libs: ["libfoo"],
7367 updatable: false,
7368 unwanted_transitive_deps: ["libbar"],
7369 }
7370
7371 apex_key {
7372 name: "myapex.key",
7373 public_key: "testkey.avbpubkey",
7374 private_key: "testkey.pem",
7375 }
7376
7377 cc_library {
7378 name: "libfoo",
7379 srcs: ["foo.cpp"],
7380 shared_libs: ["libbar"],
7381 apex_available: ["myapex"],
7382 }
7383
7384 cc_library {
7385 name: "libbar",
7386 srcs: ["bar.cpp"],
7387 apex_available: ["myapex"],
7388 }`
7389 ctx := testApex(t, bp)
7390 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7391 "*/libc++.so",
7392 "*/libfoo.so",
7393 // not libbar.so
7394 })
7395}
7396
Jiyong Park479321d2019-12-16 11:47:12 +09007397func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7398 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7399 apex {
7400 name: "myapex",
7401 key: "myapex.key",
7402 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007403 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007404 }
7405
7406 apex_key {
7407 name: "myapex.key",
7408 public_key: "testkey.avbpubkey",
7409 private_key: "testkey.pem",
7410 }
7411
7412 java_library {
7413 name: "myjar",
7414 srcs: ["foo/bar/MyClass.java"],
7415 sdk_version: "none",
7416 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007417 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007418 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007419 }
7420 `)
7421}
7422
Jiyong Park7afd1072019-12-30 16:56:33 +09007423func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007424 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007425 apex {
7426 name: "myapex",
7427 key: "myapex.key",
7428 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007429 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007430 }
7431
7432 apex_key {
7433 name: "myapex.key",
7434 public_key: "testkey.avbpubkey",
7435 private_key: "testkey.pem",
7436 }
7437
7438 cc_library {
7439 name: "mylib",
7440 srcs: ["mylib.cpp"],
7441 system_shared_libs: [],
7442 stl: "none",
7443 required: ["a", "b"],
7444 host_required: ["c", "d"],
7445 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007446 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007447 }
7448 `)
7449
Jooyung Hana0503a52023-08-23 13:12:50 +09007450 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007451 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007452 name := apexBundle.BaseModuleName()
7453 prefix := "TARGET_"
7454 var builder strings.Builder
7455 data.Custom(&builder, name, prefix, "", data)
7456 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007457 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007458 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7459 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007460}
7461
Jiyong Park7cd10e32020-01-14 09:22:18 +09007462func TestSymlinksFromApexToSystem(t *testing.T) {
7463 bp := `
7464 apex {
7465 name: "myapex",
7466 key: "myapex.key",
7467 native_shared_libs: ["mylib"],
7468 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007469 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007470 }
7471
Jiyong Park9d677202020-02-19 16:29:35 +09007472 apex {
7473 name: "myapex.updatable",
7474 key: "myapex.key",
7475 native_shared_libs: ["mylib"],
7476 java_libs: ["myjar"],
7477 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007478 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007479 }
7480
Jiyong Park7cd10e32020-01-14 09:22:18 +09007481 apex_key {
7482 name: "myapex.key",
7483 public_key: "testkey.avbpubkey",
7484 private_key: "testkey.pem",
7485 }
7486
7487 cc_library {
7488 name: "mylib",
7489 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007490 shared_libs: [
7491 "myotherlib",
7492 "myotherlib_ext",
7493 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007494 system_shared_libs: [],
7495 stl: "none",
7496 apex_available: [
7497 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007498 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007499 "//apex_available:platform",
7500 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007501 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007502 }
7503
7504 cc_library {
7505 name: "myotherlib",
7506 srcs: ["mylib.cpp"],
7507 system_shared_libs: [],
7508 stl: "none",
7509 apex_available: [
7510 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007511 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007512 "//apex_available:platform",
7513 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007514 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007515 }
7516
Jiyong Parkce243632023-02-17 18:22:25 +09007517 cc_library {
7518 name: "myotherlib_ext",
7519 srcs: ["mylib.cpp"],
7520 system_shared_libs: [],
7521 system_ext_specific: true,
7522 stl: "none",
7523 apex_available: [
7524 "myapex",
7525 "myapex.updatable",
7526 "//apex_available:platform",
7527 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007528 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007529 }
7530
Jiyong Park7cd10e32020-01-14 09:22:18 +09007531 java_library {
7532 name: "myjar",
7533 srcs: ["foo/bar/MyClass.java"],
7534 sdk_version: "none",
7535 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007536 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007537 apex_available: [
7538 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007539 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007540 "//apex_available:platform",
7541 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007542 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007543 }
7544
7545 java_library {
7546 name: "myotherjar",
7547 srcs: ["foo/bar/MyClass.java"],
7548 sdk_version: "none",
7549 system_modules: "none",
7550 apex_available: [
7551 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007552 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007553 "//apex_available:platform",
7554 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007555 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007556 }
7557 `
7558
7559 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7560 for _, f := range files {
7561 if f.path == file {
7562 if f.isLink {
7563 t.Errorf("%q is not a real file", file)
7564 }
7565 return
7566 }
7567 }
7568 t.Errorf("%q is not found", file)
7569 }
7570
Jiyong Parkce243632023-02-17 18:22:25 +09007571 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007572 for _, f := range files {
7573 if f.path == file {
7574 if !f.isLink {
7575 t.Errorf("%q is not a symlink", file)
7576 }
Jiyong Parkce243632023-02-17 18:22:25 +09007577 if f.src != target {
7578 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7579 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007580 return
7581 }
7582 }
7583 t.Errorf("%q is not found", file)
7584 }
7585
Jiyong Park9d677202020-02-19 16:29:35 +09007586 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7587 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007588 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007589 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007590 ensureRealfileExists(t, files, "javalib/myjar.jar")
7591 ensureRealfileExists(t, files, "lib64/mylib.so")
7592 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007593 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007594
Jooyung Hana0503a52023-08-23 13:12:50 +09007595 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007596 ensureRealfileExists(t, files, "javalib/myjar.jar")
7597 ensureRealfileExists(t, files, "lib64/mylib.so")
7598 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007599 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007600
7601 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007602 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007603 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007604 ensureRealfileExists(t, files, "javalib/myjar.jar")
7605 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007606 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7607 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007608
Jooyung Hana0503a52023-08-23 13:12:50 +09007609 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007610 ensureRealfileExists(t, files, "javalib/myjar.jar")
7611 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007612 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7613 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007614}
7615
Yo Chiange8128052020-07-23 20:09:18 +08007616func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007617 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007618 apex {
7619 name: "myapex",
7620 key: "myapex.key",
7621 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007622 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007623 }
7624
7625 apex_key {
7626 name: "myapex.key",
7627 public_key: "testkey.avbpubkey",
7628 private_key: "testkey.pem",
7629 }
7630
7631 cc_library_shared {
7632 name: "mylib",
7633 srcs: ["mylib.cpp"],
7634 shared_libs: ["myotherlib"],
7635 system_shared_libs: [],
7636 stl: "none",
7637 apex_available: [
7638 "myapex",
7639 "//apex_available:platform",
7640 ],
7641 }
7642
7643 cc_prebuilt_library_shared {
7644 name: "myotherlib",
7645 srcs: ["prebuilt.so"],
7646 system_shared_libs: [],
7647 stl: "none",
7648 apex_available: [
7649 "myapex",
7650 "//apex_available:platform",
7651 ],
7652 }
7653 `)
7654
Jooyung Hana0503a52023-08-23 13:12:50 +09007655 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007656 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007657 var builder strings.Builder
7658 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7659 androidMk := builder.String()
7660 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007661 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007662 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7663 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7664 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007665 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007666}
7667
Jooyung Han643adc42020-02-27 13:50:06 +09007668func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007669 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007670 apex {
7671 name: "myapex",
7672 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007673 binaries: ["mybin"],
7674 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007675 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007676 }
7677
7678 apex_key {
7679 name: "myapex.key",
7680 public_key: "testkey.avbpubkey",
7681 private_key: "testkey.pem",
7682 }
7683
7684 cc_library {
7685 name: "mylib",
7686 srcs: ["mylib.cpp"],
7687 shared_libs: ["mylib2"],
7688 system_shared_libs: [],
7689 stl: "none",
7690 apex_available: [ "myapex" ],
7691 }
7692
7693 cc_library {
7694 name: "mylib2",
7695 srcs: ["mylib.cpp"],
7696 system_shared_libs: [],
7697 stl: "none",
7698 apex_available: [ "myapex" ],
7699 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007700
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007701 // Used as both a JNI library and a regular shared library.
7702 cc_library {
7703 name: "mylib3",
7704 srcs: ["mylib.cpp"],
7705 system_shared_libs: [],
7706 stl: "none",
7707 apex_available: [ "myapex" ],
7708 }
7709
7710 cc_binary {
7711 name: "mybin",
7712 srcs: ["mybin.cpp"],
7713 shared_libs: ["mylib3"],
7714 system_shared_libs: [],
7715 stl: "none",
7716 apex_available: [ "myapex" ],
7717 }
7718
Jiyong Park34d5c332022-02-24 18:02:44 +09007719 rust_ffi_shared {
7720 name: "libfoo.rust",
7721 crate_name: "foo",
7722 srcs: ["foo.rs"],
7723 shared_libs: ["libfoo.shared_from_rust"],
7724 prefer_rlib: true,
7725 apex_available: ["myapex"],
7726 }
7727
7728 cc_library_shared {
7729 name: "libfoo.shared_from_rust",
7730 srcs: ["mylib.cpp"],
7731 system_shared_libs: [],
7732 stl: "none",
7733 stubs: {
7734 versions: ["10", "11", "12"],
7735 },
7736 }
7737
Jooyung Han643adc42020-02-27 13:50:06 +09007738 `)
7739
Jooyung Hana0503a52023-08-23 13:12:50 +09007740 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007741 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007742 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007743 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007744 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007745 "lib64/mylib.so",
7746 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007747 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007748 "lib64/libfoo.rust.so",
7749 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7750 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007751 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007752
7753 // b/220397949
7754 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007755}
7756
Jooyung Han49f67012020-04-17 13:43:10 +09007757func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007758 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007759 apex {
7760 name: "myapex",
7761 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007762 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007763 }
7764 apex_key {
7765 name: "myapex.key",
7766 public_key: "testkey.avbpubkey",
7767 private_key: "testkey.pem",
7768 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007769 `,
7770 android.FixtureModifyConfig(func(config android.Config) {
7771 delete(config.Targets, android.Android)
7772 config.AndroidCommonTarget = android.Target{}
7773 }),
7774 )
Jooyung Han49f67012020-04-17 13:43:10 +09007775
7776 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7777 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7778 }
7779}
7780
Jiyong Parkbd159612020-02-28 15:22:21 +09007781func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007782 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
7786 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 android_app {
7797 name: "AppFoo",
7798 srcs: ["foo/bar/MyClass.java"],
7799 sdk_version: "none",
7800 system_modules: "none",
7801 apex_available: [ "myapex" ],
7802 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007803 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007804
Jooyung Hana0503a52023-08-23 13:12:50 +09007805 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007806 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007807
7808 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007809 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 +09007810}
7811
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007812func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007813 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007814 apex {
7815 name: "myapex",
7816 key: "myapex.key",
7817 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007818 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007819 }
7820
7821 apex_key {
7822 name: "myapex.key",
7823 public_key: "testkey.avbpubkey",
7824 private_key: "testkey.pem",
7825 }
7826
7827 android_app_set {
7828 name: "AppSet",
7829 set: "AppSet.apks",
7830 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007831 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007832 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007833 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007834 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7835 s := mod.Rule("apexRule").Args["copy_commands"]
7836 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007837 if len(copyCmds) != 4 {
7838 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007839 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007840 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7841 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007842 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7843 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007844
7845 // Ensure that canned_fs_config has an entry for the app set zip file
7846 generateFsRule := mod.Rule("generateFsConfig")
7847 cmd := generateFsRule.RuleParams.Command
7848 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007849}
7850
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007851func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007852 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007853 apex_set {
7854 name: "myapex",
7855 filename: "foo_v2.apex",
7856 sanitized: {
7857 none: { set: "myapex.apks", },
7858 hwaddress: { set: "myapex.hwasan.apks", },
7859 },
Paul Duffin24704672021-04-06 16:09:30 +01007860 }
7861 `
7862 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007863
Paul Duffin24704672021-04-06 16:09:30 +01007864 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00007865 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007866
Spandan Das9d6e2092024-09-21 02:50:00 +00007867 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01007868 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007869
Paul Duffin24704672021-04-06 16:09:30 +01007870 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7871
7872 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007873 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7874 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007875
7876 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007877}
7878
Pranav Guptaeba03b02022-09-27 00:27:08 +00007879func TestApexSetApksModuleAssignment(t *testing.T) {
7880 ctx := testApex(t, `
7881 apex_set {
7882 name: "myapex",
7883 set: ":myapex_apks_file",
7884 }
7885
7886 filegroup {
7887 name: "myapex_apks_file",
7888 srcs: ["myapex.apks"],
7889 }
7890 `)
7891
Spandan Das9d6e2092024-09-21 02:50:00 +00007892 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00007893
7894 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00007895 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00007896 extractedApex := m.Output(extractorOutput)
7897
7898 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7899}
7900
Paul Duffin89f570a2021-06-16 01:42:33 +01007901func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007902 t.Helper()
7903
Paul Duffin55607122021-03-30 23:32:51 +01007904 fs := android.MockFS{
7905 "a.java": nil,
7906 "a.jar": nil,
7907 "apex_manifest.json": nil,
7908 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007909 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007910 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7911 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7912 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007913 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007914 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007915
Paul Duffin55607122021-03-30 23:32:51 +01007916 errorHandler := android.FixtureExpectsNoErrors
7917 if errmsg != "" {
7918 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007919 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007920
Paul Duffin55607122021-03-30 23:32:51 +01007921 result := android.GroupFixturePreparers(
7922 cc.PrepareForTestWithCcDefaultModules,
7923 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007924 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01007925 java.PrepareForTestWithJavaSdkLibraryFiles,
7926 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007927 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007928 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007929 android.FixtureModifyMockFS(func(fs android.MockFS) {
7930 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7931 insert := ""
7932 for _, fragment := range fragments {
7933 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7934 }
7935 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7936 platform_bootclasspath {
7937 name: "platform-bootclasspath",
7938 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007939 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01007940 %s
7941 ],
7942 }
7943 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007944 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007945 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007946 // Dexpreopt for boot jars requires the ART boot image profile.
7947 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
7948 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007949 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007950 ).
7951 ExtendWithErrorHandler(errorHandler).
7952 RunTestWithBp(t, bp)
7953
7954 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007955}
7956
Jooyung Han548640b2020-04-27 12:10:30 +09007957func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7958 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7959 apex {
7960 name: "myapex",
7961 key: "myapex.key",
7962 updatable: true,
7963 }
7964
7965 apex_key {
7966 name: "myapex.key",
7967 public_key: "testkey.avbpubkey",
7968 private_key: "testkey.pem",
7969 }
7970 `)
7971}
7972
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007973func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7974 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7975 apex {
7976 name: "myapex",
7977 key: "myapex.key",
7978 }
7979
7980 apex_key {
7981 name: "myapex.key",
7982 public_key: "testkey.avbpubkey",
7983 private_key: "testkey.pem",
7984 }
7985 `)
7986}
7987
satayevb98371c2021-06-15 16:49:50 +01007988func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7989 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7990 apex {
7991 name: "myapex",
7992 key: "myapex.key",
7993 systemserverclasspath_fragments: [
7994 "mysystemserverclasspathfragment",
7995 ],
7996 min_sdk_version: "29",
7997 updatable: true,
7998 }
7999
8000 apex_key {
8001 name: "myapex.key",
8002 public_key: "testkey.avbpubkey",
8003 private_key: "testkey.pem",
8004 }
8005
8006 java_library {
8007 name: "foo",
8008 srcs: ["b.java"],
8009 min_sdk_version: "29",
8010 installable: true,
8011 apex_available: [
8012 "myapex",
8013 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008014 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008015 }
8016
8017 systemserverclasspath_fragment {
8018 name: "mysystemserverclasspathfragment",
8019 generate_classpaths_proto: false,
8020 contents: [
8021 "foo",
8022 ],
8023 apex_available: [
8024 "myapex",
8025 ],
8026 }
satayevabcd5972021-08-06 17:49:46 +01008027 `,
8028 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8029 )
satayevb98371c2021-06-15 16:49:50 +01008030}
8031
Paul Duffin064b70c2020-11-02 17:32:38 +00008032func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008033 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008034 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008035 fragment := java.ApexVariantReference{
8036 Apex: proptools.StringPtr("myapex"),
8037 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8038 }
8039
Paul Duffin064b70c2020-11-02 17:32:38 +00008040 testDexpreoptWithApexes(t, `
8041 prebuilt_apex {
8042 name: "myapex" ,
8043 arch: {
8044 arm64: {
8045 src: "myapex-arm64.apex",
8046 },
8047 arm: {
8048 src: "myapex-arm.apex",
8049 },
8050 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008051 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8052 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008053
Paul Duffin89f570a2021-06-16 01:42:33 +01008054 prebuilt_bootclasspath_fragment {
8055 name: "my-bootclasspath-fragment",
8056 contents: ["libfoo"],
8057 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008058 hidden_api: {
8059 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8060 metadata: "my-bootclasspath-fragment/metadata.csv",
8061 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008062 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8063 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8064 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008065 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008066 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008067
Spandan Das52c01a12024-09-20 01:09:48 +00008068 java_sdk_library_import {
8069 name: "libfoo",
8070 prefer: true,
8071 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008072 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008073 },
8074 apex_available: ["myapex"],
8075 shared_library: false,
8076 permitted_packages: ["libfoo"],
8077 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008078 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008079 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008080}
8081
Spandan Dasf14e2542021-11-12 00:01:37 +00008082func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008083 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008084 bp += `
8085 apex_key {
8086 name: "myapex.key",
8087 public_key: "testkey.avbpubkey",
8088 private_key: "testkey.pem",
8089 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008090 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008091 "lib1/src/A.java": nil,
8092 "lib2/src/B.java": nil,
8093 "system/sepolicy/apex/myapex-file_contexts": nil,
8094 }
8095
Paul Duffin45338f02021-03-30 23:07:52 +01008096 errorHandler := android.FixtureExpectsNoErrors
8097 if errmsg != "" {
8098 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008099 }
Colin Crossae8600b2020-10-29 17:09:13 -07008100
Paul Duffin45338f02021-03-30 23:07:52 +01008101 android.GroupFixturePreparers(
8102 android.PrepareForTestWithAndroidBuildComponents,
8103 java.PrepareForTestWithJavaBuildComponents,
8104 PrepareForTestWithApexBuildComponents,
8105 android.PrepareForTestWithNeverallowRules(rules),
8106 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008107 apexBootJars := make([]string, 0, len(bootJars))
8108 for _, apexBootJar := range bootJars {
8109 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008110 }
satayevd604b212021-07-21 14:23:52 +01008111 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008112 }),
8113 fs.AddToFixture(),
8114 ).
8115 ExtendWithErrorHandler(errorHandler).
8116 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008117}
8118
8119func TestApexPermittedPackagesRules(t *testing.T) {
8120 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008121 name string
8122 expectedError string
8123 bp string
8124 bootJars []string
8125 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008126 }{
8127
8128 {
8129 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8130 expectedError: "",
8131 bp: `
8132 java_library {
8133 name: "bcp_lib1",
8134 srcs: ["lib1/src/*.java"],
8135 permitted_packages: ["foo.bar"],
8136 apex_available: ["myapex"],
8137 sdk_version: "none",
8138 system_modules: "none",
8139 }
8140 java_library {
8141 name: "nonbcp_lib2",
8142 srcs: ["lib2/src/*.java"],
8143 apex_available: ["myapex"],
8144 permitted_packages: ["a.b"],
8145 sdk_version: "none",
8146 system_modules: "none",
8147 }
8148 apex {
8149 name: "myapex",
8150 key: "myapex.key",
8151 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008152 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008153 }`,
8154 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008155 bcpPermittedPackages: map[string][]string{
8156 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008157 "foo.bar",
8158 },
8159 },
8160 },
8161 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008162 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008163 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 +01008164 bp: `
8165 java_library {
8166 name: "bcp_lib1",
8167 srcs: ["lib1/src/*.java"],
8168 apex_available: ["myapex"],
8169 permitted_packages: ["foo.bar"],
8170 sdk_version: "none",
8171 system_modules: "none",
8172 }
8173 java_library {
8174 name: "bcp_lib2",
8175 srcs: ["lib2/src/*.java"],
8176 apex_available: ["myapex"],
8177 permitted_packages: ["foo.bar", "bar.baz"],
8178 sdk_version: "none",
8179 system_modules: "none",
8180 }
8181 apex {
8182 name: "myapex",
8183 key: "myapex.key",
8184 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008185 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008186 }
8187 `,
8188 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008189 bcpPermittedPackages: map[string][]string{
8190 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008191 "foo.bar",
8192 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008193 "bcp_lib2": []string{
8194 "foo.bar",
8195 },
8196 },
8197 },
8198 {
8199 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8200 expectedError: "",
8201 bp: `
8202 java_library {
8203 name: "bcp_lib_restricted",
8204 srcs: ["lib1/src/*.java"],
8205 apex_available: ["myapex"],
8206 permitted_packages: ["foo.bar"],
8207 sdk_version: "none",
8208 min_sdk_version: "29",
8209 system_modules: "none",
8210 }
8211 java_library {
8212 name: "bcp_lib_unrestricted",
8213 srcs: ["lib2/src/*.java"],
8214 apex_available: ["myapex"],
8215 permitted_packages: ["foo.bar", "bar.baz"],
8216 sdk_version: "none",
8217 min_sdk_version: "29",
8218 system_modules: "none",
8219 }
8220 apex {
8221 name: "myapex",
8222 key: "myapex.key",
8223 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8224 updatable: true,
8225 min_sdk_version: "29",
8226 }
8227 `,
8228 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8229 bcpPermittedPackages: map[string][]string{
8230 "bcp_lib1_non_updateable": []string{
8231 "foo.bar",
8232 },
8233 // 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 +01008234 },
8235 },
8236 }
8237 for _, tc := range testcases {
8238 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008239 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8240 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008241 })
8242 }
8243}
8244
Jiyong Park62304bb2020-04-13 16:19:48 +09008245func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008246 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008247 apex {
8248 name: "myapex",
8249 key: "myapex.key",
8250 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008251 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008252 }
8253
8254 apex_key {
8255 name: "myapex.key",
8256 public_key: "testkey.avbpubkey",
8257 private_key: "testkey.pem",
8258 }
8259
8260 cc_library {
8261 name: "mylib",
8262 srcs: ["mylib.cpp"],
8263 system_shared_libs: [],
8264 stl: "none",
8265 stubs: {
8266 versions: ["1"],
8267 },
8268 apex_available: ["myapex"],
8269 }
8270
8271 cc_library {
8272 name: "myprivlib",
8273 srcs: ["mylib.cpp"],
8274 system_shared_libs: [],
8275 stl: "none",
8276 apex_available: ["myapex"],
8277 }
8278
8279
8280 cc_test {
8281 name: "mytest",
8282 gtest: false,
8283 srcs: ["mylib.cpp"],
8284 system_shared_libs: [],
8285 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008286 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008287 test_for: ["myapex"]
8288 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008289
8290 cc_library {
8291 name: "mytestlib",
8292 srcs: ["mylib.cpp"],
8293 system_shared_libs: [],
8294 shared_libs: ["mylib", "myprivlib"],
8295 stl: "none",
8296 test_for: ["myapex"],
8297 }
8298
8299 cc_benchmark {
8300 name: "mybench",
8301 srcs: ["mylib.cpp"],
8302 system_shared_libs: [],
8303 shared_libs: ["mylib", "myprivlib"],
8304 stl: "none",
8305 test_for: ["myapex"],
8306 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008307 `)
8308
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008309 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008310 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008311 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8312 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8313 }
8314
8315 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008316 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008317 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8318 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8319 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8320}
Jiyong Park46a512f2020-12-04 18:02:13 +09008321
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008322func TestIndirectTestFor(t *testing.T) {
8323 ctx := testApex(t, `
8324 apex {
8325 name: "myapex",
8326 key: "myapex.key",
8327 native_shared_libs: ["mylib", "myprivlib"],
8328 updatable: false,
8329 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008330
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008331 apex_key {
8332 name: "myapex.key",
8333 public_key: "testkey.avbpubkey",
8334 private_key: "testkey.pem",
8335 }
8336
8337 cc_library {
8338 name: "mylib",
8339 srcs: ["mylib.cpp"],
8340 system_shared_libs: [],
8341 stl: "none",
8342 stubs: {
8343 versions: ["1"],
8344 },
8345 apex_available: ["myapex"],
8346 }
8347
8348 cc_library {
8349 name: "myprivlib",
8350 srcs: ["mylib.cpp"],
8351 system_shared_libs: [],
8352 stl: "none",
8353 shared_libs: ["mylib"],
8354 apex_available: ["myapex"],
8355 }
8356
8357 cc_library {
8358 name: "mytestlib",
8359 srcs: ["mylib.cpp"],
8360 system_shared_libs: [],
8361 shared_libs: ["myprivlib"],
8362 stl: "none",
8363 test_for: ["myapex"],
8364 }
8365 `)
8366
8367 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008368 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008369 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8370 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8371 }
8372
8373 // The platform variant of mytestlib links to the platform variant of the
8374 // internal myprivlib.
8375 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8376
8377 // The platform variant of myprivlib links to the platform variant of mylib
8378 // and bypasses its stubs.
8379 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 +09008380}
8381
Martin Stjernholmec009002021-03-27 15:18:31 +00008382func TestTestForForLibInOtherApex(t *testing.T) {
8383 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8384 _ = testApex(t, `
8385 apex {
8386 name: "com.android.art",
8387 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008388 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008389 updatable: false,
8390 }
8391
8392 apex {
8393 name: "com.android.art.debug",
8394 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008395 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008396 updatable: false,
8397 }
8398
8399 apex_key {
8400 name: "myapex.key",
8401 public_key: "testkey.avbpubkey",
8402 private_key: "testkey.pem",
8403 }
8404
8405 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008406 name: "libnativebridge",
8407 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008408 system_shared_libs: [],
8409 stl: "none",
8410 stubs: {
8411 versions: ["1"],
8412 },
8413 apex_available: ["com.android.art", "com.android.art.debug"],
8414 }
8415
8416 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008417 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008418 srcs: ["mylib.cpp"],
8419 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008420 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008421 stl: "none",
8422 apex_available: ["com.android.art.debug"],
8423 test_for: ["com.android.art"],
8424 }
8425 `,
8426 android.MockFS{
8427 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8428 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8429 }.AddToFixture())
8430}
8431
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008432// TODO(jungjw): Move this to proptools
8433func intPtr(i int) *int {
8434 return &i
8435}
8436
8437func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008438 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008439 apex_set {
8440 name: "myapex",
8441 set: "myapex.apks",
8442 filename: "foo_v2.apex",
8443 overrides: ["foo"],
8444 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008445 `,
8446 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8447 variables.Platform_sdk_version = intPtr(30)
8448 }),
8449 android.FixtureModifyConfig(func(config android.Config) {
8450 config.Targets[android.Android] = []android.Target{
8451 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8452 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8453 }
8454 }),
8455 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008456
Spandan Das9d6e2092024-09-21 02:50:00 +00008457 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008458
8459 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008460 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008461 actual := extractedApex.Args["abis"]
8462 expected := "ARMEABI_V7A,ARM64_V8A"
8463 if actual != expected {
8464 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8465 }
8466 actual = extractedApex.Args["sdk-version"]
8467 expected = "30"
8468 if actual != expected {
8469 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8470 }
8471
Paul Duffin6717d882021-06-15 19:09:41 +01008472 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008473 a := m.Module().(*ApexSet)
8474 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008475 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008476 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8477 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8478 }
8479}
8480
Anton Hansson805e0a52022-11-25 14:06:46 +00008481func TestApexSet_NativeBridge(t *testing.T) {
8482 ctx := testApex(t, `
8483 apex_set {
8484 name: "myapex",
8485 set: "myapex.apks",
8486 filename: "foo_v2.apex",
8487 overrides: ["foo"],
8488 }
8489 `,
8490 android.FixtureModifyConfig(func(config android.Config) {
8491 config.Targets[android.Android] = []android.Target{
8492 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8493 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8494 }
8495 }),
8496 )
8497
Spandan Das9d6e2092024-09-21 02:50:00 +00008498 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008499
8500 // Check extract_apks tool parameters. No native bridge arch expected
8501 extractedApex := m.Output("extracted/myapex.apks")
8502 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8503}
8504
Jiyong Park7d95a512020-05-10 15:16:24 +09008505func TestNoStaticLinkingToStubsLib(t *testing.T) {
8506 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8507 apex {
8508 name: "myapex",
8509 key: "myapex.key",
8510 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008511 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008512 }
8513
8514 apex_key {
8515 name: "myapex.key",
8516 public_key: "testkey.avbpubkey",
8517 private_key: "testkey.pem",
8518 }
8519
8520 cc_library {
8521 name: "mylib",
8522 srcs: ["mylib.cpp"],
8523 static_libs: ["otherlib"],
8524 system_shared_libs: [],
8525 stl: "none",
8526 apex_available: [ "myapex" ],
8527 }
8528
8529 cc_library {
8530 name: "otherlib",
8531 srcs: ["mylib.cpp"],
8532 system_shared_libs: [],
8533 stl: "none",
8534 stubs: {
8535 versions: ["1", "2", "3"],
8536 },
8537 apex_available: [ "myapex" ],
8538 }
8539 `)
8540}
8541
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008542func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008543 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008544 apex {
8545 name: "myapex",
8546 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008547 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008548 custom_sign_tool: "sign_myapex",
8549 }
8550
8551 apex_key {
8552 name: "myapex.key",
8553 public_key: "testkey.avbpubkey",
8554 private_key: "testkey.pem",
8555 }
8556 `)
8557
Jooyung Han286957d2023-10-30 16:17:56 +09008558 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008559 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008560 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09008561}
8562
8563func TestApexKeysTxtOverrides(t *testing.T) {
8564 ctx := testApex(t, `
8565 apex {
8566 name: "myapex",
8567 key: "myapex.key",
8568 updatable: false,
8569 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008570 }
8571
8572 apex_key {
8573 name: "myapex.key",
8574 public_key: "testkey.avbpubkey",
8575 private_key: "testkey.pem",
8576 }
8577
8578 prebuilt_apex {
8579 name: "myapex",
8580 prefer: true,
8581 arch: {
8582 arm64: {
8583 src: "myapex-arm64.apex",
8584 },
8585 arm: {
8586 src: "myapex-arm.apex",
8587 },
8588 },
8589 }
8590
8591 apex_set {
8592 name: "myapex_set",
8593 set: "myapex.apks",
8594 filename: "myapex_set.apex",
8595 overrides: ["myapex"],
8596 }
8597 `)
8598
Colin Crossf61d03d2023-11-02 16:56:39 -07008599 content := android.ContentFromFileRuleForTests(t, ctx,
8600 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008601 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07008602 content = android.ContentFromFileRuleForTests(t, ctx,
8603 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008604 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008605}
8606
Jooyung Han938b5932020-06-20 12:47:47 +09008607func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008608 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008609 apex {
8610 name: "myapex",
8611 key: "myapex.key",
8612 apps: ["app"],
8613 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008614 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008615 }
8616
8617 apex_key {
8618 name: "myapex.key",
8619 public_key: "testkey.avbpubkey",
8620 private_key: "testkey.pem",
8621 }
8622
8623 android_app {
8624 name: "app",
8625 srcs: ["foo/bar/MyClass.java"],
8626 package_name: "foo",
8627 sdk_version: "none",
8628 system_modules: "none",
8629 apex_available: [ "myapex" ],
8630 }
8631 `, withFiles(map[string][]byte{
8632 "sub/Android.bp": []byte(`
8633 override_apex {
8634 name: "override_myapex",
8635 base: "myapex",
8636 apps: ["override_app"],
8637 allowed_files: ":allowed",
8638 }
8639 // Overridable "path" property should be referenced indirectly
8640 filegroup {
8641 name: "allowed",
8642 srcs: ["allowed.txt"],
8643 }
8644 override_android_app {
8645 name: "override_app",
8646 base: "app",
8647 package_name: "bar",
8648 }
8649 `),
8650 }))
8651
Jooyung Hana0503a52023-08-23 13:12:50 +09008652 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008653 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8654 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8655 }
8656
Spandan Das50801e22024-05-13 18:29:45 +00008657 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008658 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8659 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8660 }
8661}
8662
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008663func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008664 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008665 apex {
8666 name: "myapex",
8667 key: "myapex.key",
8668 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008669 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008670 }
8671
8672 apex_key {
8673 name: "myapex.key",
8674 public_key: "testkey.avbpubkey",
8675 private_key: "testkey.pem",
8676 }
8677
8678 cc_library {
8679 name: "mylib",
8680 srcs: ["mylib.cpp"],
8681 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008682 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008683 },
8684 apex_available: ["myapex"],
8685 }
8686
8687 cc_prebuilt_library_shared {
8688 name: "mylib",
8689 prefer: false,
8690 srcs: ["prebuilt.so"],
8691 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008692 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008693 },
8694 apex_available: ["myapex"],
8695 }
8696 `)
8697}
8698
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008699func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008700 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008701 apex {
8702 name: "myapex",
8703 key: "myapex.key",
8704 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008705 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008706 }
8707 apex_key {
8708 name: "myapex.key",
8709 public_key: "testkey.avbpubkey",
8710 private_key: "testkey.pem",
8711 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008712 `,
8713 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8714 variables.CompressedApex = proptools.BoolPtr(true)
8715 }),
8716 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008717
Jooyung Hana0503a52023-08-23 13:12:50 +09008718 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008719 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8720
Jooyung Hana0503a52023-08-23 13:12:50 +09008721 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008722 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8723
8724 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008725 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008726 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8727
8728 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008729 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008730 var builder strings.Builder
8731 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8732 androidMk := builder.String()
8733 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8734}
8735
Jooyung Han26ec8482024-07-31 15:04:05 +09008736func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8737 for _, compressionEnabled := range []bool{true, false} {
8738 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8739 ctx := testApex(t, `
8740 apex_set {
8741 name: "com.company.android.myapex",
8742 apex_name: "com.android.myapex",
8743 set: "company-myapex.apks",
8744 }
8745 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8746 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8747 }),
8748 )
8749
8750 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8751 if compressionEnabled {
8752 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8753 } else {
8754 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8755 }
8756 })
8757 }
8758}
8759
Martin Stjernholm2856c662020-12-02 15:03:42 +00008760func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008761 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008762 apex {
8763 name: "myapex",
8764 key: "myapex.key",
8765 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008766 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008767 }
8768
8769 apex_key {
8770 name: "myapex.key",
8771 public_key: "testkey.avbpubkey",
8772 private_key: "testkey.pem",
8773 }
8774
8775 cc_library {
8776 name: "mylib",
8777 srcs: ["mylib.cpp"],
8778 apex_available: ["myapex"],
8779 shared_libs: ["otherlib"],
8780 system_shared_libs: [],
8781 }
8782
8783 cc_library {
8784 name: "otherlib",
8785 srcs: ["mylib.cpp"],
8786 stubs: {
8787 versions: ["current"],
8788 },
8789 }
8790
8791 cc_prebuilt_library_shared {
8792 name: "otherlib",
8793 prefer: true,
8794 srcs: ["prebuilt.so"],
8795 stubs: {
8796 versions: ["current"],
8797 },
8798 }
8799 `)
8800
Jooyung Hana0503a52023-08-23 13:12:50 +09008801 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008802 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008803 var builder strings.Builder
8804 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8805 androidMk := builder.String()
8806
8807 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8808 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008809 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00008810}
8811
Jiyong Parke3867542020-12-03 17:28:25 +09008812func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008813 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008814 apex {
8815 name: "myapex",
8816 key: "myapex.key",
8817 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008818 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008819 }
8820
8821 apex_key {
8822 name: "myapex.key",
8823 public_key: "testkey.avbpubkey",
8824 private_key: "testkey.pem",
8825 }
8826
8827 cc_library {
8828 name: "mylib",
8829 srcs: ["mylib.cpp"],
8830 system_shared_libs: [],
8831 stl: "none",
8832 apex_available: ["myapex"],
8833 shared_libs: ["mylib2"],
8834 target: {
8835 apex: {
8836 exclude_shared_libs: ["mylib2"],
8837 },
8838 },
8839 }
8840
8841 cc_library {
8842 name: "mylib2",
8843 srcs: ["mylib.cpp"],
8844 system_shared_libs: [],
8845 stl: "none",
8846 }
8847 `)
8848
8849 // Check if mylib is linked to mylib2 for the non-apex target
8850 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8851 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8852
8853 // Make sure that the link doesn't occur for the apex target
8854 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8855 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8856
8857 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09008858 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09008859 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8860}
8861
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008862func TestPrebuiltStubLibDep(t *testing.T) {
8863 bpBase := `
8864 apex {
8865 name: "myapex",
8866 key: "myapex.key",
8867 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008868 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008869 }
8870 apex_key {
8871 name: "myapex.key",
8872 public_key: "testkey.avbpubkey",
8873 private_key: "testkey.pem",
8874 }
8875 cc_library {
8876 name: "mylib",
8877 srcs: ["mylib.cpp"],
8878 apex_available: ["myapex"],
8879 shared_libs: ["stublib"],
8880 system_shared_libs: [],
8881 }
8882 apex {
8883 name: "otherapex",
8884 enabled: %s,
8885 key: "myapex.key",
8886 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008887 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008888 }
8889 `
8890
8891 stublibSourceBp := `
8892 cc_library {
8893 name: "stublib",
8894 srcs: ["mylib.cpp"],
8895 apex_available: ["otherapex"],
8896 system_shared_libs: [],
8897 stl: "none",
8898 stubs: {
8899 versions: ["1"],
8900 },
8901 }
8902 `
8903
8904 stublibPrebuiltBp := `
8905 cc_prebuilt_library_shared {
8906 name: "stublib",
8907 srcs: ["prebuilt.so"],
8908 apex_available: ["otherapex"],
8909 stubs: {
8910 versions: ["1"],
8911 },
8912 %s
8913 }
8914 `
8915
8916 tests := []struct {
8917 name string
8918 stublibBp string
8919 usePrebuilt bool
8920 modNames []string // Modules to collect AndroidMkEntries for
8921 otherApexEnabled []string
8922 }{
8923 {
8924 name: "only_source",
8925 stublibBp: stublibSourceBp,
8926 usePrebuilt: false,
8927 modNames: []string{"stublib"},
8928 otherApexEnabled: []string{"true", "false"},
8929 },
8930 {
8931 name: "source_preferred",
8932 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8933 usePrebuilt: false,
8934 modNames: []string{"stublib", "prebuilt_stublib"},
8935 otherApexEnabled: []string{"true", "false"},
8936 },
8937 {
8938 name: "prebuilt_preferred",
8939 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8940 usePrebuilt: true,
8941 modNames: []string{"stublib", "prebuilt_stublib"},
8942 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8943 },
8944 {
8945 name: "only_prebuilt",
8946 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8947 usePrebuilt: true,
8948 modNames: []string{"stublib"},
8949 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8950 },
8951 }
8952
8953 for _, test := range tests {
8954 t.Run(test.name, func(t *testing.T) {
8955 for _, otherApexEnabled := range test.otherApexEnabled {
8956 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008957 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008958
8959 type modAndMkEntries struct {
8960 mod *cc.Module
8961 mkEntries android.AndroidMkEntries
8962 }
8963 entries := []*modAndMkEntries{}
8964
8965 // Gather shared lib modules that are installable
8966 for _, modName := range test.modNames {
8967 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8968 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8969 continue
8970 }
8971 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07008972 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008973 continue
8974 }
Colin Crossaa255532020-07-03 13:18:24 -07008975 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008976 if ent.Disabled {
8977 continue
8978 }
8979 entries = append(entries, &modAndMkEntries{
8980 mod: mod,
8981 mkEntries: ent,
8982 })
8983 }
8984 }
8985 }
8986
8987 var entry *modAndMkEntries = nil
8988 for _, ent := range entries {
8989 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8990 if entry != nil {
8991 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8992 } else {
8993 entry = ent
8994 }
8995 }
8996 }
8997
8998 if entry == nil {
8999 t.Errorf("AndroidMk entry for \"stublib\" missing")
9000 } else {
9001 isPrebuilt := entry.mod.Prebuilt() != nil
9002 if isPrebuilt != test.usePrebuilt {
9003 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9004 }
9005 if !entry.mod.IsStubs() {
9006 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9007 }
9008 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9009 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9010 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009011 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009012 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009013 if !android.InList(expected, cflags) {
9014 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9015 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009016 }
9017 })
9018 }
9019 })
9020 }
9021}
9022
Colin Crossc33e5212021-05-25 18:16:02 -07009023func TestApexJavaCoverage(t *testing.T) {
9024 bp := `
9025 apex {
9026 name: "myapex",
9027 key: "myapex.key",
9028 java_libs: ["mylib"],
9029 bootclasspath_fragments: ["mybootclasspathfragment"],
9030 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9031 updatable: false,
9032 }
9033
9034 apex_key {
9035 name: "myapex.key",
9036 public_key: "testkey.avbpubkey",
9037 private_key: "testkey.pem",
9038 }
9039
9040 java_library {
9041 name: "mylib",
9042 srcs: ["mylib.java"],
9043 apex_available: ["myapex"],
9044 compile_dex: true,
9045 }
9046
9047 bootclasspath_fragment {
9048 name: "mybootclasspathfragment",
9049 contents: ["mybootclasspathlib"],
9050 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009051 hidden_api: {
9052 split_packages: ["*"],
9053 },
Colin Crossc33e5212021-05-25 18:16:02 -07009054 }
9055
9056 java_library {
9057 name: "mybootclasspathlib",
9058 srcs: ["mybootclasspathlib.java"],
9059 apex_available: ["myapex"],
9060 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009061 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009062 }
9063
9064 systemserverclasspath_fragment {
9065 name: "mysystemserverclasspathfragment",
9066 contents: ["mysystemserverclasspathlib"],
9067 apex_available: ["myapex"],
9068 }
9069
9070 java_library {
9071 name: "mysystemserverclasspathlib",
9072 srcs: ["mysystemserverclasspathlib.java"],
9073 apex_available: ["myapex"],
9074 compile_dex: true,
9075 }
9076 `
9077
9078 result := android.GroupFixturePreparers(
9079 PrepareForTestWithApexBuildComponents,
9080 prepareForTestWithMyapex,
9081 java.PrepareForTestWithJavaDefaultModules,
9082 android.PrepareForTestWithAndroidBuildComponents,
9083 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009084 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9085 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009086 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009087 ).RunTest(t)
9088
9089 // Make sure jacoco ran on both mylib and mybootclasspathlib
9090 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9091 t.Errorf("Failed to find jacoco rule for mylib")
9092 }
9093 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9094 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9095 }
9096 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9097 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9098 }
9099}
9100
Jiyong Park192600a2021-08-03 07:52:17 +00009101func TestProhibitStaticExecutable(t *testing.T) {
9102 testApexError(t, `executable mybin is static`, `
9103 apex {
9104 name: "myapex",
9105 key: "myapex.key",
9106 binaries: ["mybin"],
9107 min_sdk_version: "29",
9108 }
9109
9110 apex_key {
9111 name: "myapex.key",
9112 public_key: "testkey.avbpubkey",
9113 private_key: "testkey.pem",
9114 }
9115
9116 cc_binary {
9117 name: "mybin",
9118 srcs: ["mylib.cpp"],
9119 relative_install_path: "foo/bar",
9120 static_executable: true,
9121 system_shared_libs: [],
9122 stl: "none",
9123 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009124 min_sdk_version: "29",
9125 }
9126 `)
9127
9128 testApexError(t, `executable mybin.rust is static`, `
9129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 binaries: ["mybin.rust"],
9133 min_sdk_version: "29",
9134 }
9135
9136 apex_key {
9137 name: "myapex.key",
9138 public_key: "testkey.avbpubkey",
9139 private_key: "testkey.pem",
9140 }
9141
9142 rust_binary {
9143 name: "mybin.rust",
9144 srcs: ["foo.rs"],
9145 static_executable: true,
9146 apex_available: ["myapex"],
9147 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009148 }
9149 `)
9150}
9151
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009152func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9153 ctx := testApex(t, `
9154 apex {
9155 name: "myapex",
9156 key: "myapex.key",
9157 updatable: false,
9158 java_libs: ["foo"],
9159 }
9160
9161 apex_key {
9162 name: "myapex.key",
9163 public_key: "testkey.avbpubkey",
9164 private_key: "testkey.pem",
9165 }
9166
9167 java_library {
9168 name: "foo",
9169 srcs: ["foo.java"],
9170 apex_available: ["myapex"],
9171 installable: true,
9172 }
9173 `,
9174 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9175 )
9176
Jooyung Hana0503a52023-08-23 13:12:50 +09009177 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009178 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9179 var builder strings.Builder
9180 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9181 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009182 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009183}
9184
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009185func TestAndroidMk_RequiredModules(t *testing.T) {
9186 ctx := testApex(t, `
9187 apex {
9188 name: "myapex",
9189 key: "myapex.key",
9190 updatable: false,
9191 java_libs: ["foo"],
9192 required: ["otherapex"],
9193 }
9194
9195 apex {
9196 name: "otherapex",
9197 key: "myapex.key",
9198 updatable: false,
9199 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009200 }
9201
9202 apex_key {
9203 name: "myapex.key",
9204 public_key: "testkey.avbpubkey",
9205 private_key: "testkey.pem",
9206 }
9207
9208 java_library {
9209 name: "foo",
9210 srcs: ["foo.java"],
9211 apex_available: ["myapex", "otherapex"],
9212 installable: true,
9213 }
9214 `)
9215
Jooyung Hana0503a52023-08-23 13:12:50 +09009216 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009217 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9218 var builder strings.Builder
9219 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9220 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009221 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009222}
9223
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009224func TestAndroidMk_RequiredDeps(t *testing.T) {
9225 ctx := testApex(t, `
9226 apex {
9227 name: "myapex",
9228 key: "myapex.key",
9229 updatable: false,
9230 }
9231
9232 apex_key {
9233 name: "myapex.key",
9234 public_key: "testkey.avbpubkey",
9235 private_key: "testkey.pem",
9236 }
9237 `)
9238
Jooyung Hana0503a52023-08-23 13:12:50 +09009239 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009240 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009241 data := android.AndroidMkDataForTest(t, ctx, bundle)
9242 var builder strings.Builder
9243 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9244 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009245 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009246}
9247
Jooyung Hana6d36672022-02-24 13:58:07 +09009248func TestApexOutputFileProducer(t *testing.T) {
9249 for _, tc := range []struct {
9250 name string
9251 ref string
9252 expected_data []string
9253 }{
9254 {
9255 name: "test_using_output",
9256 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009257 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009258 },
9259 {
9260 name: "test_using_apex",
9261 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009262 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009263 },
9264 } {
9265 t.Run(tc.name, func(t *testing.T) {
9266 ctx := testApex(t, `
9267 apex {
9268 name: "myapex",
9269 key: "myapex.key",
9270 compressible: true,
9271 updatable: false,
9272 }
9273
9274 apex_key {
9275 name: "myapex.key",
9276 public_key: "testkey.avbpubkey",
9277 private_key: "testkey.pem",
9278 }
9279
9280 java_test {
9281 name: "`+tc.name+`",
9282 srcs: ["a.java"],
9283 data: ["`+tc.ref+`"],
9284 }
9285 `,
9286 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9287 variables.CompressedApex = proptools.BoolPtr(true)
9288 }))
9289 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9290 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9291 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9292 })
9293 }
9294}
9295
satayev758968a2021-12-06 11:42:40 +00009296func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9297 preparer := android.GroupFixturePreparers(
9298 PrepareForTestWithApexBuildComponents,
9299 prepareForTestWithMyapex,
9300 java.PrepareForTestWithJavaSdkLibraryFiles,
9301 java.PrepareForTestWithJavaDefaultModules,
9302 android.PrepareForTestWithAndroidBuildComponents,
9303 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9304 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9305 )
9306
9307 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9308 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9309 preparer.RunTestWithBp(t, `
9310 apex {
9311 name: "myapex",
9312 key: "myapex.key",
9313 bootclasspath_fragments: ["mybootclasspathfragment"],
9314 min_sdk_version: "30",
9315 updatable: false,
9316 }
9317
9318 apex_key {
9319 name: "myapex.key",
9320 public_key: "testkey.avbpubkey",
9321 private_key: "testkey.pem",
9322 }
9323
9324 bootclasspath_fragment {
9325 name: "mybootclasspathfragment",
9326 contents: ["mybootclasspathlib"],
9327 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009328 hidden_api: {
9329 split_packages: ["*"],
9330 },
satayev758968a2021-12-06 11:42:40 +00009331 }
9332
9333 java_sdk_library {
9334 name: "mybootclasspathlib",
9335 srcs: ["mybootclasspathlib.java"],
9336 apex_available: ["myapex"],
9337 compile_dex: true,
9338 unsafe_ignore_missing_latest_api: true,
9339 min_sdk_version: "31",
9340 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009341 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009342 }
9343
9344 java_library {
9345 name: "util",
9346 srcs: ["a.java"],
9347 apex_available: ["myapex"],
9348 min_sdk_version: "31",
9349 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009350 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009351 }
9352
9353 java_library {
9354 name: "another_util",
9355 srcs: ["a.java"],
9356 min_sdk_version: "31",
9357 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009358 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009359 }
9360 `)
9361 })
9362
9363 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9364 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9365 preparer.RunTestWithBp(t, `
9366 apex {
9367 name: "myapex",
9368 key: "myapex.key",
9369 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9370 min_sdk_version: "30",
9371 updatable: false,
9372 }
9373
9374 apex_key {
9375 name: "myapex.key",
9376 public_key: "testkey.avbpubkey",
9377 private_key: "testkey.pem",
9378 }
9379
9380 systemserverclasspath_fragment {
9381 name: "mysystemserverclasspathfragment",
9382 contents: ["mysystemserverclasspathlib"],
9383 apex_available: ["myapex"],
9384 }
9385
9386 java_sdk_library {
9387 name: "mysystemserverclasspathlib",
9388 srcs: ["mysystemserverclasspathlib.java"],
9389 apex_available: ["myapex"],
9390 compile_dex: true,
9391 min_sdk_version: "32",
9392 unsafe_ignore_missing_latest_api: true,
9393 static_libs: ["util"],
9394 }
9395
9396 java_library {
9397 name: "util",
9398 srcs: ["a.java"],
9399 apex_available: ["myapex"],
9400 min_sdk_version: "31",
9401 static_libs: ["another_util"],
9402 }
9403
9404 java_library {
9405 name: "another_util",
9406 srcs: ["a.java"],
9407 min_sdk_version: "31",
9408 apex_available: ["myapex"],
9409 }
9410 `)
9411 })
9412
9413 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009414 preparer.
satayev758968a2021-12-06 11:42:40 +00009415 RunTestWithBp(t, `
9416 apex {
9417 name: "myapex",
9418 key: "myapex.key",
9419 bootclasspath_fragments: ["mybootclasspathfragment"],
9420 min_sdk_version: "30",
9421 updatable: false,
9422 }
9423
9424 apex_key {
9425 name: "myapex.key",
9426 public_key: "testkey.avbpubkey",
9427 private_key: "testkey.pem",
9428 }
9429
9430 bootclasspath_fragment {
9431 name: "mybootclasspathfragment",
9432 contents: ["mybootclasspathlib"],
9433 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009434 hidden_api: {
9435 split_packages: ["*"],
9436 },
satayev758968a2021-12-06 11:42:40 +00009437 }
9438
9439 java_sdk_library {
9440 name: "mybootclasspathlib",
9441 srcs: ["mybootclasspathlib.java"],
9442 apex_available: ["myapex"],
9443 compile_dex: true,
9444 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009445 sdk_version: "current",
9446 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009447 }
9448 `)
9449 })
9450
9451 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9452 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9453 RunTestWithBp(t, `
9454 apex {
9455 name: "myapex",
9456 key: "myapex.key",
9457 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9458 min_sdk_version: "30",
9459 updatable: false,
9460 }
9461
9462 apex_key {
9463 name: "myapex.key",
9464 public_key: "testkey.avbpubkey",
9465 private_key: "testkey.pem",
9466 }
9467
9468 systemserverclasspath_fragment {
9469 name: "mysystemserverclasspathfragment",
9470 contents: ["mysystemserverclasspathlib"],
9471 apex_available: ["myapex"],
9472 }
9473
9474 java_sdk_library {
9475 name: "mysystemserverclasspathlib",
9476 srcs: ["mysystemserverclasspathlib.java"],
9477 apex_available: ["myapex"],
9478 compile_dex: true,
9479 unsafe_ignore_missing_latest_api: true,
9480 }
9481 `)
9482 })
9483}
9484
Jiakai Zhang6decef92022-01-12 17:56:19 +00009485// Verifies that the APEX depends on all the Make modules in the list.
9486func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9487 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9488 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009489 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009490 }
9491}
9492
9493// Verifies that the APEX does not depend on any of the Make modules in the list.
9494func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9495 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9496 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009497 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009498 }
9499}
9500
Cole Faust24e25c02024-01-19 14:12:17 -08009501func TestApexStrictUpdtabilityLint(t *testing.T) {
9502 bpTemplate := `
9503 apex {
9504 name: "myapex",
9505 key: "myapex.key",
9506 java_libs: ["myjavalib"],
9507 updatable: %v,
9508 min_sdk_version: "29",
9509 }
9510 apex_key {
9511 name: "myapex.key",
9512 }
9513 java_library {
9514 name: "myjavalib",
9515 srcs: ["MyClass.java"],
9516 apex_available: [ "myapex" ],
9517 lint: {
9518 strict_updatability_linting: %v,
9519 %s
9520 },
9521 sdk_version: "current",
9522 min_sdk_version: "29",
9523 }
9524 `
9525 fs := android.MockFS{
9526 "lint-baseline.xml": nil,
9527 }
9528
9529 testCases := []struct {
9530 testCaseName string
9531 apexUpdatable bool
9532 javaStrictUpdtabilityLint bool
9533 lintFileExists bool
9534 disallowedFlagExpected bool
9535 }{
9536 {
9537 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9538 apexUpdatable: true,
9539 javaStrictUpdtabilityLint: true,
9540 lintFileExists: false,
9541 disallowedFlagExpected: false,
9542 },
9543 {
9544 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9545 apexUpdatable: false,
9546 javaStrictUpdtabilityLint: false,
9547 lintFileExists: true,
9548 disallowedFlagExpected: false,
9549 },
9550 {
9551 testCaseName: "non-updatable apex respects strict updatability of javalib",
9552 apexUpdatable: false,
9553 javaStrictUpdtabilityLint: true,
9554 lintFileExists: true,
9555 disallowedFlagExpected: true,
9556 },
9557 {
9558 testCaseName: "updatable apex sets strict updatability of javalib to true",
9559 apexUpdatable: true,
9560 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9561 lintFileExists: true,
9562 disallowedFlagExpected: true,
9563 },
9564 }
9565
9566 for _, testCase := range testCases {
9567 fixtures := []android.FixturePreparer{}
9568 baselineProperty := ""
9569 if testCase.lintFileExists {
9570 fixtures = append(fixtures, fs.AddToFixture())
9571 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9572 }
9573 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9574
9575 result := testApex(t, bp, fixtures...)
9576 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9577 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9578 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9579
9580 if disallowedFlagActual != testCase.disallowedFlagExpected {
9581 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9582 }
9583 }
9584}
9585
9586func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9587 bp := `
9588 apex {
9589 name: "myapex",
9590 key: "myapex.key",
9591 java_libs: ["myjavalib"],
9592 updatable: true,
9593 min_sdk_version: "29",
9594 }
9595 apex_key {
9596 name: "myapex.key",
9597 }
9598 java_library {
9599 name: "myjavalib",
9600 srcs: ["MyClass.java"],
9601 apex_available: [ "myapex" ],
9602 sdk_version: "current",
9603 min_sdk_version: "29",
9604 lint: {
9605 baseline_filename: "lint-baseline.xml",
9606 }
9607 }
9608 `
9609
9610 testCases := []struct {
9611 testCaseName string
9612 moduleDirectory string
9613 disallowedFlagExpected bool
9614 }{
9615 {
9616 testCaseName: "lintable module defined outside libcore",
9617 moduleDirectory: "",
9618 disallowedFlagExpected: true,
9619 },
9620 {
9621 testCaseName: "lintable module defined in libcore root directory",
9622 moduleDirectory: "libcore/",
9623 disallowedFlagExpected: false,
9624 },
9625 {
9626 testCaseName: "lintable module defined in libcore child directory",
9627 moduleDirectory: "libcore/childdir/",
9628 disallowedFlagExpected: true,
9629 },
9630 }
9631
9632 for _, testCase := range testCases {
9633 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9634 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9635 result := testApex(t, "", lintFileCreator, bpFileCreator)
9636 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9637 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9638 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9639 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9640
9641 if disallowedFlagActual != testCase.disallowedFlagExpected {
9642 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9643 }
9644 }
9645}
9646
9647// checks transtive deps of an apex coming from bootclasspath_fragment
9648func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9649 bp := `
9650 apex {
9651 name: "myapex",
9652 key: "myapex.key",
9653 bootclasspath_fragments: ["mybootclasspathfragment"],
9654 updatable: true,
9655 min_sdk_version: "29",
9656 }
9657 apex_key {
9658 name: "myapex.key",
9659 }
9660 bootclasspath_fragment {
9661 name: "mybootclasspathfragment",
9662 contents: ["myjavalib"],
9663 apex_available: ["myapex"],
9664 hidden_api: {
9665 split_packages: ["*"],
9666 },
9667 }
9668 java_library {
9669 name: "myjavalib",
9670 srcs: ["MyClass.java"],
9671 apex_available: [ "myapex" ],
9672 sdk_version: "current",
9673 min_sdk_version: "29",
9674 compile_dex: true,
9675 lint: {
9676 baseline_filename: "lint-baseline.xml",
9677 }
9678 }
9679 `
9680 fs := android.MockFS{
9681 "lint-baseline.xml": nil,
9682 }
9683
9684 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9685 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9686 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9687 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9688 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9689 }
9690}
Spandan Das66773252022-01-15 00:23:18 +00009691
Jihoon Kang784c0052024-06-25 22:15:39 +00009692func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9693 bp := `
9694 apex {
9695 name: "myapex",
9696 key: "myapex.key",
9697 bootclasspath_fragments: ["mybootclasspathfragment"],
9698 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009699 java_libs: [
9700 "jacocoagent",
9701 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009702 }
9703 apex_key {
9704 name: "myapex.key",
9705 }
9706 bootclasspath_fragment {
9707 name: "mybootclasspathfragment",
9708 contents: ["foo"],
9709 apex_available: ["myapex"],
9710 hidden_api: {
9711 split_packages: ["*"],
9712 },
9713 }
9714 java_sdk_library {
9715 name: "foo",
9716 srcs: ["MyClass.java"],
9717 apex_available: [ "myapex" ],
9718 sdk_version: "current",
9719 min_sdk_version: "29",
9720 compile_dex: true,
9721 }
9722 `
9723 fs := android.MockFS{
9724 "lint-baseline.xml": nil,
9725 }
9726
9727 result := android.GroupFixturePreparers(
9728 prepareForApexTest,
9729 java.PrepareForTestWithJavaSdkLibraryFiles,
9730 java.PrepareForTestWithJacocoInstrumentation,
9731 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009732 android.FixtureMergeMockFs(fs),
9733 ).RunTestWithBp(t, bp)
9734
9735 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9736 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9737 android.AssertStringDoesContain(t,
9738 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9739 lintReportInputs, "foo.impl")
9740}
9741
Spandan Das42e89502022-05-06 22:12:55 +00009742// updatable apexes should propagate updatable=true to its apps
9743func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9744 bp := `
9745 apex {
9746 name: "myapex",
9747 key: "myapex.key",
9748 updatable: %v,
9749 apps: [
9750 "myapp",
9751 ],
9752 min_sdk_version: "30",
9753 }
9754 apex_key {
9755 name: "myapex.key",
9756 }
9757 android_app {
9758 name: "myapp",
9759 updatable: %v,
9760 apex_available: [
9761 "myapex",
9762 ],
9763 sdk_version: "current",
9764 min_sdk_version: "30",
9765 }
9766 `
9767 testCases := []struct {
9768 name string
9769 apex_is_updatable_bp bool
9770 app_is_updatable_bp bool
9771 app_is_updatable_expected bool
9772 }{
9773 {
9774 name: "Non-updatable apex respects updatable property of non-updatable app",
9775 apex_is_updatable_bp: false,
9776 app_is_updatable_bp: false,
9777 app_is_updatable_expected: false,
9778 },
9779 {
9780 name: "Non-updatable apex respects updatable property of updatable app",
9781 apex_is_updatable_bp: false,
9782 app_is_updatable_bp: true,
9783 app_is_updatable_expected: true,
9784 },
9785 {
9786 name: "Updatable apex respects updatable property of updatable app",
9787 apex_is_updatable_bp: true,
9788 app_is_updatable_bp: true,
9789 app_is_updatable_expected: true,
9790 },
9791 {
9792 name: "Updatable apex sets updatable=true on non-updatable app",
9793 apex_is_updatable_bp: true,
9794 app_is_updatable_bp: false,
9795 app_is_updatable_expected: true,
9796 },
9797 }
9798 for _, testCase := range testCases {
9799 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9800 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9801 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9802 }
9803}
9804
Dennis Shend4f5d932023-01-31 20:27:21 +00009805func TestTrimmedApex(t *testing.T) {
9806 bp := `
9807 apex {
9808 name: "myapex",
9809 key: "myapex.key",
9810 native_shared_libs: ["libfoo","libbaz"],
9811 min_sdk_version: "29",
9812 trim_against: "mydcla",
9813 }
9814 apex {
9815 name: "mydcla",
9816 key: "myapex.key",
9817 native_shared_libs: ["libfoo","libbar"],
9818 min_sdk_version: "29",
9819 file_contexts: ":myapex-file_contexts",
9820 dynamic_common_lib_apex: true,
9821 }
9822 apex_key {
9823 name: "myapex.key",
9824 }
9825 cc_library {
9826 name: "libfoo",
9827 shared_libs: ["libc"],
9828 apex_available: ["myapex","mydcla"],
9829 min_sdk_version: "29",
9830 }
9831 cc_library {
9832 name: "libbar",
9833 shared_libs: ["libc"],
9834 apex_available: ["myapex","mydcla"],
9835 min_sdk_version: "29",
9836 }
9837 cc_library {
9838 name: "libbaz",
9839 shared_libs: ["libc"],
9840 apex_available: ["myapex","mydcla"],
9841 min_sdk_version: "29",
9842 }
Dennis Shend4f5d932023-01-31 20:27:21 +00009843 `
9844 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09009845 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +00009846 apexRule := module.MaybeRule("apexRule")
9847 if apexRule.Rule == nil {
9848 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
9849 }
9850
9851 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +09009852 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +00009853 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
9854 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
9855 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
9856 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
9857}
Jingwen Chendea7a642023-03-28 11:30:50 +00009858
9859func TestCannedFsConfig(t *testing.T) {
9860 ctx := testApex(t, `
9861 apex {
9862 name: "myapex",
9863 key: "myapex.key",
9864 updatable: false,
9865 }
9866
9867 apex_key {
9868 name: "myapex.key",
9869 public_key: "testkey.avbpubkey",
9870 private_key: "testkey.pem",
9871 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009872 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009873 generateFsRule := mod.Rule("generateFsConfig")
9874 cmd := generateFsRule.RuleParams.Command
9875
9876 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
9877}
9878
9879func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
9880 ctx := testApex(t, `
9881 apex {
9882 name: "myapex",
9883 key: "myapex.key",
9884 canned_fs_config: "my_config",
9885 updatable: false,
9886 }
9887
9888 apex_key {
9889 name: "myapex.key",
9890 public_key: "testkey.avbpubkey",
9891 private_key: "testkey.pem",
9892 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009893 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009894 generateFsRule := mod.Rule("generateFsConfig")
9895 cmd := generateFsRule.RuleParams.Command
9896
9897 // Ensure that canned_fs_config has "cat my_config" at the end
9898 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
9899}
Spandan Das20fce2d2023-04-12 17:21:39 +00009900
9901func TestStubLibrariesMultipleApexViolation(t *testing.T) {
9902 testCases := []struct {
9903 desc string
9904 hasStubs bool
9905 apexAvailable string
9906 expectedError string
9907 }{
9908 {
9909 desc: "non-stub library can have multiple apex_available",
9910 hasStubs: false,
9911 apexAvailable: `["myapex", "otherapex"]`,
9912 },
9913 {
9914 desc: "stub library should not be available to anyapex",
9915 hasStubs: true,
9916 apexAvailable: `["//apex_available:anyapex"]`,
9917 expectedError: "Stub libraries should have a single apex_available.*anyapex",
9918 },
9919 {
9920 desc: "stub library should not be available to multiple apexes",
9921 hasStubs: true,
9922 apexAvailable: `["myapex", "otherapex"]`,
9923 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
9924 },
9925 {
9926 desc: "stub library can be available to a core apex and a test apex",
9927 hasStubs: true,
9928 apexAvailable: `["myapex", "test_myapex"]`,
9929 },
9930 }
9931 bpTemplate := `
9932 cc_library {
9933 name: "libfoo",
9934 %v
9935 apex_available: %v,
9936 }
9937 apex {
9938 name: "myapex",
9939 key: "apex.key",
9940 updatable: false,
9941 native_shared_libs: ["libfoo"],
9942 }
9943 apex {
9944 name: "otherapex",
9945 key: "apex.key",
9946 updatable: false,
9947 }
9948 apex_test {
9949 name: "test_myapex",
9950 key: "apex.key",
9951 updatable: false,
9952 native_shared_libs: ["libfoo"],
9953 }
9954 apex_key {
9955 name: "apex.key",
9956 }
9957 `
9958 for _, tc := range testCases {
9959 stubs := ""
9960 if tc.hasStubs {
9961 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
9962 }
9963 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
9964 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
9965 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
9966 })
9967 if tc.expectedError == "" {
9968 testApex(t, bp, mockFsFixturePreparer)
9969 } else {
9970 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
9971 }
9972 }
9973}
Colin Crossbd3a16b2023-04-25 11:30:51 -07009974
9975func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
9976 context := android.GroupFixturePreparers(
9977 android.PrepareForIntegrationTestWithAndroid,
9978 cc.PrepareForIntegrationTestWithCc,
9979 PrepareForTestWithApexBuildComponents,
9980 prepareForTestWithMyapex,
9981 filesystem.PrepareForTestWithFilesystemBuildComponents,
9982 )
9983 result := context.RunTestWithBp(t, `
9984 android_system_image {
9985 name: "myfilesystem",
9986 deps: [
9987 "libfoo",
9988 ],
9989 linker_config_src: "linker.config.json",
9990 }
9991
9992 cc_library {
9993 name: "libfoo",
9994 shared_libs: [
9995 "libbar",
9996 ],
9997 stl: "none",
9998 }
9999
10000 cc_library {
10001 name: "libbar",
10002 stl: "none",
10003 apex_available: ["myapex"],
10004 }
10005
10006 apex {
10007 name: "myapex",
10008 native_shared_libs: ["libbar"],
10009 key: "myapex.key",
10010 updatable: false,
10011 }
10012
10013 apex_key {
10014 name: "myapex.key",
10015 public_key: "testkey.avbpubkey",
10016 private_key: "testkey.pem",
10017 }
10018 `)
10019
Cole Faust3b806d32024-03-11 15:15:03 -070010020 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010021 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10022 inputs.Strings(),
10023 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10024}
Yu Liueae7b362023-11-16 17:05:47 -080010025
10026var apex_default_bp = `
10027 apex_key {
10028 name: "myapex.key",
10029 public_key: "testkey.avbpubkey",
10030 private_key: "testkey.pem",
10031 }
10032
10033 filegroup {
10034 name: "myapex.manifest",
10035 srcs: ["apex_manifest.json"],
10036 }
10037
10038 filegroup {
10039 name: "myapex.androidmanifest",
10040 srcs: ["AndroidManifest.xml"],
10041 }
10042`
10043
10044func TestAconfigFilesJavaDeps(t *testing.T) {
10045 ctx := testApex(t, apex_default_bp+`
10046 apex {
10047 name: "myapex",
10048 manifest: ":myapex.manifest",
10049 androidManifest: ":myapex.androidmanifest",
10050 key: "myapex.key",
10051 java_libs: [
10052 "my_java_library_foo",
10053 "my_java_library_bar",
10054 ],
10055 updatable: false,
10056 }
10057
10058 java_library {
10059 name: "my_java_library_foo",
10060 srcs: ["foo/bar/MyClass.java"],
10061 sdk_version: "none",
10062 system_modules: "none",
10063 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010064 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010065 "myapex",
10066 ],
10067 }
10068
10069 java_library {
10070 name: "my_java_library_bar",
10071 srcs: ["foo/bar/MyClass.java"],
10072 sdk_version: "none",
10073 system_modules: "none",
10074 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010075 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010076 "myapex",
10077 ],
10078 }
10079
10080 aconfig_declarations {
10081 name: "my_aconfig_declarations_foo",
10082 package: "com.example.package",
10083 container: "myapex",
10084 srcs: ["foo.aconfig"],
10085 }
10086
10087 java_aconfig_library {
10088 name: "my_java_aconfig_library_foo",
10089 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010090 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010091 "myapex",
10092 ],
10093 }
10094
10095 aconfig_declarations {
10096 name: "my_aconfig_declarations_bar",
10097 package: "com.example.package",
10098 container: "myapex",
10099 srcs: ["bar.aconfig"],
10100 }
10101
10102 java_aconfig_library {
10103 name: "my_java_aconfig_library_bar",
10104 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010105 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010106 "myapex",
10107 ],
10108 }
10109 `)
10110
10111 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10112 s := mod.Rule("apexRule").Args["copy_commands"]
10113 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010114 if len(copyCmds) != 12 {
10115 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010116 }
10117
Jooyung Hana3fddf42024-09-03 13:22:21 +090010118 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10119 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10120 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10121 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010122
Yu Liubba555e2024-02-17 00:36:42 +000010123 inputs := []string{
10124 "my_aconfig_declarations_foo/intermediate.pb",
10125 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010126 }
Yu Liubba555e2024-02-17 00:36:42 +000010127 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10128 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10129 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10130 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010131}
10132
10133func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10134 ctx := testApex(t, apex_default_bp+`
10135 apex {
10136 name: "myapex",
10137 manifest: ":myapex.manifest",
10138 androidManifest: ":myapex.androidmanifest",
10139 key: "myapex.key",
10140 java_libs: [
10141 "my_java_library_foo",
10142 ],
10143 native_shared_libs: [
10144 "my_cc_library_bar",
10145 ],
10146 binaries: [
10147 "my_cc_binary_baz",
10148 ],
10149 updatable: false,
10150 }
10151
10152 java_library {
10153 name: "my_java_library_foo",
10154 srcs: ["foo/bar/MyClass.java"],
10155 sdk_version: "none",
10156 system_modules: "none",
10157 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010158 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010159 "myapex",
10160 ],
10161 }
10162
10163 cc_library {
10164 name: "my_cc_library_bar",
10165 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010166 static_libs: [
10167 "my_cc_aconfig_library_bar",
10168 "my_cc_aconfig_library_baz",
10169 ],
Yu Liueae7b362023-11-16 17:05:47 -080010170 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010171 "myapex",
10172 ],
10173 }
10174
10175 cc_binary {
10176 name: "my_cc_binary_baz",
10177 srcs: ["foo/bar/MyClass.cc"],
10178 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010179 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010180 "myapex",
10181 ],
10182 }
10183
10184 aconfig_declarations {
10185 name: "my_aconfig_declarations_foo",
10186 package: "com.example.package",
10187 container: "myapex",
10188 srcs: ["foo.aconfig"],
10189 }
10190
10191 java_aconfig_library {
10192 name: "my_java_aconfig_library_foo",
10193 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010194 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010195 "myapex",
10196 ],
10197 }
10198
10199 aconfig_declarations {
10200 name: "my_aconfig_declarations_bar",
10201 package: "com.example.package",
10202 container: "myapex",
10203 srcs: ["bar.aconfig"],
10204 }
10205
10206 cc_aconfig_library {
10207 name: "my_cc_aconfig_library_bar",
10208 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010209 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010210 "myapex",
10211 ],
10212 }
10213
10214 aconfig_declarations {
10215 name: "my_aconfig_declarations_baz",
10216 package: "com.example.package",
10217 container: "myapex",
10218 srcs: ["baz.aconfig"],
10219 }
10220
10221 cc_aconfig_library {
10222 name: "my_cc_aconfig_library_baz",
10223 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010224 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010225 "myapex",
10226 ],
10227 }
10228
10229 cc_library {
10230 name: "server_configurable_flags",
10231 srcs: ["server_configurable_flags.cc"],
10232 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010233 cc_library {
10234 name: "libbase",
10235 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010236 apex_available: [
10237 "myapex",
10238 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010239 }
10240 cc_library {
10241 name: "libaconfig_storage_read_api_cc",
10242 srcs: ["libaconfig_storage_read_api_cc.cc"],
10243 }
Yu Liueae7b362023-11-16 17:05:47 -080010244 `)
10245
10246 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10247 s := mod.Rule("apexRule").Args["copy_commands"]
10248 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010249 if len(copyCmds) != 16 {
10250 t.Fatalf("Expected 16 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010251 }
10252
Jooyung Hana3fddf42024-09-03 13:22:21 +090010253 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10254 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10255 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10256 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010257
Yu Liubba555e2024-02-17 00:36:42 +000010258 inputs := []string{
10259 "my_aconfig_declarations_foo/intermediate.pb",
10260 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10261 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010262 }
Yu Liubba555e2024-02-17 00:36:42 +000010263 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10264 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10265 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10266 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010267}
10268
Yu Liucec0e412023-11-30 16:45:50 -080010269func TestAconfigFilesRustDeps(t *testing.T) {
10270 ctx := testApex(t, apex_default_bp+`
10271 apex {
10272 name: "myapex",
10273 manifest: ":myapex.manifest",
10274 androidManifest: ":myapex.androidmanifest",
10275 key: "myapex.key",
10276 native_shared_libs: [
10277 "libmy_rust_library",
10278 ],
10279 binaries: [
10280 "my_rust_binary",
10281 ],
10282 rust_dyn_libs: [
10283 "libmy_rust_dylib",
10284 ],
10285 updatable: false,
10286 }
10287
10288 rust_library {
10289 name: "libflags_rust", // test mock
10290 crate_name: "flags_rust",
10291 srcs: ["lib.rs"],
10292 apex_available: [
10293 "myapex",
10294 ],
10295 }
10296
10297 rust_library {
10298 name: "liblazy_static", // test mock
10299 crate_name: "lazy_static",
10300 srcs: ["src/lib.rs"],
10301 apex_available: [
10302 "myapex",
10303 ],
10304 }
10305
Ted Bauer02d475c2024-03-27 20:56:26 +000010306 rust_library {
10307 name: "libaconfig_storage_read_api", // test mock
10308 crate_name: "aconfig_storage_read_api",
10309 srcs: ["src/lib.rs"],
10310 apex_available: [
10311 "myapex",
10312 ],
10313 }
10314
Ted Bauer6ef40db2024-03-29 14:04:10 +000010315 rust_library {
10316 name: "liblogger", // test mock
10317 crate_name: "logger",
10318 srcs: ["src/lib.rs"],
10319 apex_available: [
10320 "myapex",
10321 ],
10322 }
10323
10324 rust_library {
10325 name: "liblog_rust", // test mock
10326 crate_name: "log_rust",
10327 srcs: ["src/lib.rs"],
10328 apex_available: [
10329 "myapex",
10330 ],
10331 }
10332
Yu Liucec0e412023-11-30 16:45:50 -080010333 rust_ffi_shared {
10334 name: "libmy_rust_library",
10335 srcs: ["src/lib.rs"],
10336 rustlibs: ["libmy_rust_aconfig_library_foo"],
10337 crate_name: "my_rust_library",
10338 apex_available: [
10339 "myapex",
10340 ],
10341 }
10342
10343 rust_library_dylib {
10344 name: "libmy_rust_dylib",
10345 srcs: ["foo/bar/MyClass.rs"],
10346 rustlibs: ["libmy_rust_aconfig_library_bar"],
10347 crate_name: "my_rust_dylib",
10348 apex_available: [
10349 "myapex",
10350 ],
10351 }
10352
10353 rust_binary {
10354 name: "my_rust_binary",
10355 srcs: ["foo/bar/MyClass.rs"],
10356 rustlibs: [
10357 "libmy_rust_aconfig_library_baz",
10358 "libmy_rust_dylib",
10359 ],
10360 apex_available: [
10361 "myapex",
10362 ],
10363 }
10364
10365 aconfig_declarations {
10366 name: "my_aconfig_declarations_foo",
10367 package: "com.example.package",
10368 container: "myapex",
10369 srcs: ["foo.aconfig"],
10370 }
10371
10372 aconfig_declarations {
10373 name: "my_aconfig_declarations_bar",
10374 package: "com.example.package",
10375 container: "myapex",
10376 srcs: ["bar.aconfig"],
10377 }
10378
10379 aconfig_declarations {
10380 name: "my_aconfig_declarations_baz",
10381 package: "com.example.package",
10382 container: "myapex",
10383 srcs: ["baz.aconfig"],
10384 }
10385
10386 rust_aconfig_library {
10387 name: "libmy_rust_aconfig_library_foo",
10388 aconfig_declarations: "my_aconfig_declarations_foo",
10389 crate_name: "my_rust_aconfig_library_foo",
10390 apex_available: [
10391 "myapex",
10392 ],
10393 }
10394
10395 rust_aconfig_library {
10396 name: "libmy_rust_aconfig_library_bar",
10397 aconfig_declarations: "my_aconfig_declarations_bar",
10398 crate_name: "my_rust_aconfig_library_bar",
10399 apex_available: [
10400 "myapex",
10401 ],
10402 }
10403
10404 rust_aconfig_library {
10405 name: "libmy_rust_aconfig_library_baz",
10406 aconfig_declarations: "my_aconfig_declarations_baz",
10407 crate_name: "my_rust_aconfig_library_baz",
10408 apex_available: [
10409 "myapex",
10410 ],
10411 }
10412 `)
10413
10414 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10415 s := mod.Rule("apexRule").Args["copy_commands"]
10416 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010417 if len(copyCmds) != 36 {
10418 t.Fatalf("Expected 36 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010419 }
10420
Jooyung Hana3fddf42024-09-03 13:22:21 +090010421 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10422 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10423 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10424 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liucec0e412023-11-30 16:45:50 -080010425
Yu Liubba555e2024-02-17 00:36:42 +000010426 inputs := []string{
10427 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010428 "my_aconfig_declarations_bar/intermediate.pb",
10429 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010430 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10431 }
10432 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10433 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10434 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10435 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10436}
10437
10438func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10439 aconfigRule := mod.Description(desc)
10440 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010441 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010442 if len(aconfigArgs) != len(inputs) {
10443 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010444 }
Yu Liucec0e412023-11-30 16:45:50 -080010445
Yu Liubba555e2024-02-17 00:36:42 +000010446 ensureEquals(t, container, aconfigRule.Args["container"])
10447 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10448
10449 buildParams := aconfigRule.BuildParams
10450 for _, input := range inputs {
10451 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10452 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010453 }
Yu Liubba555e2024-02-17 00:36:42 +000010454
10455 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010456}
10457
Yu Liueae7b362023-11-16 17:05:47 -080010458func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10459 ctx := testApex(t, apex_default_bp+`
10460 apex {
10461 name: "myapex",
10462 manifest: ":myapex.manifest",
10463 androidManifest: ":myapex.androidmanifest",
10464 key: "myapex.key",
10465 java_libs: [
10466 "my_java_library_foo",
10467 "other_java_library_bar",
10468 ],
10469 updatable: false,
10470 }
10471
10472 java_library {
10473 name: "my_java_library_foo",
10474 srcs: ["foo/bar/MyClass.java"],
10475 sdk_version: "none",
10476 system_modules: "none",
10477 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010478 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010479 "myapex",
10480 ],
10481 }
10482
10483 java_library {
10484 name: "other_java_library_bar",
10485 srcs: ["foo/bar/MyClass.java"],
10486 sdk_version: "none",
10487 system_modules: "none",
10488 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010489 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010490 "myapex",
10491 ],
10492 }
10493
10494 aconfig_declarations {
10495 name: "my_aconfig_declarations_foo",
10496 package: "com.example.package",
10497 container: "myapex",
10498 srcs: ["foo.aconfig"],
10499 }
10500
10501 java_aconfig_library {
10502 name: "my_java_aconfig_library_foo",
10503 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010504 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010505 "myapex",
10506 ],
10507 }
10508
10509 aconfig_declarations {
10510 name: "other_aconfig_declarations_bar",
10511 package: "com.example.package",
10512 container: "otherapex",
10513 srcs: ["bar.aconfig"],
10514 }
10515
10516 java_aconfig_library {
10517 name: "other_java_aconfig_library_bar",
10518 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010519 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010520 "myapex",
10521 ],
10522 }
10523 `)
10524
10525 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10526 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10527 s := " " + combineAconfigRule.Args["cache_files"]
10528 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10529 if len(aconfigArgs) != 1 {
10530 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10531 }
10532 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10533
10534 buildParams := combineAconfigRule.BuildParams
10535 if len(buildParams.Inputs) != 1 {
10536 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10537 }
10538 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10539 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10540}
10541
10542func TestAconfigFilesRemoveDuplicates(t *testing.T) {
10543 ctx := testApex(t, apex_default_bp+`
10544 apex {
10545 name: "myapex",
10546 manifest: ":myapex.manifest",
10547 androidManifest: ":myapex.androidmanifest",
10548 key: "myapex.key",
10549 java_libs: [
10550 "my_java_library_foo",
10551 "my_java_library_bar",
10552 ],
10553 updatable: false,
10554 }
10555
10556 java_library {
10557 name: "my_java_library_foo",
10558 srcs: ["foo/bar/MyClass.java"],
10559 sdk_version: "none",
10560 system_modules: "none",
10561 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010562 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010563 "myapex",
10564 ],
10565 }
10566
10567 java_library {
10568 name: "my_java_library_bar",
10569 srcs: ["foo/bar/MyClass.java"],
10570 sdk_version: "none",
10571 system_modules: "none",
10572 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010573 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010574 "myapex",
10575 ],
10576 }
10577
10578 aconfig_declarations {
10579 name: "my_aconfig_declarations_foo",
10580 package: "com.example.package",
10581 container: "myapex",
10582 srcs: ["foo.aconfig"],
10583 }
10584
10585 java_aconfig_library {
10586 name: "my_java_aconfig_library_foo",
10587 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010588 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010589 "myapex",
10590 ],
10591 }
10592
10593 java_aconfig_library {
10594 name: "my_java_aconfig_library_bar",
10595 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010596 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010597 "myapex",
10598 ],
10599 }
10600 `)
10601
10602 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10603 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10604 s := " " + combineAconfigRule.Args["cache_files"]
10605 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10606 if len(aconfigArgs) != 1 {
10607 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10608 }
10609 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10610
10611 buildParams := combineAconfigRule.BuildParams
10612 if len(buildParams.Inputs) != 1 {
10613 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10614 }
10615 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10616 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10617}
Spandan Das5be63332023-12-13 00:06:32 +000010618
10619// Test that the boot jars come from the _selected_ apex prebuilt
10620// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10621func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10622 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10623 t.Helper()
10624 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10625 foundLibfooJar := false
10626 base := stem + ".jar"
10627 for _, output := range s.AllOutputs() {
10628 if filepath.Base(output) == base {
10629 foundLibfooJar = true
10630 buildRule := s.Output(output)
10631 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10632 }
10633 }
10634 if !foundLibfooJar {
10635 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10636 }
10637 }
10638
Spandan Das64c9e0c2023-12-20 20:13:34 +000010639 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10640 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10641 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10642 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10643 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10644 android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar)
10645 }
10646
10647 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10648 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10649 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10650 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10651 }
10652
Spandan Das5be63332023-12-13 00:06:32 +000010653 bp := `
10654 // Source APEX.
10655
10656 java_library {
10657 name: "framework-foo",
10658 srcs: ["foo.java"],
10659 installable: true,
10660 apex_available: [
10661 "com.android.foo",
10662 ],
10663 }
10664
10665 bootclasspath_fragment {
10666 name: "foo-bootclasspath-fragment",
10667 contents: ["framework-foo"],
10668 apex_available: [
10669 "com.android.foo",
10670 ],
10671 hidden_api: {
10672 split_packages: ["*"],
10673 },
10674 }
10675
10676 apex_key {
10677 name: "com.android.foo.key",
10678 public_key: "com.android.foo.avbpubkey",
10679 private_key: "com.android.foo.pem",
10680 }
10681
10682 apex {
10683 name: "com.android.foo",
10684 key: "com.android.foo.key",
10685 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10686 updatable: false,
10687 }
10688
10689 // Prebuilt APEX.
10690
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010691 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010692 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010693 public: {
10694 jars: ["foo.jar"],
10695 },
Spandan Das5be63332023-12-13 00:06:32 +000010696 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010697 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010698 }
10699
10700 prebuilt_bootclasspath_fragment {
10701 name: "foo-bootclasspath-fragment",
10702 contents: ["framework-foo"],
10703 hidden_api: {
10704 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10705 metadata: "my-bootclasspath-fragment/metadata.csv",
10706 index: "my-bootclasspath-fragment/index.csv",
10707 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10708 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10709 },
10710 apex_available: [
10711 "com.android.foo",
10712 ],
10713 }
10714
10715 prebuilt_apex {
10716 name: "com.android.foo",
10717 apex_name: "com.android.foo",
10718 src: "com.android.foo-arm.apex",
10719 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10720 }
10721
10722 // Another Prebuilt ART APEX
10723 prebuilt_apex {
10724 name: "com.android.foo.v2",
10725 apex_name: "com.android.foo", // Used to determine the API domain
10726 src: "com.android.foo-arm.apex",
10727 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10728 }
10729
10730 // APEX contribution modules
10731
10732 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010733 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010734 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010735 contents: ["com.android.foo"],
10736 }
10737
10738 apex_contributions {
10739 name: "foo.prebuilt.contributions",
10740 api_domain: "com.android.foo",
10741 contents: ["prebuilt_com.android.foo"],
10742 }
10743
10744 apex_contributions {
10745 name: "foo.prebuilt.v2.contributions",
10746 api_domain: "com.android.foo",
10747 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010748 }
10749 `
10750
10751 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010752 desc string
10753 selectedApexContributions string
10754 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010755 }{
10756 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010757 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10758 selectedApexContributions: "foo.source.contributions",
10759 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010760 },
10761 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010762 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10763 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010764 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010765 },
10766 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010767 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10768 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010769 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010770 },
10771 }
10772
10773 fragment := java.ApexVariantReference{
10774 Apex: proptools.StringPtr("com.android.foo"),
10775 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10776 }
10777
10778 for _, tc := range testCases {
10779 preparer := android.GroupFixturePreparers(
10780 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10781 android.FixtureMergeMockFs(map[string][]byte{
10782 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10783 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010784 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10785 // file creation.
10786 java.FixtureConfigureBootJars("platform:foo"),
10787 android.FixtureModifyMockFS(func(fs android.MockFS) {
10788 fs["platform/Android.bp"] = []byte(`
10789 java_library {
10790 name: "foo",
10791 srcs: ["Test.java"],
10792 compile_dex: true,
10793 }
10794 `)
10795 fs["platform/Test.java"] = nil
10796 }),
10797
Colin Crossa66b4632024-08-08 15:50:47 -070010798 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010799 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010800 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010801 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010802 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10803 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010804 }
10805}
Spandan Das3576e762024-01-03 18:57:03 +000010806
10807// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10808// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10809func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000010810 // for a mainline module family, check that only the flagged soong module is visible to make
10811 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
10812 variation := func(moduleName string) string {
10813 ret := "android_common_com.android.foo"
10814 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000010815 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000010816 }
10817 return ret
10818 }
10819
10820 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10821 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10822
10823 for _, hiddenModuleName := range hiddenModuleNames {
10824 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10825 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10826
10827 }
10828 }
10829
10830 bp := `
10831 apex_key {
10832 name: "com.android.foo.key",
10833 public_key: "com.android.foo.avbpubkey",
10834 private_key: "com.android.foo.pem",
10835 }
10836
10837 // AOSP source apex
10838 apex {
10839 name: "com.android.foo",
10840 key: "com.android.foo.key",
10841 updatable: false,
10842 }
10843
10844 // Google source apex
10845 override_apex {
10846 name: "com.google.android.foo",
10847 base: "com.android.foo",
10848 key: "com.android.foo.key",
10849 }
10850
10851 // Prebuilt Google APEX.
10852
10853 prebuilt_apex {
10854 name: "com.google.android.foo",
10855 apex_name: "com.android.foo",
10856 src: "com.android.foo-arm.apex",
10857 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10858 }
10859
10860 // Another Prebuilt Google APEX
10861 prebuilt_apex {
10862 name: "com.google.android.foo.v2",
10863 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000010864 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000010865 src: "com.android.foo-arm.apex",
10866 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10867 }
10868
10869 // APEX contribution modules
10870
10871 apex_contributions {
10872 name: "foo.source.contributions",
10873 api_domain: "com.android.foo",
10874 contents: ["com.google.android.foo"],
10875 }
10876
10877 apex_contributions {
10878 name: "foo.prebuilt.contributions",
10879 api_domain: "com.android.foo",
10880 contents: ["prebuilt_com.google.android.foo"],
10881 }
10882
10883 apex_contributions {
10884 name: "foo.prebuilt.v2.contributions",
10885 api_domain: "com.android.foo",
10886 contents: ["prebuilt_com.google.android.foo.v2"],
10887 }
10888
10889 // This is an incompatible module because it selects multiple versions of the same mainline module
10890 apex_contributions {
10891 name: "foo.prebuilt.duplicate.contributions",
10892 api_domain: "com.android.foo",
10893 contents: [
10894 "prebuilt_com.google.android.foo",
10895 "prebuilt_com.google.android.foo.v2",
10896 ],
10897 }
10898 `
10899
10900 testCases := []struct {
10901 desc string
10902 selectedApexContributions string
10903 expectedVisibleModuleName string
10904 expectedHiddenModuleNames []string
10905 expectedError string
10906 }{
10907 {
10908 desc: "Source apex is selected, prebuilts should be hidden from make",
10909 selectedApexContributions: "foo.source.contributions",
10910 expectedVisibleModuleName: "com.google.android.foo",
10911 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
10912 },
10913 {
10914 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
10915 selectedApexContributions: "foo.prebuilt.contributions",
10916 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
10917 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
10918 },
10919 {
10920 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
10921 selectedApexContributions: "foo.prebuilt.v2.contributions",
10922 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
10923 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
10924 },
10925 {
10926 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
10927 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
10928 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
10929 },
10930 }
10931
10932 for _, tc := range testCases {
10933 preparer := android.GroupFixturePreparers(
10934 android.FixtureMergeMockFs(map[string][]byte{
10935 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10936 }),
Colin Crossa66b4632024-08-08 15:50:47 -070010937 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000010938 )
10939 if tc.expectedError != "" {
10940 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
10941 testApex(t, bp, preparer)
10942 return
10943 }
10944 ctx := testApex(t, bp, preparer)
10945
Spandan Das3576e762024-01-03 18:57:03 +000010946 // Check that
10947 // 1. The contents of the selected apex_contributions are visible to make
10948 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
10949 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
10950 }
10951}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000010952
Spandan Das85bd4622024-08-01 00:51:20 +000010953// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
10954func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
10955 // for a mainline module family, check that only the flagged soong module is visible to make
10956 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
10957 variation := func(moduleName string) string {
10958 ret := "android_common_com.android.adservices"
10959 if moduleName == "com.google.android.foo" {
10960 ret = "android_common_com.google.android.foo_com.google.android.foo"
10961 }
10962 return ret
10963 }
10964
10965 for _, visibleModuleName := range visibleModuleNames {
10966 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10967 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10968 }
10969
10970 for _, hiddenModuleName := range hiddenModuleNames {
10971 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10972 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10973
10974 }
10975 }
10976
10977 bp := `
10978 apex_key {
10979 name: "com.android.adservices.key",
10980 public_key: "com.android.adservices.avbpubkey",
10981 private_key: "com.android.adservices.pem",
10982 }
10983
10984 // AOSP source apex
10985 apex {
10986 name: "com.android.adservices",
10987 key: "com.android.adservices.key",
10988 updatable: false,
10989 }
10990
10991 // Prebuilt Google APEX.
10992
10993 prebuilt_apex {
10994 name: "com.google.android.adservices",
10995 apex_name: "com.android.adservices",
10996 src: "com.android.foo-arm.apex",
10997 }
10998
10999 // Another Prebuilt Google APEX
11000 prebuilt_apex {
11001 name: "com.google.android.adservices.v2",
11002 apex_name: "com.android.adservices",
11003 src: "com.android.foo-arm.apex",
11004 }
11005
11006 // APEX contribution modules
11007
11008
11009 apex_contributions {
11010 name: "adservices.prebuilt.contributions",
11011 api_domain: "com.android.adservices",
11012 contents: ["prebuilt_com.google.android.adservices"],
11013 }
11014
11015 apex_contributions {
11016 name: "adservices.prebuilt.v2.contributions",
11017 api_domain: "com.android.adservices",
11018 contents: ["prebuilt_com.google.android.adservices.v2"],
11019 }
11020 `
11021
11022 testCases := []struct {
11023 desc string
11024 selectedApexContributions string
11025 expectedVisibleModuleNames []string
11026 expectedHiddenModuleNames []string
11027 }{
11028 {
11029 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11030 selectedApexContributions: "",
11031 expectedVisibleModuleNames: []string{"com.android.adservices"},
11032 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11033 },
11034 {
11035 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11036 selectedApexContributions: "adservices.prebuilt.contributions",
11037 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11038 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11039 },
11040 {
11041 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11042 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11043 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11044 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11045 },
11046 }
11047
11048 for _, tc := range testCases {
11049 preparer := android.GroupFixturePreparers(
11050 android.FixtureMergeMockFs(map[string][]byte{
11051 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11052 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011053 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011054 )
11055 ctx := testApex(t, bp, preparer)
11056
11057 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11058 }
11059}
11060
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011061func TestAconfifDeclarationsValidation(t *testing.T) {
11062 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11063 for _, moduleName := range moduleNames {
11064 ret += fmt.Sprintf(`
11065 aconfig_declarations {
11066 name: "%[1]s",
11067 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011068 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011069 srcs: [
11070 "%[1]s.aconfig",
11071 ],
11072 }
11073 java_aconfig_library {
11074 name: "%[1]s-lib",
11075 aconfig_declarations: "%[1]s",
11076 }
11077 `, moduleName)
11078 }
11079 return ret
11080 }
11081
11082 result := android.GroupFixturePreparers(
11083 prepareForApexTest,
11084 java.PrepareForTestWithJavaSdkLibraryFiles,
11085 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011086 ).RunTestWithBp(t, `
11087 java_library {
11088 name: "baz-java-lib",
11089 static_libs: [
11090 "baz-lib",
11091 ],
11092 }
11093 filegroup {
11094 name: "qux-filegroup",
11095 srcs: [
11096 ":qux-lib{.generated_srcjars}",
11097 ],
11098 }
11099 filegroup {
11100 name: "qux-another-filegroup",
11101 srcs: [
11102 ":qux-filegroup",
11103 ],
11104 }
11105 java_library {
11106 name: "quux-java-lib",
11107 srcs: [
11108 "a.java",
11109 ],
11110 libs: [
11111 "quux-lib",
11112 ],
11113 }
11114 java_sdk_library {
11115 name: "foo",
11116 srcs: [
11117 ":qux-another-filegroup",
11118 ],
11119 api_packages: ["foo"],
11120 system: {
11121 enabled: true,
11122 },
11123 module_lib: {
11124 enabled: true,
11125 },
11126 test: {
11127 enabled: true,
11128 },
11129 static_libs: [
11130 "bar-lib",
11131 ],
11132 libs: [
11133 "baz-java-lib",
11134 "quux-java-lib",
11135 ],
11136 aconfig_declarations: [
11137 "bar",
11138 ],
11139 }
11140 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11141
11142 m := result.ModuleForTests("foo.stubs.source", "android_common")
11143 outDir := "out/soong/.intermediates"
11144
11145 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11146 // textproto files
11147 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11148
11149 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11150 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11151 // to aconfig.
11152 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11153 "passed as an input",
11154 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11155
11156 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11157 // to metalava as classpath. Thus the cache file provided by the associated
11158 // aconfig_declarations module "baz" should be passed to aconfig.
11159 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11160 "java_aconfig_library passed as an input",
11161 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11162
11163 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11164 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11165 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11166 "input",
11167 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11168
11169 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11170 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11171 // aconfig_declarations module "quux" should not be passed to aconfig.
11172 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11173 "depend on java_aconfig_library not passed as an input",
11174 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11175}
Cole Faust7c991b42024-05-15 11:17:55 -070011176
11177func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11178 ctx := testApex(t, `
11179 apex {
11180 name: "myapex",
11181 key: "myapex.key",
11182 prebuilts: ["myetc", "myetc2"],
11183 min_sdk_version: "29",
11184 }
11185 apex_key {
11186 name: "myapex.key",
11187 public_key: "testkey.avbpubkey",
11188 private_key: "testkey.pem",
11189 }
11190
11191 prebuilt_etc {
11192 name: "myetc",
11193 src: "myprebuilt",
11194 filename: "myfilename",
11195 }
11196 prebuilt_etc {
11197 name: "myetc2",
11198 sub_dir: "mysubdir",
11199 src: "myprebuilt",
11200 filename: "myfilename",
11201 }
11202 `, withFiles(android.MockFS{
11203 "packages/modules/common/build/allowed_deps.txt": nil,
11204 }))
11205
11206 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11207 data := android.AndroidMkDataForTest(t, ctx, ab)
11208 var builder strings.Builder
11209 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11210 androidMk := builder.String()
11211
11212 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11213 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11214}
Spandan Das50801e22024-05-13 18:29:45 +000011215
11216func TestApexMinSdkVersionOverride(t *testing.T) {
11217 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11218 args := module.Rule("apexRule").Args
11219 optFlags := args["opt_flags"]
11220 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11221 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11222 }
11223 }
11224
11225 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11226 t.Helper()
11227 found := false
11228 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11229 if dep == wantDep {
11230 found = true
11231 }
11232 })
11233 if !found {
11234 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11235 }
11236 }
11237
11238 ctx := testApex(t, `
11239 apex {
11240 name: "com.android.apex30",
11241 min_sdk_version: "30",
11242 key: "apex30.key",
11243 java_libs: ["javalib"],
11244 }
11245
11246 java_library {
11247 name: "javalib",
11248 srcs: ["A.java"],
11249 apex_available: ["com.android.apex30"],
11250 min_sdk_version: "30",
11251 sdk_version: "current",
11252 }
11253
11254 override_apex {
11255 name: "com.mycompany.android.apex30",
11256 base: "com.android.apex30",
11257 }
11258
11259 override_apex {
11260 name: "com.mycompany.android.apex31",
11261 base: "com.android.apex30",
11262 min_sdk_version: "31",
11263 }
11264
11265 apex_key {
11266 name: "apex30.key",
11267 public_key: "testkey.avbpubkey",
11268 private_key: "testkey.pem",
11269 }
11270
11271 `, android.FixtureMergeMockFs(android.MockFS{
11272 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11273 }),
11274 )
11275
11276 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11277 checkMinSdkVersion(t, baseModule, "30")
11278
11279 // Override module, but uses same min_sdk_version
11280 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11281 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11282 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11283 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11284
11285 // Override module, uses different min_sdk_version
11286 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11287 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11288 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11289 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11290}
Spandan Das0b28fa02024-05-28 23:40:17 +000011291
11292func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11293 context := android.GroupFixturePreparers(
11294 android.PrepareForIntegrationTestWithAndroid,
11295 PrepareForTestWithApexBuildComponents,
11296 android.FixtureMergeMockFs(android.MockFS{
11297 "system/sepolicy/apex/foo-file_contexts": nil,
11298 }),
11299 )
11300 res := context.RunTestWithBp(t, `
11301 apex {
11302 name: "foo",
11303 key: "myapex.key",
11304 apex_available_name: "com.android.foo",
11305 variant_version: "0",
11306 updatable: false,
11307 }
11308 apex_key {
11309 name: "myapex.key",
11310 public_key: "testkey.avbpubkey",
11311 private_key: "testkey.pem",
11312 }
11313 prebuilt_apex {
11314 name: "foo",
11315 src: "foo.apex",
11316 prefer: true,
11317 }
11318 override_apex {
11319 name: "myoverrideapex",
11320 base: "foo",
11321 }
11322 `)
11323
11324 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11325}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011326
11327func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11328 testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, `
11329 apex {
11330 name: "myapex",
11331 key: "myapex.key",
11332 updatable: true,
11333 min_sdk_version: "current",
11334 }
11335
11336 apex_key {
11337 name: "myapex.key",
11338 public_key: "testkey.avbpubkey",
11339 private_key: "testkey.pem",
11340 }
11341 `)
11342}
Spandan Das2f68f192024-07-22 19:25:50 +000011343
11344func TestPrebuiltStubNoinstall(t *testing.T) {
11345 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11346 result := android.GroupFixturePreparers(
11347 prepareForApexTest,
11348 android.PrepareForTestWithAndroidMk,
11349 android.PrepareForTestWithMakevars,
11350 android.FixtureMergeMockFs(fs),
11351 ).RunTest(t)
11352
11353 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011354 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011355
11356 installRules := result.InstallMakeRulesForTesting(t)
11357
11358 var installedlibRule *android.InstallMakeRule
11359 for i, rule := range installRules {
11360 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11361 if installedlibRule != nil {
11362 t.Errorf("Duplicate install rules for %s", rule.Target)
11363 }
11364 installedlibRule = &installRules[i]
11365 }
11366 }
11367 if installedlibRule == nil {
11368 t.Errorf("No install rule found for installedlib")
11369 return
11370 }
11371
11372 if expectLibfooOnSystemLib {
11373 android.AssertStringListContains(t,
11374 "installedlib doesn't have install dependency on libfoo impl",
11375 installedlibRule.OrderOnlyDeps,
11376 "out/target/product/test_device/system/lib/libfoo.so")
11377 } else {
11378 android.AssertStringListDoesNotContain(t,
11379 "installedlib has install dependency on libfoo stub",
11380 installedlibRule.Deps,
11381 "out/target/product/test_device/system/lib/libfoo.so")
11382 android.AssertStringListDoesNotContain(t,
11383 "installedlib has order-only install dependency on libfoo stub",
11384 installedlibRule.OrderOnlyDeps,
11385 "out/target/product/test_device/system/lib/libfoo.so")
11386 }
11387 }
11388
11389 prebuiltLibfooBp := []byte(`
11390 cc_prebuilt_library {
11391 name: "libfoo",
11392 prefer: true,
11393 srcs: ["libfoo.so"],
11394 stubs: {
11395 versions: ["1"],
11396 },
11397 apex_available: ["apexfoo"],
11398 }
11399 `)
11400
11401 apexfooBp := []byte(`
11402 apex {
11403 name: "apexfoo",
11404 key: "apexfoo.key",
11405 native_shared_libs: ["libfoo"],
11406 updatable: false,
11407 compile_multilib: "both",
11408 }
11409 apex_key {
11410 name: "apexfoo.key",
11411 public_key: "testkey.avbpubkey",
11412 private_key: "testkey.pem",
11413 }
11414 `)
11415
11416 installedlibBp := []byte(`
11417 cc_library {
11418 name: "installedlib",
11419 shared_libs: ["libfoo"],
11420 }
11421 `)
11422
11423 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11424 testFunc(
11425 t,
11426 /*expectLibfooOnSystemLib=*/ false,
11427 android.MockFS{
11428 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11429 "apexfoo/Android.bp": apexfooBp,
11430 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11431 "Android.bp": installedlibBp,
11432 },
11433 )
11434 })
11435
11436 disabledSourceLibfooBp := []byte(`
11437 cc_library {
11438 name: "libfoo",
11439 enabled: false,
11440 stubs: {
11441 versions: ["1"],
11442 },
11443 apex_available: ["apexfoo"],
11444 }
11445 `)
11446
11447 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11448 testFunc(
11449 t,
11450 /*expectLibfooOnSystemLib=*/ false,
11451 android.MockFS{
11452 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11453 "impl/Android.bp": disabledSourceLibfooBp,
11454 "apexfoo/Android.bp": apexfooBp,
11455 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11456 "Android.bp": installedlibBp,
11457 },
11458 )
11459 })
11460}
Jihoon Kange246bb72024-09-18 22:26:22 +000011461
11462func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11463 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11464 // in libs of android_app and java_library does not lead to class loader context device/host
11465 // path mismatch errors.
11466 android.GroupFixturePreparers(
11467 prepareForApexTest,
11468 android.PrepareForIntegrationTestWithAndroid,
11469 PrepareForTestWithApexBuildComponents,
11470 android.FixtureModifyEnv(func(env map[string]string) {
11471 env["DISABLE_CONTAINER_CHECK"] = "true"
11472 }),
11473 withFiles(filesForSdkLibrary),
11474 android.FixtureMergeMockFs(android.MockFS{
11475 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11476 }),
11477 ).RunTestWithBp(t, `
11478 apex {
11479 name: "com.android.foo30",
11480 key: "myapex.key",
11481 updatable: true,
11482 bootclasspath_fragments: [
11483 "foo-bootclasspath-fragment",
11484 ],
11485 java_libs: [
11486 "bar",
11487 ],
11488 apps: [
11489 "bar-app",
11490 ],
11491 min_sdk_version: "30",
11492 }
11493 apex_key {
11494 name: "myapex.key",
11495 public_key: "testkey.avbpubkey",
11496 private_key: "testkey.pem",
11497 }
11498 bootclasspath_fragment {
11499 name: "foo-bootclasspath-fragment",
11500 contents: [
11501 "framework-foo",
11502 ],
11503 apex_available: [
11504 "com.android.foo30",
11505 ],
11506 hidden_api: {
11507 split_packages: ["*"]
11508 },
11509 }
11510
11511 java_sdk_library {
11512 name: "framework-foo",
11513 srcs: [
11514 "A.java"
11515 ],
11516 unsafe_ignore_missing_latest_api: true,
11517 apex_available: [
11518 "com.android.foo30",
11519 ],
11520 compile_dex: true,
11521 sdk_version: "core_current",
11522 shared_library: false,
11523 }
11524
11525 java_library {
11526 name: "bar",
11527 srcs: [
11528 "A.java"
11529 ],
11530 libs: [
11531 "framework-foo.impl",
11532 ],
11533 apex_available: [
11534 "com.android.foo30",
11535 ],
11536 sdk_version: "core_current",
11537 }
11538
11539 java_library {
11540 name: "baz",
11541 srcs: [
11542 "A.java"
11543 ],
11544 libs: [
11545 "bar",
11546 ],
11547 sdk_version: "core_current",
11548 }
11549
11550 android_app {
11551 name: "bar-app",
11552 srcs: [
11553 "A.java"
11554 ],
11555 libs: [
11556 "baz",
11557 "framework-foo.impl",
11558 ],
11559 apex_available: [
11560 "com.android.foo30",
11561 ],
11562 sdk_version: "core_current",
11563 min_sdk_version: "30",
11564 manifest: "AndroidManifest.xml",
11565 }
11566 `)
11567}