blob: 394f4ae23ac2fa912e24394d9086982bb5b9631d [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 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006016
6017 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6018 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6019 testApex(t, `
6020 apex {
6021 name: "com.sdv.myapex",
6022 key: "myapex.key",
6023 native_shared_libs: ["libfoo"],
6024 updatable: false,
6025 product_specific: true,
6026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
6034 apex {
6035 name: "com.any.otherapex",
6036 key: "otherapex.key",
6037 native_shared_libs: ["libfoo"],
6038 updatable: false,
6039 }
6040
6041 apex_key {
6042 name: "otherapex.key",
6043 public_key: "testkey.avbpubkey",
6044 private_key: "testkey.pem",
6045 }
6046
6047 cc_library {
6048 name: "libfoo",
6049 stl: "none",
6050 system_shared_libs: [],
6051 apex_available: ["com.any.otherapex"],
6052 product_specific: true,
6053 }`,
6054 android.FixtureMergeMockFs(android.MockFS{
6055 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6056 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6057 }))
6058
6059 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6060 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6061 apex {
6062 name: "com.sdv.myapex",
6063 key: "myapex.key",
6064 native_shared_libs: ["libfoo"],
6065 updatable: false,
6066 }
6067
6068 apex_key {
6069 name: "myapex.key",
6070 public_key: "testkey.avbpubkey",
6071 private_key: "testkey.pem",
6072 }
6073
6074 apex {
6075 name: "com.any.otherapex",
6076 key: "otherapex.key",
6077 native_shared_libs: ["libfoo"],
6078 updatable: false,
6079 }
6080
6081 apex_key {
6082 name: "otherapex.key",
6083 public_key: "testkey.avbpubkey",
6084 private_key: "testkey.pem",
6085 }
6086
6087 cc_library {
6088 name: "libfoo",
6089 stl: "none",
6090 system_shared_libs: [],
6091 apex_available: ["com.any.otherapex"],
6092 }`,
6093 android.FixtureMergeMockFs(android.MockFS{
6094 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6095 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6096 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006097}
Jiyong Park127b40b2019-09-30 16:04:35 +09006098
Paul Duffine52e66f2020-03-30 17:54:29 +01006099func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006100 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006101 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006102.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006103.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006104.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006105.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006106.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006107.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006108 apex {
6109 name: "myapex",
6110 key: "myapex.key",
6111 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006112 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006113 }
6114
6115 apex_key {
6116 name: "myapex.key",
6117 public_key: "testkey.avbpubkey",
6118 private_key: "testkey.pem",
6119 }
6120
Jiyong Park127b40b2019-09-30 16:04:35 +09006121 cc_library {
6122 name: "libfoo",
6123 stl: "none",
6124 shared_libs: ["libbar"],
6125 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006126 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006127 }
6128
6129 cc_library {
6130 name: "libbar",
6131 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006132 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006133 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006134 apex_available: ["myapex"],
6135 }
6136
6137 cc_library {
6138 name: "libbaz",
6139 stl: "none",
6140 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006141 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006142
6143 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6144 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6145 testApex(t, `
6146 apex {
6147 name: "com.sdv.myapex",
6148 key: "myapex.key",
6149 native_shared_libs: ["libfoo"],
6150 updatable: false,
6151 product_specific: true,
6152 }
6153
6154 apex_key {
6155 name: "myapex.key",
6156 public_key: "testkey.avbpubkey",
6157 private_key: "testkey.pem",
6158 }
6159
6160 cc_library {
6161 name: "libfoo",
6162 stl: "none",
6163 shared_libs: ["libbar"],
6164 system_shared_libs: [],
6165 apex_available: ["com.sdv.myapex"],
6166 product_specific: true,
6167 }
6168
6169 cc_library {
6170 name: "libbar",
6171 stl: "none",
6172 shared_libs: ["libbaz"],
6173 system_shared_libs: [],
6174 apex_available: ["com.sdv.myapex"],
6175 product_specific: true,
6176 }
6177
6178 cc_library {
6179 name: "libbaz",
6180 stl: "none",
6181 system_shared_libs: [],
6182 product_specific: true,
6183 }`,
6184 android.FixtureMergeMockFs(android.MockFS{
6185 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6186 }))
6187
6188 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6189 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6190 apex {
6191 name: "com.sdv.myapex",
6192 key: "myapex.key",
6193 native_shared_libs: ["libfoo"],
6194 updatable: false,
6195 }
6196
6197 apex_key {
6198 name: "myapex.key",
6199 public_key: "testkey.avbpubkey",
6200 private_key: "testkey.pem",
6201 }
6202
6203 cc_library {
6204 name: "libfoo",
6205 stl: "none",
6206 shared_libs: ["libbar"],
6207 system_shared_libs: [],
6208 apex_available: ["com.sdv.myapex"],
6209 }
6210
6211 cc_library {
6212 name: "libbar",
6213 stl: "none",
6214 shared_libs: ["libbaz"],
6215 system_shared_libs: [],
6216 apex_available: ["com.sdv.myapex"],
6217 }
6218
6219 cc_library {
6220 name: "libbaz",
6221 stl: "none",
6222 system_shared_libs: [],
6223 }`,
6224 android.FixtureMergeMockFs(android.MockFS{
6225 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6226 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006227}
Jiyong Park127b40b2019-09-30 16:04:35 +09006228
Liz Kammer5f108fa2023-05-11 14:33:17 -04006229func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6230 testApex(t, `
6231 apex {
6232 name: "myapex",
6233 key: "myapex.key",
6234 native_shared_libs: ["libfoo"],
6235 updatable: false,
6236 }
6237
6238 apex_key {
6239 name: "myapex.key",
6240 public_key: "testkey.avbpubkey",
6241 private_key: "testkey.pem",
6242 }
6243
6244 cc_library {
6245 name: "libfoo",
6246 stl: "none",
6247 static_libs: ["libbar"],
6248 system_shared_libs: [],
6249 apex_available: ["myapex"],
6250 }
6251
6252 cc_library {
6253 name: "libbar",
6254 stl: "none",
6255 shared_libs: ["libbaz"],
6256 system_shared_libs: [],
6257 apex_available: ["myapex"],
6258 }
6259
6260 cc_library {
6261 name: "libbaz",
6262 stl: "none",
6263 system_shared_libs: [],
6264 }`)
6265
6266 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6267 apex {
6268 name: "myapex",
6269 key: "myapex.key",
6270 native_shared_libs: ["libfoo"],
6271 updatable: false,
6272 }
6273
6274 apex_key {
6275 name: "myapex.key",
6276 public_key: "testkey.avbpubkey",
6277 private_key: "testkey.pem",
6278 }
6279
6280 cc_library {
6281 name: "libfoo",
6282 stl: "none",
6283 static_libs: ["libbar"],
6284 system_shared_libs: [],
6285 apex_available: ["myapex"],
6286 }
6287
6288 cc_library {
6289 name: "libbar",
6290 stl: "none",
6291 system_shared_libs: [],
6292 }`)
6293}
6294
Paul Duffine52e66f2020-03-30 17:54:29 +01006295func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006296 testApexError(t, "\"otherapex\" is not a valid module name", `
6297 apex {
6298 name: "myapex",
6299 key: "myapex.key",
6300 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006301 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006302 }
6303
6304 apex_key {
6305 name: "myapex.key",
6306 public_key: "testkey.avbpubkey",
6307 private_key: "testkey.pem",
6308 }
6309
6310 cc_library {
6311 name: "libfoo",
6312 stl: "none",
6313 system_shared_libs: [],
6314 apex_available: ["otherapex"],
6315 }`)
6316
Paul Duffine52e66f2020-03-30 17:54:29 +01006317 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006318 apex {
6319 name: "myapex",
6320 key: "myapex.key",
6321 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006322 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006323 }
6324
6325 apex_key {
6326 name: "myapex.key",
6327 public_key: "testkey.avbpubkey",
6328 private_key: "testkey.pem",
6329 }
6330
6331 cc_library {
6332 name: "libfoo",
6333 stl: "none",
6334 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006335 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006336 apex_available: ["myapex"],
6337 }
6338
6339 cc_library {
6340 name: "libbar",
6341 stl: "none",
6342 system_shared_libs: [],
6343 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006344 }
6345
6346 cc_library {
6347 name: "libbaz",
6348 stl: "none",
6349 system_shared_libs: [],
6350 stubs: {
6351 versions: ["10", "20", "30"],
6352 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006353 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006354}
Jiyong Park127b40b2019-09-30 16:04:35 +09006355
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006356func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6357 t.Run("negative variant_version produces error", func(t *testing.T) {
6358 testApexError(t, "expected an integer between 0-9; got -1", `
6359 apex {
6360 name: "myapex",
6361 key: "myapex.key",
6362 apex_available_name: "com.android.foo",
6363 variant_version: "-1",
6364 updatable: false,
6365 }
6366 apex_key {
6367 name: "myapex.key",
6368 public_key: "testkey.avbpubkey",
6369 private_key: "testkey.pem",
6370 }
6371 `)
6372 })
6373
6374 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6375 testApexError(t, "expected an integer between 0-9; got 10", `
6376 apex {
6377 name: "myapex",
6378 key: "myapex.key",
6379 apex_available_name: "com.android.foo",
6380 variant_version: "10",
6381 updatable: false,
6382 }
6383 apex_key {
6384 name: "myapex.key",
6385 public_key: "testkey.avbpubkey",
6386 private_key: "testkey.pem",
6387 }
6388 `)
6389 })
6390}
6391
6392func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6393 context := android.GroupFixturePreparers(
6394 android.PrepareForIntegrationTestWithAndroid,
6395 PrepareForTestWithApexBuildComponents,
6396 android.FixtureMergeMockFs(android.MockFS{
6397 "system/sepolicy/apex/foo-file_contexts": nil,
6398 "system/sepolicy/apex/bar-file_contexts": nil,
6399 }),
6400 )
6401 result := context.RunTestWithBp(t, `
6402 apex {
6403 name: "foo",
6404 key: "myapex.key",
6405 apex_available_name: "com.android.foo",
6406 variant_version: "0",
6407 updatable: false,
6408 }
6409 apex {
6410 name: "bar",
6411 key: "myapex.key",
6412 apex_available_name: "com.android.foo",
6413 variant_version: "3",
6414 updatable: false,
6415 }
6416 apex_key {
6417 name: "myapex.key",
6418 public_key: "testkey.avbpubkey",
6419 private_key: "testkey.pem",
6420 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006421 override_apex {
6422 name: "myoverrideapex",
6423 base: "bar",
6424 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006425 `)
6426
Jooyung Hana0503a52023-08-23 13:12:50 +09006427 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006428 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6429 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6430 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6431 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6432 }
6433
Jooyung Hana0503a52023-08-23 13:12:50 +09006434 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006435 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6436 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6437 barActualDefaultVersion := barManifestRule.Args["default_version"]
6438 if barActualDefaultVersion != barExpectedDefaultVersion {
6439 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6440 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006441
Spandan Das50801e22024-05-13 18:29:45 +00006442 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006443 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6444 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6445 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6446 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006447}
6448
Sam Delmericoca816532023-06-02 14:09:50 -04006449func TestApexAvailable_ApexAvailableName(t *testing.T) {
6450 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6451 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6452 apex {
6453 name: "myapex_sminus",
6454 key: "myapex.key",
6455 apps: ["AppFoo"],
6456 apex_available_name: "myapex",
6457 updatable: false,
6458 }
6459 apex {
6460 name: "myapex",
6461 key: "myapex.key",
6462 apps: ["AppFoo"],
6463 updatable: false,
6464 }
6465 apex_key {
6466 name: "myapex.key",
6467 public_key: "testkey.avbpubkey",
6468 private_key: "testkey.pem",
6469 }
6470 android_app {
6471 name: "AppFoo",
6472 srcs: ["foo/bar/MyClass.java"],
6473 sdk_version: "none",
6474 system_modules: "none",
6475 apex_available: [ "myapex_sminus" ],
6476 }`,
6477 android.FixtureMergeMockFs(android.MockFS{
6478 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6479 }),
6480 )
6481 })
6482
6483 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6484 testApex(t, `
6485 apex {
6486 name: "myapex_sminus",
6487 key: "myapex.key",
6488 apps: ["AppFoo"],
6489 apex_available_name: "myapex",
6490 updatable: false,
6491 }
6492 apex {
6493 name: "myapex",
6494 key: "myapex.key",
6495 apps: ["AppFoo"],
6496 updatable: false,
6497 }
6498 apex_key {
6499 name: "myapex.key",
6500 public_key: "testkey.avbpubkey",
6501 private_key: "testkey.pem",
6502 }
6503 android_app {
6504 name: "AppFoo",
6505 srcs: ["foo/bar/MyClass.java"],
6506 sdk_version: "none",
6507 system_modules: "none",
6508 apex_available: [ "myapex" ],
6509 }`,
6510 android.FixtureMergeMockFs(android.MockFS{
6511 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6512 }),
6513 )
6514 })
6515
6516 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6517 testApex(t, `
6518 override_apex {
6519 name: "myoverrideapex_sminus",
6520 base: "myapex_sminus",
6521 key: "myapex.key",
6522 apps: ["AppFooOverride"],
6523 }
6524 override_apex {
6525 name: "myoverrideapex",
6526 base: "myapex",
6527 key: "myapex.key",
6528 apps: ["AppFooOverride"],
6529 }
6530 apex {
6531 name: "myapex_sminus",
6532 key: "myapex.key",
6533 apps: ["AppFoo"],
6534 apex_available_name: "myapex",
6535 updatable: false,
6536 }
6537 apex {
6538 name: "myapex",
6539 key: "myapex.key",
6540 apps: ["AppFoo"],
6541 updatable: false,
6542 }
6543 apex_key {
6544 name: "myapex.key",
6545 public_key: "testkey.avbpubkey",
6546 private_key: "testkey.pem",
6547 }
6548 android_app {
6549 name: "AppFooOverride",
6550 srcs: ["foo/bar/MyClass.java"],
6551 sdk_version: "none",
6552 system_modules: "none",
6553 apex_available: [ "myapex" ],
6554 }
6555 android_app {
6556 name: "AppFoo",
6557 srcs: ["foo/bar/MyClass.java"],
6558 sdk_version: "none",
6559 system_modules: "none",
6560 apex_available: [ "myapex" ],
6561 }`,
6562 android.FixtureMergeMockFs(android.MockFS{
6563 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6564 }),
6565 )
6566 })
6567}
6568
6569func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6570 context := android.GroupFixturePreparers(
6571 android.PrepareForIntegrationTestWithAndroid,
6572 PrepareForTestWithApexBuildComponents,
6573 java.PrepareForTestWithDexpreopt,
6574 android.FixtureMergeMockFs(android.MockFS{
6575 "system/sepolicy/apex/myapex-file_contexts": nil,
6576 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6577 }),
6578 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6579 variables.BuildId = proptools.StringPtr("buildid")
6580 }),
6581 )
6582 context.RunTestWithBp(t, `
6583 override_apex {
6584 name: "myoverrideapex_sminus",
6585 base: "myapex_sminus",
6586 }
6587 override_apex {
6588 name: "myoverrideapex",
6589 base: "myapex",
6590 }
6591 apex {
6592 name: "myapex",
6593 key: "myapex.key",
6594 apps: ["AppFoo"],
6595 updatable: false,
6596 }
6597 apex {
6598 name: "myapex_sminus",
6599 apex_available_name: "myapex",
6600 key: "myapex.key",
6601 apps: ["AppFoo_sminus"],
6602 updatable: false,
6603 }
6604 apex_key {
6605 name: "myapex.key",
6606 public_key: "testkey.avbpubkey",
6607 private_key: "testkey.pem",
6608 }
6609 android_app {
6610 name: "AppFoo",
6611 srcs: ["foo/bar/MyClass.java"],
6612 sdk_version: "none",
6613 system_modules: "none",
6614 apex_available: [ "myapex" ],
6615 }
6616 android_app {
6617 name: "AppFoo_sminus",
6618 srcs: ["foo/bar/MyClass.java"],
6619 sdk_version: "none",
6620 min_sdk_version: "29",
6621 system_modules: "none",
6622 apex_available: [ "myapex" ],
6623 }`)
6624}
6625
Jiyong Park89e850a2020-04-07 16:37:39 +09006626func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006627 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006628 apex {
6629 name: "myapex",
6630 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006631 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006632 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006633 }
6634
6635 apex_key {
6636 name: "myapex.key",
6637 public_key: "testkey.avbpubkey",
6638 private_key: "testkey.pem",
6639 }
6640
6641 cc_library {
6642 name: "libfoo",
6643 stl: "none",
6644 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006645 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006646 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006647 }
6648
6649 cc_library {
6650 name: "libfoo2",
6651 stl: "none",
6652 system_shared_libs: [],
6653 shared_libs: ["libbaz"],
6654 apex_available: ["//apex_available:platform"],
6655 }
6656
6657 cc_library {
6658 name: "libbar",
6659 stl: "none",
6660 system_shared_libs: [],
6661 apex_available: ["myapex"],
6662 }
6663
6664 cc_library {
6665 name: "libbaz",
6666 stl: "none",
6667 system_shared_libs: [],
6668 apex_available: ["myapex"],
6669 stubs: {
6670 versions: ["1"],
6671 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006672 }`)
6673
Jiyong Park89e850a2020-04-07 16:37:39 +09006674 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6675 // because it depends on libbar which isn't available to platform
6676 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6677 if libfoo.NotAvailableForPlatform() != true {
6678 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6679 }
6680
6681 // libfoo2 however can be available to platform because it depends on libbaz which provides
6682 // stubs
6683 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6684 if libfoo2.NotAvailableForPlatform() == true {
6685 t.Errorf("%q should be available to platform", libfoo2.String())
6686 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006687}
Jiyong Parka90ca002019-10-07 15:47:24 +09006688
Paul Duffine52e66f2020-03-30 17:54:29 +01006689func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006690 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006691 apex {
6692 name: "myapex",
6693 key: "myapex.key",
6694 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006695 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006696 }
6697
6698 apex_key {
6699 name: "myapex.key",
6700 public_key: "testkey.avbpubkey",
6701 private_key: "testkey.pem",
6702 }
6703
6704 cc_library {
6705 name: "libfoo",
6706 stl: "none",
6707 system_shared_libs: [],
6708 apex_available: ["myapex"],
6709 static: {
6710 apex_available: ["//apex_available:platform"],
6711 },
6712 }`)
6713
Jiyong Park89e850a2020-04-07 16:37:39 +09006714 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6715 if libfooShared.NotAvailableForPlatform() != true {
6716 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6717 }
6718 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6719 if libfooStatic.NotAvailableForPlatform() != false {
6720 t.Errorf("%q should be available to platform", libfooStatic.String())
6721 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006722}
6723
Jooyung Han9a419e22024-08-16 17:14:21 +09006724func TestApexAvailable_PrefixMatch(t *testing.T) {
6725
6726 for _, tc := range []struct {
6727 name string
6728 apexAvailable string
6729 expectedError string
6730 }{
6731 {
6732 name: "prefix matches correctly",
6733 apexAvailable: "com.foo.*",
6734 },
6735 {
6736 name: "prefix doesn't match",
6737 apexAvailable: "com.bar.*",
6738 expectedError: `Consider .* "com.foo\.\*"`,
6739 },
6740 {
6741 name: "short prefix",
6742 apexAvailable: "com.*",
6743 expectedError: "requires two or more components",
6744 },
6745 {
6746 name: "wildcard not in the end",
6747 apexAvailable: "com.*.foo",
6748 expectedError: "should end with .*",
6749 },
6750 {
6751 name: "wildcard in the middle",
6752 apexAvailable: "com.foo*.*",
6753 expectedError: "not allowed in the middle",
6754 },
6755 {
6756 name: "hint with prefix pattern",
6757 apexAvailable: "//apex_available:platform",
6758 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6759 },
6760 } {
6761 t.Run(tc.name, func(t *testing.T) {
6762 errorHandler := android.FixtureExpectsNoErrors
6763 if tc.expectedError != "" {
6764 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6765 }
6766 context := android.GroupFixturePreparers(
6767 prepareForApexTest,
6768 android.FixtureMergeMockFs(android.MockFS{
6769 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6770 }),
6771 ).ExtendWithErrorHandler(errorHandler)
6772
6773 context.RunTestWithBp(t, `
6774 apex {
6775 name: "com.foo.bar",
6776 key: "myapex.key",
6777 native_shared_libs: ["libfoo"],
6778 updatable: false,
6779 }
6780
6781 apex_key {
6782 name: "myapex.key",
6783 public_key: "testkey.avbpubkey",
6784 private_key: "testkey.pem",
6785 }
6786
6787 cc_library {
6788 name: "libfoo",
6789 stl: "none",
6790 system_shared_libs: [],
6791 apex_available: ["`+tc.apexAvailable+`"],
6792 }`)
6793 })
6794 }
6795 testApexError(t, `Consider adding "com.foo" to`, `
6796 apex {
6797 name: "com.foo", // too short for a partner apex
6798 key: "myapex.key",
6799 native_shared_libs: ["libfoo"],
6800 updatable: false,
6801 }
6802
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808
6809 cc_library {
6810 name: "libfoo",
6811 stl: "none",
6812 system_shared_libs: [],
6813 }
6814 `)
6815}
6816
Jiyong Park5d790c32019-11-15 18:40:32 +09006817func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006818 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
6822 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006823 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006824 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006825 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006826 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006827 }
6828
6829 override_apex {
6830 name: "override_myapex",
6831 base: "myapex",
6832 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006833 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006834 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006835 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006836 compile_multilib: "first",
6837 multilib: {
6838 lib32: {
6839 native_shared_libs: ["mylib32"],
6840 },
6841 lib64: {
6842 native_shared_libs: ["mylib64"],
6843 },
6844 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006845 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006846 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006847 key: "mynewapex.key",
6848 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006849 }
6850
6851 apex_key {
6852 name: "myapex.key",
6853 public_key: "testkey.avbpubkey",
6854 private_key: "testkey.pem",
6855 }
6856
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006857 apex_key {
6858 name: "mynewapex.key",
6859 public_key: "testkey2.avbpubkey",
6860 private_key: "testkey2.pem",
6861 }
6862
6863 android_app_certificate {
6864 name: "myapex.certificate",
6865 certificate: "testkey",
6866 }
6867
Jiyong Park5d790c32019-11-15 18:40:32 +09006868 android_app {
6869 name: "app",
6870 srcs: ["foo/bar/MyClass.java"],
6871 package_name: "foo",
6872 sdk_version: "none",
6873 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006874 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006875 }
6876
6877 override_android_app {
6878 name: "override_app",
6879 base: "app",
6880 package_name: "bar",
6881 }
markchien7c803b82021-08-26 22:10:06 +08006882
6883 bpf {
6884 name: "bpf",
6885 srcs: ["bpf.c"],
6886 }
6887
6888 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006889 name: "overrideBpf",
6890 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006891 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006892
6893 prebuilt_etc {
6894 name: "myetc",
6895 src: "myprebuilt",
6896 }
6897
6898 prebuilt_etc {
6899 name: "override_myetc",
6900 src: "override_myprebuilt",
6901 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006902
6903 cc_library {
6904 name: "mylib32",
6905 apex_available: [ "myapex" ],
6906 }
6907
6908 cc_library {
6909 name: "mylib64",
6910 apex_available: [ "myapex" ],
6911 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006912 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006913
Jooyung Hana0503a52023-08-23 13:12:50 +09006914 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006915 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006916 if originalVariant.GetOverriddenBy() != "" {
6917 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6918 }
6919 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6920 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6921 }
6922
Spandan Das50801e22024-05-13 18:29:45 +00006923 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006924 apexRule := module.Rule("apexRule")
6925 copyCmds := apexRule.Args["copy_commands"]
6926
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006927 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6928 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006929
markchien7c803b82021-08-26 22:10:06 +08006930 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006931 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006932
Daniel Norman5a3ce132021-08-26 15:44:43 -07006933 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6934 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6935
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006936 apexBundle := module.Module().(*apexBundle)
6937 name := apexBundle.Name()
6938 if name != "override_myapex" {
6939 t.Errorf("name should be \"override_myapex\", but was %q", name)
6940 }
6941
Baligh Uddin004d7172020-02-19 21:29:28 -08006942 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6943 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6944 }
6945
Jiyong Park20bacab2020-03-03 11:45:41 +09006946 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006947 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006948 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6949
6950 signApkRule := module.Rule("signapk")
6951 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006952
Colin Crossaa255532020-07-03 13:18:24 -07006953 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006954 var builder strings.Builder
6955 data.Custom(&builder, name, "TARGET_", "", data)
6956 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006957 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6958 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006959 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006960 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006961 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006962 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006963 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006964 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006965}
6966
Albert Martineefabcf2022-03-21 20:11:16 +00006967func TestMinSdkVersionOverride(t *testing.T) {
6968 // Override from 29 to 31
6969 minSdkOverride31 := "31"
6970 ctx := testApex(t, `
6971 apex {
6972 name: "myapex",
6973 key: "myapex.key",
6974 native_shared_libs: ["mylib"],
6975 updatable: true,
6976 min_sdk_version: "29"
6977 }
6978
6979 override_apex {
6980 name: "override_myapex",
6981 base: "myapex",
6982 logging_parent: "com.foo.bar",
6983 package_name: "test.overridden.package"
6984 }
6985
6986 apex_key {
6987 name: "myapex.key",
6988 public_key: "testkey.avbpubkey",
6989 private_key: "testkey.pem",
6990 }
6991
6992 cc_library {
6993 name: "mylib",
6994 srcs: ["mylib.cpp"],
6995 runtime_libs: ["libbar"],
6996 system_shared_libs: [],
6997 stl: "none",
6998 apex_available: [ "myapex" ],
6999 min_sdk_version: "apex_inherit"
7000 }
7001
7002 cc_library {
7003 name: "libbar",
7004 srcs: ["mylib.cpp"],
7005 system_shared_libs: [],
7006 stl: "none",
7007 apex_available: [ "myapex" ],
7008 min_sdk_version: "apex_inherit"
7009 }
7010
7011 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7012
Jooyung Hana0503a52023-08-23 13:12:50 +09007013 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007014 copyCmds := apexRule.Args["copy_commands"]
7015
7016 // Ensure that direct non-stubs dep is always included
7017 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7018
7019 // Ensure that runtime_libs dep in included
7020 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7021
7022 // Ensure libraries target overridden min_sdk_version value
7023 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7024}
7025
7026func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7027 // Attempt to override from 31 to 29, should be a NOOP
7028 minSdkOverride29 := "29"
7029 ctx := testApex(t, `
7030 apex {
7031 name: "myapex",
7032 key: "myapex.key",
7033 native_shared_libs: ["mylib"],
7034 updatable: true,
7035 min_sdk_version: "31"
7036 }
7037
7038 override_apex {
7039 name: "override_myapex",
7040 base: "myapex",
7041 logging_parent: "com.foo.bar",
7042 package_name: "test.overridden.package"
7043 }
7044
7045 apex_key {
7046 name: "myapex.key",
7047 public_key: "testkey.avbpubkey",
7048 private_key: "testkey.pem",
7049 }
7050
7051 cc_library {
7052 name: "mylib",
7053 srcs: ["mylib.cpp"],
7054 runtime_libs: ["libbar"],
7055 system_shared_libs: [],
7056 stl: "none",
7057 apex_available: [ "myapex" ],
7058 min_sdk_version: "apex_inherit"
7059 }
7060
7061 cc_library {
7062 name: "libbar",
7063 srcs: ["mylib.cpp"],
7064 system_shared_libs: [],
7065 stl: "none",
7066 apex_available: [ "myapex" ],
7067 min_sdk_version: "apex_inherit"
7068 }
7069
7070 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7071
Jooyung Hana0503a52023-08-23 13:12:50 +09007072 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007073 copyCmds := apexRule.Args["copy_commands"]
7074
7075 // Ensure that direct non-stubs dep is always included
7076 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7077
7078 // Ensure that runtime_libs dep in included
7079 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7080
7081 // Ensure libraries target the original min_sdk_version value rather than the overridden
7082 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7083}
7084
Jooyung Han214bf372019-11-12 13:03:50 +09007085func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007086 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007087 apex {
7088 name: "myapex",
7089 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007090 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007091 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007092 }
7093
7094 apex_key {
7095 name: "myapex.key",
7096 public_key: "testkey.avbpubkey",
7097 private_key: "testkey.pem",
7098 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007099
7100 cc_library {
7101 name: "mylib",
7102 srcs: ["mylib.cpp"],
7103 stl: "libc++",
7104 system_shared_libs: [],
7105 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007106 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007107 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007108 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007109
Jooyung Hana0503a52023-08-23 13:12:50 +09007110 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007111 args := module.Rule("apexRule").Args
7112 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007113
7114 // The copies of the libraries in the apex should have one more dependency than
7115 // the ones outside the apex, namely the unwinder. Ideally we should check
7116 // the dependency names directly here but for some reason the names are blank in
7117 // this test.
7118 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007119 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007120 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7121 if len(apexImplicits) != len(nonApexImplicits)+1 {
7122 t.Errorf("%q missing unwinder dep", lib)
7123 }
7124 }
Jooyung Han214bf372019-11-12 13:03:50 +09007125}
7126
Paul Duffine05480a2021-03-08 15:07:14 +00007127var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007128 "api/current.txt": nil,
7129 "api/removed.txt": nil,
7130 "api/system-current.txt": nil,
7131 "api/system-removed.txt": nil,
7132 "api/test-current.txt": nil,
7133 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007134
Anton Hanssondff2c782020-12-21 17:10:01 +00007135 "100/public/api/foo.txt": nil,
7136 "100/public/api/foo-removed.txt": nil,
7137 "100/system/api/foo.txt": nil,
7138 "100/system/api/foo-removed.txt": nil,
7139
Paul Duffineedc5d52020-06-12 17:46:39 +01007140 // For java_sdk_library_import
7141 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007142}
7143
Jooyung Han58f26ab2019-12-18 15:34:32 +09007144func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007145 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007146 apex {
7147 name: "myapex",
7148 key: "myapex.key",
7149 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007150 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007151 }
7152
7153 apex_key {
7154 name: "myapex.key",
7155 public_key: "testkey.avbpubkey",
7156 private_key: "testkey.pem",
7157 }
7158
7159 java_sdk_library {
7160 name: "foo",
7161 srcs: ["a.java"],
7162 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007163 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007164 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007165
7166 prebuilt_apis {
7167 name: "sdk",
7168 api_dirs: ["100"],
7169 }
Paul Duffin9b879592020-05-26 13:21:35 +01007170 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007171
7172 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007173 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007174 "javalib/foo.jar",
7175 "etc/permissions/foo.xml",
7176 })
7177 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007178 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7179 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7180 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007181}
7182
Spandan Das3ee19692024-06-19 04:47:40 +00007183func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7184 ctx := testApex(t, `
7185 override_apex {
7186 name: "mycompanyapex",
7187 base: "myapex",
7188 }
7189 apex {
7190 name: "myapex",
7191 key: "myapex.key",
7192 java_libs: ["foo"],
7193 updatable: false,
7194 }
7195
7196 apex_key {
7197 name: "myapex.key",
7198 public_key: "testkey.avbpubkey",
7199 private_key: "testkey.pem",
7200 }
7201
7202 java_sdk_library {
7203 name: "foo",
7204 srcs: ["a.java"],
7205 api_packages: ["foo"],
7206 apex_available: [ "myapex" ],
7207 }
7208
7209 prebuilt_apis {
7210 name: "sdk",
7211 api_dirs: ["100"],
7212 }
7213 `, withFiles(filesForSdkLibrary))
7214
7215 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7216 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7217 // (com.android.foo), the filepath should not contain override apex name.
7218 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7219 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7220 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7221}
7222
Paul Duffin9b879592020-05-26 13:21:35 +01007223func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007224 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007225 apex {
7226 name: "myapex",
7227 key: "myapex.key",
7228 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007229 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007230 }
7231
7232 apex_key {
7233 name: "myapex.key",
7234 public_key: "testkey.avbpubkey",
7235 private_key: "testkey.pem",
7236 }
7237
7238 java_sdk_library {
7239 name: "foo",
7240 srcs: ["a.java"],
7241 api_packages: ["foo"],
7242 apex_available: ["myapex"],
7243 sdk_version: "none",
7244 system_modules: "none",
7245 }
7246
7247 java_library {
7248 name: "bar",
7249 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007250 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007251 apex_available: ["myapex"],
7252 sdk_version: "none",
7253 system_modules: "none",
7254 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007255
7256 prebuilt_apis {
7257 name: "sdk",
7258 api_dirs: ["100"],
7259 }
Paul Duffin9b879592020-05-26 13:21:35 +01007260 `, withFiles(filesForSdkLibrary))
7261
7262 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007263 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007264 "javalib/bar.jar",
7265 "javalib/foo.jar",
7266 "etc/permissions/foo.xml",
7267 })
7268
7269 // The bar library should depend on the implementation jar.
7270 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007271 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007272 t.Errorf("expected %q, found %#q", expected, actual)
7273 }
7274}
7275
7276func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007277 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007278 apex {
7279 name: "myapex",
7280 key: "myapex.key",
7281 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007282 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007283 }
7284
7285 apex_key {
7286 name: "myapex.key",
7287 public_key: "testkey.avbpubkey",
7288 private_key: "testkey.pem",
7289 }
7290
7291 java_sdk_library {
7292 name: "foo",
7293 srcs: ["a.java"],
7294 api_packages: ["foo"],
7295 apex_available: ["myapex"],
7296 sdk_version: "none",
7297 system_modules: "none",
7298 }
7299
7300 java_library {
7301 name: "bar",
7302 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007303 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007304 sdk_version: "none",
7305 system_modules: "none",
7306 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007307
7308 prebuilt_apis {
7309 name: "sdk",
7310 api_dirs: ["100"],
7311 }
Paul Duffin9b879592020-05-26 13:21:35 +01007312 `, withFiles(filesForSdkLibrary))
7313
7314 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007315 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007316 "javalib/foo.jar",
7317 "etc/permissions/foo.xml",
7318 })
7319
7320 // The bar library should depend on the stubs jar.
7321 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007322 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007323 t.Errorf("expected %q, found %#q", expected, actual)
7324 }
7325}
7326
Paul Duffineedc5d52020-06-12 17:46:39 +01007327func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007328 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007329 prebuilt_apis {
7330 name: "sdk",
7331 api_dirs: ["100"],
7332 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007333 withFiles(map[string][]byte{
7334 "apex/a.java": nil,
7335 "apex/apex_manifest.json": nil,
7336 "apex/Android.bp": []byte(`
7337 package {
7338 default_visibility: ["//visibility:private"],
7339 }
7340
7341 apex {
7342 name: "myapex",
7343 key: "myapex.key",
7344 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007345 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007346 }
7347
7348 apex_key {
7349 name: "myapex.key",
7350 public_key: "testkey.avbpubkey",
7351 private_key: "testkey.pem",
7352 }
7353
7354 java_library {
7355 name: "bar",
7356 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007357 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007358 apex_available: ["myapex"],
7359 sdk_version: "none",
7360 system_modules: "none",
7361 }
7362`),
7363 "source/a.java": nil,
7364 "source/api/current.txt": nil,
7365 "source/api/removed.txt": nil,
7366 "source/Android.bp": []byte(`
7367 package {
7368 default_visibility: ["//visibility:private"],
7369 }
7370
7371 java_sdk_library {
7372 name: "foo",
7373 visibility: ["//apex"],
7374 srcs: ["a.java"],
7375 api_packages: ["foo"],
7376 apex_available: ["myapex"],
7377 sdk_version: "none",
7378 system_modules: "none",
7379 public: {
7380 enabled: true,
7381 },
7382 }
7383`),
7384 "prebuilt/a.jar": nil,
7385 "prebuilt/Android.bp": []byte(`
7386 package {
7387 default_visibility: ["//visibility:private"],
7388 }
7389
7390 java_sdk_library_import {
7391 name: "foo",
7392 visibility: ["//apex", "//source"],
7393 apex_available: ["myapex"],
7394 prefer: true,
7395 public: {
7396 jars: ["a.jar"],
7397 },
7398 }
7399`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007400 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007401 )
7402
7403 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007404 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007405 "javalib/bar.jar",
7406 "javalib/foo.jar",
7407 "etc/permissions/foo.xml",
7408 })
7409
7410 // The bar library should depend on the implementation jar.
7411 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007412 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007413 t.Errorf("expected %q, found %#q", expected, actual)
7414 }
7415}
7416
7417func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7418 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7419 apex {
7420 name: "myapex",
7421 key: "myapex.key",
7422 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007423 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007424 }
7425
7426 apex_key {
7427 name: "myapex.key",
7428 public_key: "testkey.avbpubkey",
7429 private_key: "testkey.pem",
7430 }
7431
7432 java_sdk_library_import {
7433 name: "foo",
7434 apex_available: ["myapex"],
7435 prefer: true,
7436 public: {
7437 jars: ["a.jar"],
7438 },
7439 }
7440
7441 `, withFiles(filesForSdkLibrary))
7442}
7443
atrost6e126252020-01-27 17:01:16 +00007444func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007445 result := android.GroupFixturePreparers(
7446 prepareForApexTest,
7447 java.PrepareForTestWithPlatformCompatConfig,
7448 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007449 apex {
7450 name: "myapex",
7451 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007452 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007453 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007454 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007455 }
7456
7457 apex_key {
7458 name: "myapex.key",
7459 public_key: "testkey.avbpubkey",
7460 private_key: "testkey.pem",
7461 }
7462
7463 platform_compat_config {
7464 name: "myjar-platform-compat-config",
7465 src: ":myjar",
7466 }
7467
7468 java_library {
7469 name: "myjar",
7470 srcs: ["foo/bar/MyClass.java"],
7471 sdk_version: "none",
7472 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007473 apex_available: [ "myapex" ],
7474 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007475
7476 // Make sure that a preferred prebuilt does not affect the apex contents.
7477 prebuilt_platform_compat_config {
7478 name: "myjar-platform-compat-config",
7479 metadata: "compat-config/metadata.xml",
7480 prefer: true,
7481 }
atrost6e126252020-01-27 17:01:16 +00007482 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007483 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007484 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007485 "etc/compatconfig/myjar-platform-compat-config.xml",
7486 "javalib/myjar.jar",
7487 })
7488}
7489
Jooyung Han862c0d62022-12-21 10:15:37 +09007490func TestNoDupeApexFiles(t *testing.T) {
7491 android.GroupFixturePreparers(
7492 android.PrepareForTestWithAndroidBuildComponents,
7493 PrepareForTestWithApexBuildComponents,
7494 prepareForTestWithMyapex,
7495 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7496 ).
7497 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7498 RunTestWithBp(t, `
7499 apex {
7500 name: "myapex",
7501 key: "myapex.key",
7502 prebuilts: ["foo", "bar"],
7503 updatable: false,
7504 }
7505
7506 apex_key {
7507 name: "myapex.key",
7508 public_key: "testkey.avbpubkey",
7509 private_key: "testkey.pem",
7510 }
7511
7512 prebuilt_etc {
7513 name: "foo",
7514 src: "myprebuilt",
7515 filename_from_src: true,
7516 }
7517
7518 prebuilt_etc {
7519 name: "bar",
7520 src: "myprebuilt",
7521 filename_from_src: true,
7522 }
7523 `)
7524}
7525
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007526func TestApexUnwantedTransitiveDeps(t *testing.T) {
7527 bp := `
7528 apex {
7529 name: "myapex",
7530 key: "myapex.key",
7531 native_shared_libs: ["libfoo"],
7532 updatable: false,
7533 unwanted_transitive_deps: ["libbar"],
7534 }
7535
7536 apex_key {
7537 name: "myapex.key",
7538 public_key: "testkey.avbpubkey",
7539 private_key: "testkey.pem",
7540 }
7541
7542 cc_library {
7543 name: "libfoo",
7544 srcs: ["foo.cpp"],
7545 shared_libs: ["libbar"],
7546 apex_available: ["myapex"],
7547 }
7548
7549 cc_library {
7550 name: "libbar",
7551 srcs: ["bar.cpp"],
7552 apex_available: ["myapex"],
7553 }`
7554 ctx := testApex(t, bp)
7555 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7556 "*/libc++.so",
7557 "*/libfoo.so",
7558 // not libbar.so
7559 })
7560}
7561
Jiyong Park479321d2019-12-16 11:47:12 +09007562func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7563 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7564 apex {
7565 name: "myapex",
7566 key: "myapex.key",
7567 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007568 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007569 }
7570
7571 apex_key {
7572 name: "myapex.key",
7573 public_key: "testkey.avbpubkey",
7574 private_key: "testkey.pem",
7575 }
7576
7577 java_library {
7578 name: "myjar",
7579 srcs: ["foo/bar/MyClass.java"],
7580 sdk_version: "none",
7581 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007582 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007583 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007584 }
7585 `)
7586}
7587
Jiyong Park7afd1072019-12-30 16:56:33 +09007588func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007589 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007590 apex {
7591 name: "myapex",
7592 key: "myapex.key",
7593 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007594 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007595 }
7596
7597 apex_key {
7598 name: "myapex.key",
7599 public_key: "testkey.avbpubkey",
7600 private_key: "testkey.pem",
7601 }
7602
7603 cc_library {
7604 name: "mylib",
7605 srcs: ["mylib.cpp"],
7606 system_shared_libs: [],
7607 stl: "none",
7608 required: ["a", "b"],
7609 host_required: ["c", "d"],
7610 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007611 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007612 }
7613 `)
7614
Jooyung Hana0503a52023-08-23 13:12:50 +09007615 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007616 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007617 name := apexBundle.BaseModuleName()
7618 prefix := "TARGET_"
7619 var builder strings.Builder
7620 data.Custom(&builder, name, prefix, "", data)
7621 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007622 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007623 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7624 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007625}
7626
Jiyong Park7cd10e32020-01-14 09:22:18 +09007627func TestSymlinksFromApexToSystem(t *testing.T) {
7628 bp := `
7629 apex {
7630 name: "myapex",
7631 key: "myapex.key",
7632 native_shared_libs: ["mylib"],
7633 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007634 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007635 }
7636
Jiyong Park9d677202020-02-19 16:29:35 +09007637 apex {
7638 name: "myapex.updatable",
7639 key: "myapex.key",
7640 native_shared_libs: ["mylib"],
7641 java_libs: ["myjar"],
7642 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007643 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007644 }
7645
Jiyong Park7cd10e32020-01-14 09:22:18 +09007646 apex_key {
7647 name: "myapex.key",
7648 public_key: "testkey.avbpubkey",
7649 private_key: "testkey.pem",
7650 }
7651
7652 cc_library {
7653 name: "mylib",
7654 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007655 shared_libs: [
7656 "myotherlib",
7657 "myotherlib_ext",
7658 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007659 system_shared_libs: [],
7660 stl: "none",
7661 apex_available: [
7662 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007663 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007664 "//apex_available:platform",
7665 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007666 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007667 }
7668
7669 cc_library {
7670 name: "myotherlib",
7671 srcs: ["mylib.cpp"],
7672 system_shared_libs: [],
7673 stl: "none",
7674 apex_available: [
7675 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007676 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007677 "//apex_available:platform",
7678 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007679 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007680 }
7681
Jiyong Parkce243632023-02-17 18:22:25 +09007682 cc_library {
7683 name: "myotherlib_ext",
7684 srcs: ["mylib.cpp"],
7685 system_shared_libs: [],
7686 system_ext_specific: true,
7687 stl: "none",
7688 apex_available: [
7689 "myapex",
7690 "myapex.updatable",
7691 "//apex_available:platform",
7692 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007693 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007694 }
7695
Jiyong Park7cd10e32020-01-14 09:22:18 +09007696 java_library {
7697 name: "myjar",
7698 srcs: ["foo/bar/MyClass.java"],
7699 sdk_version: "none",
7700 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007701 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007702 apex_available: [
7703 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007704 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007705 "//apex_available:platform",
7706 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007707 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007708 }
7709
7710 java_library {
7711 name: "myotherjar",
7712 srcs: ["foo/bar/MyClass.java"],
7713 sdk_version: "none",
7714 system_modules: "none",
7715 apex_available: [
7716 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007717 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007718 "//apex_available:platform",
7719 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007720 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007721 }
7722 `
7723
7724 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7725 for _, f := range files {
7726 if f.path == file {
7727 if f.isLink {
7728 t.Errorf("%q is not a real file", file)
7729 }
7730 return
7731 }
7732 }
7733 t.Errorf("%q is not found", file)
7734 }
7735
Jiyong Parkce243632023-02-17 18:22:25 +09007736 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007737 for _, f := range files {
7738 if f.path == file {
7739 if !f.isLink {
7740 t.Errorf("%q is not a symlink", file)
7741 }
Jiyong Parkce243632023-02-17 18:22:25 +09007742 if f.src != target {
7743 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7744 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007745 return
7746 }
7747 }
7748 t.Errorf("%q is not found", file)
7749 }
7750
Jiyong Park9d677202020-02-19 16:29:35 +09007751 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7752 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007753 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007754 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007755 ensureRealfileExists(t, files, "javalib/myjar.jar")
7756 ensureRealfileExists(t, files, "lib64/mylib.so")
7757 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007758 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007759
Jooyung Hana0503a52023-08-23 13:12:50 +09007760 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007761 ensureRealfileExists(t, files, "javalib/myjar.jar")
7762 ensureRealfileExists(t, files, "lib64/mylib.so")
7763 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007764 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007765
7766 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007767 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007768 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007769 ensureRealfileExists(t, files, "javalib/myjar.jar")
7770 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007771 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7772 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007773
Jooyung Hana0503a52023-08-23 13:12:50 +09007774 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007775 ensureRealfileExists(t, files, "javalib/myjar.jar")
7776 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007777 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7778 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007779}
7780
Yo Chiange8128052020-07-23 20:09:18 +08007781func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007782 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
7786 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 cc_library_shared {
7797 name: "mylib",
7798 srcs: ["mylib.cpp"],
7799 shared_libs: ["myotherlib"],
7800 system_shared_libs: [],
7801 stl: "none",
7802 apex_available: [
7803 "myapex",
7804 "//apex_available:platform",
7805 ],
7806 }
7807
7808 cc_prebuilt_library_shared {
7809 name: "myotherlib",
7810 srcs: ["prebuilt.so"],
7811 system_shared_libs: [],
7812 stl: "none",
7813 apex_available: [
7814 "myapex",
7815 "//apex_available:platform",
7816 ],
7817 }
7818 `)
7819
Jooyung Hana0503a52023-08-23 13:12:50 +09007820 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007821 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007822 var builder strings.Builder
7823 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7824 androidMk := builder.String()
7825 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007826 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007827 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7828 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7829 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007830 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007831}
7832
Jooyung Han643adc42020-02-27 13:50:06 +09007833func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007834 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007835 apex {
7836 name: "myapex",
7837 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007838 binaries: ["mybin"],
7839 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007840 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007841 }
7842
7843 apex_key {
7844 name: "myapex.key",
7845 public_key: "testkey.avbpubkey",
7846 private_key: "testkey.pem",
7847 }
7848
7849 cc_library {
7850 name: "mylib",
7851 srcs: ["mylib.cpp"],
7852 shared_libs: ["mylib2"],
7853 system_shared_libs: [],
7854 stl: "none",
7855 apex_available: [ "myapex" ],
7856 }
7857
7858 cc_library {
7859 name: "mylib2",
7860 srcs: ["mylib.cpp"],
7861 system_shared_libs: [],
7862 stl: "none",
7863 apex_available: [ "myapex" ],
7864 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007865
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007866 // Used as both a JNI library and a regular shared library.
7867 cc_library {
7868 name: "mylib3",
7869 srcs: ["mylib.cpp"],
7870 system_shared_libs: [],
7871 stl: "none",
7872 apex_available: [ "myapex" ],
7873 }
7874
7875 cc_binary {
7876 name: "mybin",
7877 srcs: ["mybin.cpp"],
7878 shared_libs: ["mylib3"],
7879 system_shared_libs: [],
7880 stl: "none",
7881 apex_available: [ "myapex" ],
7882 }
7883
Jiyong Park34d5c332022-02-24 18:02:44 +09007884 rust_ffi_shared {
7885 name: "libfoo.rust",
7886 crate_name: "foo",
7887 srcs: ["foo.rs"],
7888 shared_libs: ["libfoo.shared_from_rust"],
7889 prefer_rlib: true,
7890 apex_available: ["myapex"],
7891 }
7892
7893 cc_library_shared {
7894 name: "libfoo.shared_from_rust",
7895 srcs: ["mylib.cpp"],
7896 system_shared_libs: [],
7897 stl: "none",
7898 stubs: {
7899 versions: ["10", "11", "12"],
7900 },
7901 }
7902
Jooyung Han643adc42020-02-27 13:50:06 +09007903 `)
7904
Jooyung Hana0503a52023-08-23 13:12:50 +09007905 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007906 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007907 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007908 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007909 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007910 "lib64/mylib.so",
7911 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007912 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007913 "lib64/libfoo.rust.so",
7914 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7915 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007916 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007917
7918 // b/220397949
7919 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007920}
7921
Jooyung Han49f67012020-04-17 13:43:10 +09007922func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007923 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007924 apex {
7925 name: "myapex",
7926 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007927 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007928 }
7929 apex_key {
7930 name: "myapex.key",
7931 public_key: "testkey.avbpubkey",
7932 private_key: "testkey.pem",
7933 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007934 `,
7935 android.FixtureModifyConfig(func(config android.Config) {
7936 delete(config.Targets, android.Android)
7937 config.AndroidCommonTarget = android.Target{}
7938 }),
7939 )
Jooyung Han49f67012020-04-17 13:43:10 +09007940
7941 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7942 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7943 }
7944}
7945
Jiyong Parkbd159612020-02-28 15:22:21 +09007946func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007947 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007948 apex {
7949 name: "myapex",
7950 key: "myapex.key",
7951 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007952 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007953 }
7954
7955 apex_key {
7956 name: "myapex.key",
7957 public_key: "testkey.avbpubkey",
7958 private_key: "testkey.pem",
7959 }
7960
7961 android_app {
7962 name: "AppFoo",
7963 srcs: ["foo/bar/MyClass.java"],
7964 sdk_version: "none",
7965 system_modules: "none",
7966 apex_available: [ "myapex" ],
7967 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007968 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007969
Jooyung Hana0503a52023-08-23 13:12:50 +09007970 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007971 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007972
7973 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007974 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 +09007975}
7976
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007977func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007978 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007979 apex {
7980 name: "myapex",
7981 key: "myapex.key",
7982 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007983 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007984 }
7985
7986 apex_key {
7987 name: "myapex.key",
7988 public_key: "testkey.avbpubkey",
7989 private_key: "testkey.pem",
7990 }
7991
7992 android_app_set {
7993 name: "AppSet",
7994 set: "AppSet.apks",
7995 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007996 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007997 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007998 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007999 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8000 s := mod.Rule("apexRule").Args["copy_commands"]
8001 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008002 if len(copyCmds) != 4 {
8003 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008004 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008005 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8006 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008007 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8008 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008009
8010 // Ensure that canned_fs_config has an entry for the app set zip file
8011 generateFsRule := mod.Rule("generateFsConfig")
8012 cmd := generateFsRule.RuleParams.Command
8013 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008014}
8015
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008016func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008017 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008018 apex_set {
8019 name: "myapex",
8020 filename: "foo_v2.apex",
8021 sanitized: {
8022 none: { set: "myapex.apks", },
8023 hwaddress: { set: "myapex.hwasan.apks", },
8024 },
Paul Duffin24704672021-04-06 16:09:30 +01008025 }
8026 `
8027 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008028
Paul Duffin24704672021-04-06 16:09:30 +01008029 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008030 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008031
Spandan Das9d6e2092024-09-21 02:50:00 +00008032 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008033 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008034
Paul Duffin24704672021-04-06 16:09:30 +01008035 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8036
8037 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008038 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8039 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008040
8041 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008042}
8043
Pranav Guptaeba03b02022-09-27 00:27:08 +00008044func TestApexSetApksModuleAssignment(t *testing.T) {
8045 ctx := testApex(t, `
8046 apex_set {
8047 name: "myapex",
8048 set: ":myapex_apks_file",
8049 }
8050
8051 filegroup {
8052 name: "myapex_apks_file",
8053 srcs: ["myapex.apks"],
8054 }
8055 `)
8056
Spandan Das9d6e2092024-09-21 02:50:00 +00008057 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008058
8059 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008060 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008061 extractedApex := m.Output(extractorOutput)
8062
8063 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8064}
8065
Paul Duffin89f570a2021-06-16 01:42:33 +01008066func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008067 t.Helper()
8068
Paul Duffin55607122021-03-30 23:32:51 +01008069 fs := android.MockFS{
8070 "a.java": nil,
8071 "a.jar": nil,
8072 "apex_manifest.json": nil,
8073 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008074 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008075 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8076 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8077 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008078 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008079 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008080
Paul Duffin55607122021-03-30 23:32:51 +01008081 errorHandler := android.FixtureExpectsNoErrors
8082 if errmsg != "" {
8083 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008084 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008085
Paul Duffin55607122021-03-30 23:32:51 +01008086 result := android.GroupFixturePreparers(
8087 cc.PrepareForTestWithCcDefaultModules,
8088 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008089 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008090 java.PrepareForTestWithJavaSdkLibraryFiles,
8091 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008092 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008093 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008094 android.FixtureModifyMockFS(func(fs android.MockFS) {
8095 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8096 insert := ""
8097 for _, fragment := range fragments {
8098 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8099 }
8100 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8101 platform_bootclasspath {
8102 name: "platform-bootclasspath",
8103 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008104 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008105 %s
8106 ],
8107 }
8108 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008109 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008110 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008111 // Dexpreopt for boot jars requires the ART boot image profile.
8112 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8113 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008114 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008115 ).
8116 ExtendWithErrorHandler(errorHandler).
8117 RunTestWithBp(t, bp)
8118
8119 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008120}
8121
Jooyung Han548640b2020-04-27 12:10:30 +09008122func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8123 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8124 apex {
8125 name: "myapex",
8126 key: "myapex.key",
8127 updatable: true,
8128 }
8129
8130 apex_key {
8131 name: "myapex.key",
8132 public_key: "testkey.avbpubkey",
8133 private_key: "testkey.pem",
8134 }
8135 `)
8136}
8137
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008138func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8139 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8140 apex {
8141 name: "myapex",
8142 key: "myapex.key",
8143 }
8144
8145 apex_key {
8146 name: "myapex.key",
8147 public_key: "testkey.avbpubkey",
8148 private_key: "testkey.pem",
8149 }
8150 `)
8151}
8152
satayevb98371c2021-06-15 16:49:50 +01008153func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8154 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8155 apex {
8156 name: "myapex",
8157 key: "myapex.key",
8158 systemserverclasspath_fragments: [
8159 "mysystemserverclasspathfragment",
8160 ],
8161 min_sdk_version: "29",
8162 updatable: true,
8163 }
8164
8165 apex_key {
8166 name: "myapex.key",
8167 public_key: "testkey.avbpubkey",
8168 private_key: "testkey.pem",
8169 }
8170
8171 java_library {
8172 name: "foo",
8173 srcs: ["b.java"],
8174 min_sdk_version: "29",
8175 installable: true,
8176 apex_available: [
8177 "myapex",
8178 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008179 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008180 }
8181
8182 systemserverclasspath_fragment {
8183 name: "mysystemserverclasspathfragment",
8184 generate_classpaths_proto: false,
8185 contents: [
8186 "foo",
8187 ],
8188 apex_available: [
8189 "myapex",
8190 ],
8191 }
satayevabcd5972021-08-06 17:49:46 +01008192 `,
8193 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8194 )
satayevb98371c2021-06-15 16:49:50 +01008195}
8196
Paul Duffin064b70c2020-11-02 17:32:38 +00008197func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008198 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008199 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008200 fragment := java.ApexVariantReference{
8201 Apex: proptools.StringPtr("myapex"),
8202 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8203 }
8204
Paul Duffin064b70c2020-11-02 17:32:38 +00008205 testDexpreoptWithApexes(t, `
8206 prebuilt_apex {
8207 name: "myapex" ,
8208 arch: {
8209 arm64: {
8210 src: "myapex-arm64.apex",
8211 },
8212 arm: {
8213 src: "myapex-arm.apex",
8214 },
8215 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008216 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8217 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008218
Paul Duffin89f570a2021-06-16 01:42:33 +01008219 prebuilt_bootclasspath_fragment {
8220 name: "my-bootclasspath-fragment",
8221 contents: ["libfoo"],
8222 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008223 hidden_api: {
8224 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8225 metadata: "my-bootclasspath-fragment/metadata.csv",
8226 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008227 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8228 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8229 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008230 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008231 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008232
Spandan Das52c01a12024-09-20 01:09:48 +00008233 java_sdk_library_import {
8234 name: "libfoo",
8235 prefer: true,
8236 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008237 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008238 },
8239 apex_available: ["myapex"],
8240 shared_library: false,
8241 permitted_packages: ["libfoo"],
8242 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008243 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008244 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008245}
8246
Spandan Dasf14e2542021-11-12 00:01:37 +00008247func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008248 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008249 bp += `
8250 apex_key {
8251 name: "myapex.key",
8252 public_key: "testkey.avbpubkey",
8253 private_key: "testkey.pem",
8254 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008255 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008256 "lib1/src/A.java": nil,
8257 "lib2/src/B.java": nil,
8258 "system/sepolicy/apex/myapex-file_contexts": nil,
8259 }
8260
Paul Duffin45338f02021-03-30 23:07:52 +01008261 errorHandler := android.FixtureExpectsNoErrors
8262 if errmsg != "" {
8263 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008264 }
Colin Crossae8600b2020-10-29 17:09:13 -07008265
Paul Duffin45338f02021-03-30 23:07:52 +01008266 android.GroupFixturePreparers(
8267 android.PrepareForTestWithAndroidBuildComponents,
8268 java.PrepareForTestWithJavaBuildComponents,
8269 PrepareForTestWithApexBuildComponents,
8270 android.PrepareForTestWithNeverallowRules(rules),
8271 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008272 apexBootJars := make([]string, 0, len(bootJars))
8273 for _, apexBootJar := range bootJars {
8274 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008275 }
satayevd604b212021-07-21 14:23:52 +01008276 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008277 }),
8278 fs.AddToFixture(),
8279 ).
8280 ExtendWithErrorHandler(errorHandler).
8281 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008282}
8283
8284func TestApexPermittedPackagesRules(t *testing.T) {
8285 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008286 name string
8287 expectedError string
8288 bp string
8289 bootJars []string
8290 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008291 }{
8292
8293 {
8294 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8295 expectedError: "",
8296 bp: `
8297 java_library {
8298 name: "bcp_lib1",
8299 srcs: ["lib1/src/*.java"],
8300 permitted_packages: ["foo.bar"],
8301 apex_available: ["myapex"],
8302 sdk_version: "none",
8303 system_modules: "none",
8304 }
8305 java_library {
8306 name: "nonbcp_lib2",
8307 srcs: ["lib2/src/*.java"],
8308 apex_available: ["myapex"],
8309 permitted_packages: ["a.b"],
8310 sdk_version: "none",
8311 system_modules: "none",
8312 }
8313 apex {
8314 name: "myapex",
8315 key: "myapex.key",
8316 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008317 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008318 }`,
8319 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008320 bcpPermittedPackages: map[string][]string{
8321 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008322 "foo.bar",
8323 },
8324 },
8325 },
8326 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008327 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008328 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 +01008329 bp: `
8330 java_library {
8331 name: "bcp_lib1",
8332 srcs: ["lib1/src/*.java"],
8333 apex_available: ["myapex"],
8334 permitted_packages: ["foo.bar"],
8335 sdk_version: "none",
8336 system_modules: "none",
8337 }
8338 java_library {
8339 name: "bcp_lib2",
8340 srcs: ["lib2/src/*.java"],
8341 apex_available: ["myapex"],
8342 permitted_packages: ["foo.bar", "bar.baz"],
8343 sdk_version: "none",
8344 system_modules: "none",
8345 }
8346 apex {
8347 name: "myapex",
8348 key: "myapex.key",
8349 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008350 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008351 }
8352 `,
8353 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008354 bcpPermittedPackages: map[string][]string{
8355 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008356 "foo.bar",
8357 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008358 "bcp_lib2": []string{
8359 "foo.bar",
8360 },
8361 },
8362 },
8363 {
8364 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8365 expectedError: "",
8366 bp: `
8367 java_library {
8368 name: "bcp_lib_restricted",
8369 srcs: ["lib1/src/*.java"],
8370 apex_available: ["myapex"],
8371 permitted_packages: ["foo.bar"],
8372 sdk_version: "none",
8373 min_sdk_version: "29",
8374 system_modules: "none",
8375 }
8376 java_library {
8377 name: "bcp_lib_unrestricted",
8378 srcs: ["lib2/src/*.java"],
8379 apex_available: ["myapex"],
8380 permitted_packages: ["foo.bar", "bar.baz"],
8381 sdk_version: "none",
8382 min_sdk_version: "29",
8383 system_modules: "none",
8384 }
8385 apex {
8386 name: "myapex",
8387 key: "myapex.key",
8388 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8389 updatable: true,
8390 min_sdk_version: "29",
8391 }
8392 `,
8393 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8394 bcpPermittedPackages: map[string][]string{
8395 "bcp_lib1_non_updateable": []string{
8396 "foo.bar",
8397 },
8398 // 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 +01008399 },
8400 },
8401 }
8402 for _, tc := range testcases {
8403 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008404 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8405 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008406 })
8407 }
8408}
8409
Jiyong Park62304bb2020-04-13 16:19:48 +09008410func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008411 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008412 apex {
8413 name: "myapex",
8414 key: "myapex.key",
8415 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008416 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008417 }
8418
8419 apex_key {
8420 name: "myapex.key",
8421 public_key: "testkey.avbpubkey",
8422 private_key: "testkey.pem",
8423 }
8424
8425 cc_library {
8426 name: "mylib",
8427 srcs: ["mylib.cpp"],
8428 system_shared_libs: [],
8429 stl: "none",
8430 stubs: {
8431 versions: ["1"],
8432 },
8433 apex_available: ["myapex"],
8434 }
8435
8436 cc_library {
8437 name: "myprivlib",
8438 srcs: ["mylib.cpp"],
8439 system_shared_libs: [],
8440 stl: "none",
8441 apex_available: ["myapex"],
8442 }
8443
8444
8445 cc_test {
8446 name: "mytest",
8447 gtest: false,
8448 srcs: ["mylib.cpp"],
8449 system_shared_libs: [],
8450 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008451 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008452 test_for: ["myapex"]
8453 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008454
8455 cc_library {
8456 name: "mytestlib",
8457 srcs: ["mylib.cpp"],
8458 system_shared_libs: [],
8459 shared_libs: ["mylib", "myprivlib"],
8460 stl: "none",
8461 test_for: ["myapex"],
8462 }
8463
8464 cc_benchmark {
8465 name: "mybench",
8466 srcs: ["mylib.cpp"],
8467 system_shared_libs: [],
8468 shared_libs: ["mylib", "myprivlib"],
8469 stl: "none",
8470 test_for: ["myapex"],
8471 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008472 `)
8473
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008474 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008475 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008476 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8477 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8478 }
8479
8480 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008481 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008482 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8483 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8484 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8485}
Jiyong Park46a512f2020-12-04 18:02:13 +09008486
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008487func TestIndirectTestFor(t *testing.T) {
8488 ctx := testApex(t, `
8489 apex {
8490 name: "myapex",
8491 key: "myapex.key",
8492 native_shared_libs: ["mylib", "myprivlib"],
8493 updatable: false,
8494 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008495
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008496 apex_key {
8497 name: "myapex.key",
8498 public_key: "testkey.avbpubkey",
8499 private_key: "testkey.pem",
8500 }
8501
8502 cc_library {
8503 name: "mylib",
8504 srcs: ["mylib.cpp"],
8505 system_shared_libs: [],
8506 stl: "none",
8507 stubs: {
8508 versions: ["1"],
8509 },
8510 apex_available: ["myapex"],
8511 }
8512
8513 cc_library {
8514 name: "myprivlib",
8515 srcs: ["mylib.cpp"],
8516 system_shared_libs: [],
8517 stl: "none",
8518 shared_libs: ["mylib"],
8519 apex_available: ["myapex"],
8520 }
8521
8522 cc_library {
8523 name: "mytestlib",
8524 srcs: ["mylib.cpp"],
8525 system_shared_libs: [],
8526 shared_libs: ["myprivlib"],
8527 stl: "none",
8528 test_for: ["myapex"],
8529 }
8530 `)
8531
8532 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008533 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008534 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8535 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8536 }
8537
8538 // The platform variant of mytestlib links to the platform variant of the
8539 // internal myprivlib.
8540 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8541
8542 // The platform variant of myprivlib links to the platform variant of mylib
8543 // and bypasses its stubs.
8544 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 +09008545}
8546
Martin Stjernholmec009002021-03-27 15:18:31 +00008547func TestTestForForLibInOtherApex(t *testing.T) {
8548 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8549 _ = testApex(t, `
8550 apex {
8551 name: "com.android.art",
8552 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008553 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008554 updatable: false,
8555 }
8556
8557 apex {
8558 name: "com.android.art.debug",
8559 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008560 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008561 updatable: false,
8562 }
8563
8564 apex_key {
8565 name: "myapex.key",
8566 public_key: "testkey.avbpubkey",
8567 private_key: "testkey.pem",
8568 }
8569
8570 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008571 name: "libnativebridge",
8572 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008573 system_shared_libs: [],
8574 stl: "none",
8575 stubs: {
8576 versions: ["1"],
8577 },
8578 apex_available: ["com.android.art", "com.android.art.debug"],
8579 }
8580
8581 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008582 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008583 srcs: ["mylib.cpp"],
8584 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008585 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008586 stl: "none",
8587 apex_available: ["com.android.art.debug"],
8588 test_for: ["com.android.art"],
8589 }
8590 `,
8591 android.MockFS{
8592 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8593 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8594 }.AddToFixture())
8595}
8596
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008597// TODO(jungjw): Move this to proptools
8598func intPtr(i int) *int {
8599 return &i
8600}
8601
8602func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008603 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008604 apex_set {
8605 name: "myapex",
8606 set: "myapex.apks",
8607 filename: "foo_v2.apex",
8608 overrides: ["foo"],
8609 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008610 `,
8611 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8612 variables.Platform_sdk_version = intPtr(30)
8613 }),
8614 android.FixtureModifyConfig(func(config android.Config) {
8615 config.Targets[android.Android] = []android.Target{
8616 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8617 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8618 }
8619 }),
8620 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008621
Spandan Das9d6e2092024-09-21 02:50:00 +00008622 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008623
8624 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008625 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008626 actual := extractedApex.Args["abis"]
8627 expected := "ARMEABI_V7A,ARM64_V8A"
8628 if actual != expected {
8629 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8630 }
8631 actual = extractedApex.Args["sdk-version"]
8632 expected = "30"
8633 if actual != expected {
8634 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8635 }
8636
Paul Duffin6717d882021-06-15 19:09:41 +01008637 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008638 a := m.Module().(*ApexSet)
8639 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008640 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008641 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8642 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8643 }
8644}
8645
Anton Hansson805e0a52022-11-25 14:06:46 +00008646func TestApexSet_NativeBridge(t *testing.T) {
8647 ctx := testApex(t, `
8648 apex_set {
8649 name: "myapex",
8650 set: "myapex.apks",
8651 filename: "foo_v2.apex",
8652 overrides: ["foo"],
8653 }
8654 `,
8655 android.FixtureModifyConfig(func(config android.Config) {
8656 config.Targets[android.Android] = []android.Target{
8657 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8658 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8659 }
8660 }),
8661 )
8662
Spandan Das9d6e2092024-09-21 02:50:00 +00008663 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008664
8665 // Check extract_apks tool parameters. No native bridge arch expected
8666 extractedApex := m.Output("extracted/myapex.apks")
8667 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8668}
8669
Jiyong Park7d95a512020-05-10 15:16:24 +09008670func TestNoStaticLinkingToStubsLib(t *testing.T) {
8671 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8672 apex {
8673 name: "myapex",
8674 key: "myapex.key",
8675 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008676 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008677 }
8678
8679 apex_key {
8680 name: "myapex.key",
8681 public_key: "testkey.avbpubkey",
8682 private_key: "testkey.pem",
8683 }
8684
8685 cc_library {
8686 name: "mylib",
8687 srcs: ["mylib.cpp"],
8688 static_libs: ["otherlib"],
8689 system_shared_libs: [],
8690 stl: "none",
8691 apex_available: [ "myapex" ],
8692 }
8693
8694 cc_library {
8695 name: "otherlib",
8696 srcs: ["mylib.cpp"],
8697 system_shared_libs: [],
8698 stl: "none",
8699 stubs: {
8700 versions: ["1", "2", "3"],
8701 },
8702 apex_available: [ "myapex" ],
8703 }
8704 `)
8705}
8706
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008707func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008708 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008709 apex {
8710 name: "myapex",
8711 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008712 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008713 custom_sign_tool: "sign_myapex",
8714 }
8715
8716 apex_key {
8717 name: "myapex.key",
8718 public_key: "testkey.avbpubkey",
8719 private_key: "testkey.pem",
8720 }
8721 `)
8722
Jooyung Han286957d2023-10-30 16:17:56 +09008723 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008724 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008725 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 +09008726}
8727
8728func TestApexKeysTxtOverrides(t *testing.T) {
8729 ctx := testApex(t, `
8730 apex {
8731 name: "myapex",
8732 key: "myapex.key",
8733 updatable: false,
8734 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008735 }
8736
8737 apex_key {
8738 name: "myapex.key",
8739 public_key: "testkey.avbpubkey",
8740 private_key: "testkey.pem",
8741 }
8742
8743 prebuilt_apex {
8744 name: "myapex",
8745 prefer: true,
8746 arch: {
8747 arm64: {
8748 src: "myapex-arm64.apex",
8749 },
8750 arm: {
8751 src: "myapex-arm.apex",
8752 },
8753 },
8754 }
8755
8756 apex_set {
8757 name: "myapex_set",
8758 set: "myapex.apks",
8759 filename: "myapex_set.apex",
8760 overrides: ["myapex"],
8761 }
8762 `)
8763
Colin Crossf61d03d2023-11-02 16:56:39 -07008764 content := android.ContentFromFileRuleForTests(t, ctx,
8765 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008766 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 -07008767 content = android.ContentFromFileRuleForTests(t, ctx,
8768 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008769 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 +09008770}
8771
Jooyung Han938b5932020-06-20 12:47:47 +09008772func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008773 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008774 apex {
8775 name: "myapex",
8776 key: "myapex.key",
8777 apps: ["app"],
8778 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008779 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008780 }
8781
8782 apex_key {
8783 name: "myapex.key",
8784 public_key: "testkey.avbpubkey",
8785 private_key: "testkey.pem",
8786 }
8787
8788 android_app {
8789 name: "app",
8790 srcs: ["foo/bar/MyClass.java"],
8791 package_name: "foo",
8792 sdk_version: "none",
8793 system_modules: "none",
8794 apex_available: [ "myapex" ],
8795 }
8796 `, withFiles(map[string][]byte{
8797 "sub/Android.bp": []byte(`
8798 override_apex {
8799 name: "override_myapex",
8800 base: "myapex",
8801 apps: ["override_app"],
8802 allowed_files: ":allowed",
8803 }
8804 // Overridable "path" property should be referenced indirectly
8805 filegroup {
8806 name: "allowed",
8807 srcs: ["allowed.txt"],
8808 }
8809 override_android_app {
8810 name: "override_app",
8811 base: "app",
8812 package_name: "bar",
8813 }
8814 `),
8815 }))
8816
Jooyung Hana0503a52023-08-23 13:12:50 +09008817 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008818 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8819 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8820 }
8821
Spandan Das50801e22024-05-13 18:29:45 +00008822 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008823 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8824 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8825 }
8826}
8827
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008828func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008829 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008830 apex {
8831 name: "myapex",
8832 key: "myapex.key",
8833 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008834 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008835 }
8836
8837 apex_key {
8838 name: "myapex.key",
8839 public_key: "testkey.avbpubkey",
8840 private_key: "testkey.pem",
8841 }
8842
8843 cc_library {
8844 name: "mylib",
8845 srcs: ["mylib.cpp"],
8846 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008847 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008848 },
8849 apex_available: ["myapex"],
8850 }
8851
8852 cc_prebuilt_library_shared {
8853 name: "mylib",
8854 prefer: false,
8855 srcs: ["prebuilt.so"],
8856 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008857 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008858 },
8859 apex_available: ["myapex"],
8860 }
8861 `)
8862}
8863
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008864func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008865 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008866 apex {
8867 name: "myapex",
8868 key: "myapex.key",
8869 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008870 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008871 }
8872 apex_key {
8873 name: "myapex.key",
8874 public_key: "testkey.avbpubkey",
8875 private_key: "testkey.pem",
8876 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008877 `,
8878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8879 variables.CompressedApex = proptools.BoolPtr(true)
8880 }),
8881 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008882
Jooyung Hana0503a52023-08-23 13:12:50 +09008883 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008884 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8885
Jooyung Hana0503a52023-08-23 13:12:50 +09008886 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008887 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8888
8889 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008890 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008891 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8892
8893 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008894 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008895 var builder strings.Builder
8896 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8897 androidMk := builder.String()
8898 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8899}
8900
Jooyung Han26ec8482024-07-31 15:04:05 +09008901func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8902 for _, compressionEnabled := range []bool{true, false} {
8903 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8904 ctx := testApex(t, `
8905 apex_set {
8906 name: "com.company.android.myapex",
8907 apex_name: "com.android.myapex",
8908 set: "company-myapex.apks",
8909 }
8910 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8911 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8912 }),
8913 )
8914
8915 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8916 if compressionEnabled {
8917 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8918 } else {
8919 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8920 }
8921 })
8922 }
8923}
8924
Martin Stjernholm2856c662020-12-02 15:03:42 +00008925func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008926 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008927 apex {
8928 name: "myapex",
8929 key: "myapex.key",
8930 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008931 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008932 }
8933
8934 apex_key {
8935 name: "myapex.key",
8936 public_key: "testkey.avbpubkey",
8937 private_key: "testkey.pem",
8938 }
8939
8940 cc_library {
8941 name: "mylib",
8942 srcs: ["mylib.cpp"],
8943 apex_available: ["myapex"],
8944 shared_libs: ["otherlib"],
8945 system_shared_libs: [],
8946 }
8947
8948 cc_library {
8949 name: "otherlib",
8950 srcs: ["mylib.cpp"],
8951 stubs: {
8952 versions: ["current"],
8953 },
8954 }
8955
8956 cc_prebuilt_library_shared {
8957 name: "otherlib",
8958 prefer: true,
8959 srcs: ["prebuilt.so"],
8960 stubs: {
8961 versions: ["current"],
8962 },
8963 }
8964 `)
8965
Jooyung Hana0503a52023-08-23 13:12:50 +09008966 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008967 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008968 var builder strings.Builder
8969 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8970 androidMk := builder.String()
8971
8972 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8973 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008974 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00008975}
8976
Jiyong Parke3867542020-12-03 17:28:25 +09008977func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008978 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008979 apex {
8980 name: "myapex",
8981 key: "myapex.key",
8982 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008983 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008984 }
8985
8986 apex_key {
8987 name: "myapex.key",
8988 public_key: "testkey.avbpubkey",
8989 private_key: "testkey.pem",
8990 }
8991
8992 cc_library {
8993 name: "mylib",
8994 srcs: ["mylib.cpp"],
8995 system_shared_libs: [],
8996 stl: "none",
8997 apex_available: ["myapex"],
8998 shared_libs: ["mylib2"],
8999 target: {
9000 apex: {
9001 exclude_shared_libs: ["mylib2"],
9002 },
9003 },
9004 }
9005
9006 cc_library {
9007 name: "mylib2",
9008 srcs: ["mylib.cpp"],
9009 system_shared_libs: [],
9010 stl: "none",
9011 }
9012 `)
9013
9014 // Check if mylib is linked to mylib2 for the non-apex target
9015 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9016 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9017
9018 // Make sure that the link doesn't occur for the apex target
9019 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9020 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9021
9022 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009023 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009024 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9025}
9026
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009027func TestPrebuiltStubLibDep(t *testing.T) {
9028 bpBase := `
9029 apex {
9030 name: "myapex",
9031 key: "myapex.key",
9032 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009033 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009034 }
9035 apex_key {
9036 name: "myapex.key",
9037 public_key: "testkey.avbpubkey",
9038 private_key: "testkey.pem",
9039 }
9040 cc_library {
9041 name: "mylib",
9042 srcs: ["mylib.cpp"],
9043 apex_available: ["myapex"],
9044 shared_libs: ["stublib"],
9045 system_shared_libs: [],
9046 }
9047 apex {
9048 name: "otherapex",
9049 enabled: %s,
9050 key: "myapex.key",
9051 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009052 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009053 }
9054 `
9055
9056 stublibSourceBp := `
9057 cc_library {
9058 name: "stublib",
9059 srcs: ["mylib.cpp"],
9060 apex_available: ["otherapex"],
9061 system_shared_libs: [],
9062 stl: "none",
9063 stubs: {
9064 versions: ["1"],
9065 },
9066 }
9067 `
9068
9069 stublibPrebuiltBp := `
9070 cc_prebuilt_library_shared {
9071 name: "stublib",
9072 srcs: ["prebuilt.so"],
9073 apex_available: ["otherapex"],
9074 stubs: {
9075 versions: ["1"],
9076 },
9077 %s
9078 }
9079 `
9080
9081 tests := []struct {
9082 name string
9083 stublibBp string
9084 usePrebuilt bool
9085 modNames []string // Modules to collect AndroidMkEntries for
9086 otherApexEnabled []string
9087 }{
9088 {
9089 name: "only_source",
9090 stublibBp: stublibSourceBp,
9091 usePrebuilt: false,
9092 modNames: []string{"stublib"},
9093 otherApexEnabled: []string{"true", "false"},
9094 },
9095 {
9096 name: "source_preferred",
9097 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9098 usePrebuilt: false,
9099 modNames: []string{"stublib", "prebuilt_stublib"},
9100 otherApexEnabled: []string{"true", "false"},
9101 },
9102 {
9103 name: "prebuilt_preferred",
9104 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9105 usePrebuilt: true,
9106 modNames: []string{"stublib", "prebuilt_stublib"},
9107 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9108 },
9109 {
9110 name: "only_prebuilt",
9111 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9112 usePrebuilt: true,
9113 modNames: []string{"stublib"},
9114 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9115 },
9116 }
9117
9118 for _, test := range tests {
9119 t.Run(test.name, func(t *testing.T) {
9120 for _, otherApexEnabled := range test.otherApexEnabled {
9121 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009122 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009123
9124 type modAndMkEntries struct {
9125 mod *cc.Module
9126 mkEntries android.AndroidMkEntries
9127 }
9128 entries := []*modAndMkEntries{}
9129
9130 // Gather shared lib modules that are installable
9131 for _, modName := range test.modNames {
9132 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9133 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9134 continue
9135 }
9136 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009137 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009138 continue
9139 }
Colin Crossaa255532020-07-03 13:18:24 -07009140 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009141 if ent.Disabled {
9142 continue
9143 }
9144 entries = append(entries, &modAndMkEntries{
9145 mod: mod,
9146 mkEntries: ent,
9147 })
9148 }
9149 }
9150 }
9151
9152 var entry *modAndMkEntries = nil
9153 for _, ent := range entries {
9154 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9155 if entry != nil {
9156 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9157 } else {
9158 entry = ent
9159 }
9160 }
9161 }
9162
9163 if entry == nil {
9164 t.Errorf("AndroidMk entry for \"stublib\" missing")
9165 } else {
9166 isPrebuilt := entry.mod.Prebuilt() != nil
9167 if isPrebuilt != test.usePrebuilt {
9168 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9169 }
9170 if !entry.mod.IsStubs() {
9171 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9172 }
9173 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9174 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9175 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009176 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009177 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009178 if !android.InList(expected, cflags) {
9179 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9180 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009181 }
9182 })
9183 }
9184 })
9185 }
9186}
9187
Colin Crossc33e5212021-05-25 18:16:02 -07009188func TestApexJavaCoverage(t *testing.T) {
9189 bp := `
9190 apex {
9191 name: "myapex",
9192 key: "myapex.key",
9193 java_libs: ["mylib"],
9194 bootclasspath_fragments: ["mybootclasspathfragment"],
9195 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9196 updatable: false,
9197 }
9198
9199 apex_key {
9200 name: "myapex.key",
9201 public_key: "testkey.avbpubkey",
9202 private_key: "testkey.pem",
9203 }
9204
9205 java_library {
9206 name: "mylib",
9207 srcs: ["mylib.java"],
9208 apex_available: ["myapex"],
9209 compile_dex: true,
9210 }
9211
9212 bootclasspath_fragment {
9213 name: "mybootclasspathfragment",
9214 contents: ["mybootclasspathlib"],
9215 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009216 hidden_api: {
9217 split_packages: ["*"],
9218 },
Colin Crossc33e5212021-05-25 18:16:02 -07009219 }
9220
9221 java_library {
9222 name: "mybootclasspathlib",
9223 srcs: ["mybootclasspathlib.java"],
9224 apex_available: ["myapex"],
9225 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009226 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009227 }
9228
9229 systemserverclasspath_fragment {
9230 name: "mysystemserverclasspathfragment",
9231 contents: ["mysystemserverclasspathlib"],
9232 apex_available: ["myapex"],
9233 }
9234
9235 java_library {
9236 name: "mysystemserverclasspathlib",
9237 srcs: ["mysystemserverclasspathlib.java"],
9238 apex_available: ["myapex"],
9239 compile_dex: true,
9240 }
9241 `
9242
9243 result := android.GroupFixturePreparers(
9244 PrepareForTestWithApexBuildComponents,
9245 prepareForTestWithMyapex,
9246 java.PrepareForTestWithJavaDefaultModules,
9247 android.PrepareForTestWithAndroidBuildComponents,
9248 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009249 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9250 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009251 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009252 ).RunTest(t)
9253
9254 // Make sure jacoco ran on both mylib and mybootclasspathlib
9255 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9256 t.Errorf("Failed to find jacoco rule for mylib")
9257 }
9258 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9259 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9260 }
9261 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9262 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9263 }
9264}
9265
Jiyong Park192600a2021-08-03 07:52:17 +00009266func TestProhibitStaticExecutable(t *testing.T) {
9267 testApexError(t, `executable mybin is static`, `
9268 apex {
9269 name: "myapex",
9270 key: "myapex.key",
9271 binaries: ["mybin"],
9272 min_sdk_version: "29",
9273 }
9274
9275 apex_key {
9276 name: "myapex.key",
9277 public_key: "testkey.avbpubkey",
9278 private_key: "testkey.pem",
9279 }
9280
9281 cc_binary {
9282 name: "mybin",
9283 srcs: ["mylib.cpp"],
9284 relative_install_path: "foo/bar",
9285 static_executable: true,
9286 system_shared_libs: [],
9287 stl: "none",
9288 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009289 min_sdk_version: "29",
9290 }
9291 `)
9292
9293 testApexError(t, `executable mybin.rust is static`, `
9294 apex {
9295 name: "myapex",
9296 key: "myapex.key",
9297 binaries: ["mybin.rust"],
9298 min_sdk_version: "29",
9299 }
9300
9301 apex_key {
9302 name: "myapex.key",
9303 public_key: "testkey.avbpubkey",
9304 private_key: "testkey.pem",
9305 }
9306
9307 rust_binary {
9308 name: "mybin.rust",
9309 srcs: ["foo.rs"],
9310 static_executable: true,
9311 apex_available: ["myapex"],
9312 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009313 }
9314 `)
9315}
9316
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009317func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9318 ctx := testApex(t, `
9319 apex {
9320 name: "myapex",
9321 key: "myapex.key",
9322 updatable: false,
9323 java_libs: ["foo"],
9324 }
9325
9326 apex_key {
9327 name: "myapex.key",
9328 public_key: "testkey.avbpubkey",
9329 private_key: "testkey.pem",
9330 }
9331
9332 java_library {
9333 name: "foo",
9334 srcs: ["foo.java"],
9335 apex_available: ["myapex"],
9336 installable: true,
9337 }
9338 `,
9339 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9340 )
9341
Jooyung Hana0503a52023-08-23 13:12:50 +09009342 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009343 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9344 var builder strings.Builder
9345 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9346 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009347 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 +00009348}
9349
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009350func TestAndroidMk_RequiredModules(t *testing.T) {
9351 ctx := testApex(t, `
9352 apex {
9353 name: "myapex",
9354 key: "myapex.key",
9355 updatable: false,
9356 java_libs: ["foo"],
9357 required: ["otherapex"],
9358 }
9359
9360 apex {
9361 name: "otherapex",
9362 key: "myapex.key",
9363 updatable: false,
9364 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009365 }
9366
9367 apex_key {
9368 name: "myapex.key",
9369 public_key: "testkey.avbpubkey",
9370 private_key: "testkey.pem",
9371 }
9372
9373 java_library {
9374 name: "foo",
9375 srcs: ["foo.java"],
9376 apex_available: ["myapex", "otherapex"],
9377 installable: true,
9378 }
9379 `)
9380
Jooyung Hana0503a52023-08-23 13:12:50 +09009381 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009382 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9383 var builder strings.Builder
9384 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9385 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009386 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009387}
9388
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009389func TestAndroidMk_RequiredDeps(t *testing.T) {
9390 ctx := testApex(t, `
9391 apex {
9392 name: "myapex",
9393 key: "myapex.key",
9394 updatable: false,
9395 }
9396
9397 apex_key {
9398 name: "myapex.key",
9399 public_key: "testkey.avbpubkey",
9400 private_key: "testkey.pem",
9401 }
9402 `)
9403
Jooyung Hana0503a52023-08-23 13:12:50 +09009404 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009405 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009406 data := android.AndroidMkDataForTest(t, ctx, bundle)
9407 var builder strings.Builder
9408 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9409 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009410 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009411}
9412
Jooyung Hana6d36672022-02-24 13:58:07 +09009413func TestApexOutputFileProducer(t *testing.T) {
9414 for _, tc := range []struct {
9415 name string
9416 ref string
9417 expected_data []string
9418 }{
9419 {
9420 name: "test_using_output",
9421 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009422 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009423 },
9424 {
9425 name: "test_using_apex",
9426 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009427 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009428 },
9429 } {
9430 t.Run(tc.name, func(t *testing.T) {
9431 ctx := testApex(t, `
9432 apex {
9433 name: "myapex",
9434 key: "myapex.key",
9435 compressible: true,
9436 updatable: false,
9437 }
9438
9439 apex_key {
9440 name: "myapex.key",
9441 public_key: "testkey.avbpubkey",
9442 private_key: "testkey.pem",
9443 }
9444
9445 java_test {
9446 name: "`+tc.name+`",
9447 srcs: ["a.java"],
9448 data: ["`+tc.ref+`"],
9449 }
9450 `,
9451 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9452 variables.CompressedApex = proptools.BoolPtr(true)
9453 }))
9454 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9455 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9456 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9457 })
9458 }
9459}
9460
satayev758968a2021-12-06 11:42:40 +00009461func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9462 preparer := android.GroupFixturePreparers(
9463 PrepareForTestWithApexBuildComponents,
9464 prepareForTestWithMyapex,
9465 java.PrepareForTestWithJavaSdkLibraryFiles,
9466 java.PrepareForTestWithJavaDefaultModules,
9467 android.PrepareForTestWithAndroidBuildComponents,
9468 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9469 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9470 )
9471
9472 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9473 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9474 preparer.RunTestWithBp(t, `
9475 apex {
9476 name: "myapex",
9477 key: "myapex.key",
9478 bootclasspath_fragments: ["mybootclasspathfragment"],
9479 min_sdk_version: "30",
9480 updatable: false,
9481 }
9482
9483 apex_key {
9484 name: "myapex.key",
9485 public_key: "testkey.avbpubkey",
9486 private_key: "testkey.pem",
9487 }
9488
9489 bootclasspath_fragment {
9490 name: "mybootclasspathfragment",
9491 contents: ["mybootclasspathlib"],
9492 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009493 hidden_api: {
9494 split_packages: ["*"],
9495 },
satayev758968a2021-12-06 11:42:40 +00009496 }
9497
9498 java_sdk_library {
9499 name: "mybootclasspathlib",
9500 srcs: ["mybootclasspathlib.java"],
9501 apex_available: ["myapex"],
9502 compile_dex: true,
9503 unsafe_ignore_missing_latest_api: true,
9504 min_sdk_version: "31",
9505 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009506 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009507 }
9508
9509 java_library {
9510 name: "util",
9511 srcs: ["a.java"],
9512 apex_available: ["myapex"],
9513 min_sdk_version: "31",
9514 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009515 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009516 }
9517
9518 java_library {
9519 name: "another_util",
9520 srcs: ["a.java"],
9521 min_sdk_version: "31",
9522 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009523 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009524 }
9525 `)
9526 })
9527
9528 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9529 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9530 preparer.RunTestWithBp(t, `
9531 apex {
9532 name: "myapex",
9533 key: "myapex.key",
9534 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9535 min_sdk_version: "30",
9536 updatable: false,
9537 }
9538
9539 apex_key {
9540 name: "myapex.key",
9541 public_key: "testkey.avbpubkey",
9542 private_key: "testkey.pem",
9543 }
9544
9545 systemserverclasspath_fragment {
9546 name: "mysystemserverclasspathfragment",
9547 contents: ["mysystemserverclasspathlib"],
9548 apex_available: ["myapex"],
9549 }
9550
9551 java_sdk_library {
9552 name: "mysystemserverclasspathlib",
9553 srcs: ["mysystemserverclasspathlib.java"],
9554 apex_available: ["myapex"],
9555 compile_dex: true,
9556 min_sdk_version: "32",
9557 unsafe_ignore_missing_latest_api: true,
9558 static_libs: ["util"],
9559 }
9560
9561 java_library {
9562 name: "util",
9563 srcs: ["a.java"],
9564 apex_available: ["myapex"],
9565 min_sdk_version: "31",
9566 static_libs: ["another_util"],
9567 }
9568
9569 java_library {
9570 name: "another_util",
9571 srcs: ["a.java"],
9572 min_sdk_version: "31",
9573 apex_available: ["myapex"],
9574 }
9575 `)
9576 })
9577
9578 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009579 preparer.
satayev758968a2021-12-06 11:42:40 +00009580 RunTestWithBp(t, `
9581 apex {
9582 name: "myapex",
9583 key: "myapex.key",
9584 bootclasspath_fragments: ["mybootclasspathfragment"],
9585 min_sdk_version: "30",
9586 updatable: false,
9587 }
9588
9589 apex_key {
9590 name: "myapex.key",
9591 public_key: "testkey.avbpubkey",
9592 private_key: "testkey.pem",
9593 }
9594
9595 bootclasspath_fragment {
9596 name: "mybootclasspathfragment",
9597 contents: ["mybootclasspathlib"],
9598 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009599 hidden_api: {
9600 split_packages: ["*"],
9601 },
satayev758968a2021-12-06 11:42:40 +00009602 }
9603
9604 java_sdk_library {
9605 name: "mybootclasspathlib",
9606 srcs: ["mybootclasspathlib.java"],
9607 apex_available: ["myapex"],
9608 compile_dex: true,
9609 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009610 sdk_version: "current",
9611 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009612 }
9613 `)
9614 })
9615
9616 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9617 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9618 RunTestWithBp(t, `
9619 apex {
9620 name: "myapex",
9621 key: "myapex.key",
9622 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9623 min_sdk_version: "30",
9624 updatable: false,
9625 }
9626
9627 apex_key {
9628 name: "myapex.key",
9629 public_key: "testkey.avbpubkey",
9630 private_key: "testkey.pem",
9631 }
9632
9633 systemserverclasspath_fragment {
9634 name: "mysystemserverclasspathfragment",
9635 contents: ["mysystemserverclasspathlib"],
9636 apex_available: ["myapex"],
9637 }
9638
9639 java_sdk_library {
9640 name: "mysystemserverclasspathlib",
9641 srcs: ["mysystemserverclasspathlib.java"],
9642 apex_available: ["myapex"],
9643 compile_dex: true,
9644 unsafe_ignore_missing_latest_api: true,
9645 }
9646 `)
9647 })
9648}
9649
Jiakai Zhang6decef92022-01-12 17:56:19 +00009650// Verifies that the APEX depends on all the Make modules in the list.
9651func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9652 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9653 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009654 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009655 }
9656}
9657
9658// Verifies that the APEX does not depend on any of the Make modules in the list.
9659func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9660 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9661 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009662 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009663 }
9664}
9665
Cole Faust24e25c02024-01-19 14:12:17 -08009666func TestApexStrictUpdtabilityLint(t *testing.T) {
9667 bpTemplate := `
9668 apex {
9669 name: "myapex",
9670 key: "myapex.key",
9671 java_libs: ["myjavalib"],
9672 updatable: %v,
9673 min_sdk_version: "29",
9674 }
9675 apex_key {
9676 name: "myapex.key",
9677 }
9678 java_library {
9679 name: "myjavalib",
9680 srcs: ["MyClass.java"],
9681 apex_available: [ "myapex" ],
9682 lint: {
9683 strict_updatability_linting: %v,
9684 %s
9685 },
9686 sdk_version: "current",
9687 min_sdk_version: "29",
9688 }
9689 `
9690 fs := android.MockFS{
9691 "lint-baseline.xml": nil,
9692 }
9693
9694 testCases := []struct {
9695 testCaseName string
9696 apexUpdatable bool
9697 javaStrictUpdtabilityLint bool
9698 lintFileExists bool
9699 disallowedFlagExpected bool
9700 }{
9701 {
9702 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9703 apexUpdatable: true,
9704 javaStrictUpdtabilityLint: true,
9705 lintFileExists: false,
9706 disallowedFlagExpected: false,
9707 },
9708 {
9709 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9710 apexUpdatable: false,
9711 javaStrictUpdtabilityLint: false,
9712 lintFileExists: true,
9713 disallowedFlagExpected: false,
9714 },
9715 {
9716 testCaseName: "non-updatable apex respects strict updatability of javalib",
9717 apexUpdatable: false,
9718 javaStrictUpdtabilityLint: true,
9719 lintFileExists: true,
9720 disallowedFlagExpected: true,
9721 },
9722 {
9723 testCaseName: "updatable apex sets strict updatability of javalib to true",
9724 apexUpdatable: true,
9725 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9726 lintFileExists: true,
9727 disallowedFlagExpected: true,
9728 },
9729 }
9730
9731 for _, testCase := range testCases {
9732 fixtures := []android.FixturePreparer{}
9733 baselineProperty := ""
9734 if testCase.lintFileExists {
9735 fixtures = append(fixtures, fs.AddToFixture())
9736 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9737 }
9738 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9739
9740 result := testApex(t, bp, fixtures...)
9741 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9742 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9743 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9744
9745 if disallowedFlagActual != testCase.disallowedFlagExpected {
9746 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9747 }
9748 }
9749}
9750
9751func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9752 bp := `
9753 apex {
9754 name: "myapex",
9755 key: "myapex.key",
9756 java_libs: ["myjavalib"],
9757 updatable: true,
9758 min_sdk_version: "29",
9759 }
9760 apex_key {
9761 name: "myapex.key",
9762 }
9763 java_library {
9764 name: "myjavalib",
9765 srcs: ["MyClass.java"],
9766 apex_available: [ "myapex" ],
9767 sdk_version: "current",
9768 min_sdk_version: "29",
9769 lint: {
9770 baseline_filename: "lint-baseline.xml",
9771 }
9772 }
9773 `
9774
9775 testCases := []struct {
9776 testCaseName string
9777 moduleDirectory string
9778 disallowedFlagExpected bool
9779 }{
9780 {
9781 testCaseName: "lintable module defined outside libcore",
9782 moduleDirectory: "",
9783 disallowedFlagExpected: true,
9784 },
9785 {
9786 testCaseName: "lintable module defined in libcore root directory",
9787 moduleDirectory: "libcore/",
9788 disallowedFlagExpected: false,
9789 },
9790 {
9791 testCaseName: "lintable module defined in libcore child directory",
9792 moduleDirectory: "libcore/childdir/",
9793 disallowedFlagExpected: true,
9794 },
9795 }
9796
9797 for _, testCase := range testCases {
9798 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9799 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9800 result := testApex(t, "", lintFileCreator, bpFileCreator)
9801 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9802 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9803 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9804 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9805
9806 if disallowedFlagActual != testCase.disallowedFlagExpected {
9807 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9808 }
9809 }
9810}
9811
9812// checks transtive deps of an apex coming from bootclasspath_fragment
9813func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9814 bp := `
9815 apex {
9816 name: "myapex",
9817 key: "myapex.key",
9818 bootclasspath_fragments: ["mybootclasspathfragment"],
9819 updatable: true,
9820 min_sdk_version: "29",
9821 }
9822 apex_key {
9823 name: "myapex.key",
9824 }
9825 bootclasspath_fragment {
9826 name: "mybootclasspathfragment",
9827 contents: ["myjavalib"],
9828 apex_available: ["myapex"],
9829 hidden_api: {
9830 split_packages: ["*"],
9831 },
9832 }
9833 java_library {
9834 name: "myjavalib",
9835 srcs: ["MyClass.java"],
9836 apex_available: [ "myapex" ],
9837 sdk_version: "current",
9838 min_sdk_version: "29",
9839 compile_dex: true,
9840 lint: {
9841 baseline_filename: "lint-baseline.xml",
9842 }
9843 }
9844 `
9845 fs := android.MockFS{
9846 "lint-baseline.xml": nil,
9847 }
9848
9849 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9850 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9851 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9852 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9853 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9854 }
9855}
Spandan Das66773252022-01-15 00:23:18 +00009856
Jihoon Kang784c0052024-06-25 22:15:39 +00009857func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9858 bp := `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 bootclasspath_fragments: ["mybootclasspathfragment"],
9863 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009864 java_libs: [
9865 "jacocoagent",
9866 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009867 }
9868 apex_key {
9869 name: "myapex.key",
9870 }
9871 bootclasspath_fragment {
9872 name: "mybootclasspathfragment",
9873 contents: ["foo"],
9874 apex_available: ["myapex"],
9875 hidden_api: {
9876 split_packages: ["*"],
9877 },
9878 }
9879 java_sdk_library {
9880 name: "foo",
9881 srcs: ["MyClass.java"],
9882 apex_available: [ "myapex" ],
9883 sdk_version: "current",
9884 min_sdk_version: "29",
9885 compile_dex: true,
9886 }
9887 `
9888 fs := android.MockFS{
9889 "lint-baseline.xml": nil,
9890 }
9891
9892 result := android.GroupFixturePreparers(
9893 prepareForApexTest,
9894 java.PrepareForTestWithJavaSdkLibraryFiles,
9895 java.PrepareForTestWithJacocoInstrumentation,
9896 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009897 android.FixtureMergeMockFs(fs),
9898 ).RunTestWithBp(t, bp)
9899
9900 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9901 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9902 android.AssertStringDoesContain(t,
9903 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9904 lintReportInputs, "foo.impl")
9905}
9906
Spandan Das42e89502022-05-06 22:12:55 +00009907// updatable apexes should propagate updatable=true to its apps
9908func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9909 bp := `
9910 apex {
9911 name: "myapex",
9912 key: "myapex.key",
9913 updatable: %v,
9914 apps: [
9915 "myapp",
9916 ],
9917 min_sdk_version: "30",
9918 }
9919 apex_key {
9920 name: "myapex.key",
9921 }
9922 android_app {
9923 name: "myapp",
9924 updatable: %v,
9925 apex_available: [
9926 "myapex",
9927 ],
9928 sdk_version: "current",
9929 min_sdk_version: "30",
9930 }
9931 `
9932 testCases := []struct {
9933 name string
9934 apex_is_updatable_bp bool
9935 app_is_updatable_bp bool
9936 app_is_updatable_expected bool
9937 }{
9938 {
9939 name: "Non-updatable apex respects updatable property of non-updatable app",
9940 apex_is_updatable_bp: false,
9941 app_is_updatable_bp: false,
9942 app_is_updatable_expected: false,
9943 },
9944 {
9945 name: "Non-updatable apex respects updatable property of updatable app",
9946 apex_is_updatable_bp: false,
9947 app_is_updatable_bp: true,
9948 app_is_updatable_expected: true,
9949 },
9950 {
9951 name: "Updatable apex respects updatable property of updatable app",
9952 apex_is_updatable_bp: true,
9953 app_is_updatable_bp: true,
9954 app_is_updatable_expected: true,
9955 },
9956 {
9957 name: "Updatable apex sets updatable=true on non-updatable app",
9958 apex_is_updatable_bp: true,
9959 app_is_updatable_bp: false,
9960 app_is_updatable_expected: true,
9961 },
9962 }
9963 for _, testCase := range testCases {
9964 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9965 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9966 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9967 }
9968}
9969
Dennis Shend4f5d932023-01-31 20:27:21 +00009970func TestTrimmedApex(t *testing.T) {
9971 bp := `
9972 apex {
9973 name: "myapex",
9974 key: "myapex.key",
9975 native_shared_libs: ["libfoo","libbaz"],
9976 min_sdk_version: "29",
9977 trim_against: "mydcla",
9978 }
9979 apex {
9980 name: "mydcla",
9981 key: "myapex.key",
9982 native_shared_libs: ["libfoo","libbar"],
9983 min_sdk_version: "29",
9984 file_contexts: ":myapex-file_contexts",
9985 dynamic_common_lib_apex: true,
9986 }
9987 apex_key {
9988 name: "myapex.key",
9989 }
9990 cc_library {
9991 name: "libfoo",
9992 shared_libs: ["libc"],
9993 apex_available: ["myapex","mydcla"],
9994 min_sdk_version: "29",
9995 }
9996 cc_library {
9997 name: "libbar",
9998 shared_libs: ["libc"],
9999 apex_available: ["myapex","mydcla"],
10000 min_sdk_version: "29",
10001 }
10002 cc_library {
10003 name: "libbaz",
10004 shared_libs: ["libc"],
10005 apex_available: ["myapex","mydcla"],
10006 min_sdk_version: "29",
10007 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010008 `
10009 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010010 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010011 apexRule := module.MaybeRule("apexRule")
10012 if apexRule.Rule == nil {
10013 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10014 }
10015
10016 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010017 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010018 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10019 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10020 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10021 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10022}
Jingwen Chendea7a642023-03-28 11:30:50 +000010023
10024func TestCannedFsConfig(t *testing.T) {
10025 ctx := testApex(t, `
10026 apex {
10027 name: "myapex",
10028 key: "myapex.key",
10029 updatable: false,
10030 }
10031
10032 apex_key {
10033 name: "myapex.key",
10034 public_key: "testkey.avbpubkey",
10035 private_key: "testkey.pem",
10036 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010037 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010038 generateFsRule := mod.Rule("generateFsConfig")
10039 cmd := generateFsRule.RuleParams.Command
10040
10041 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10042}
10043
10044func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10045 ctx := testApex(t, `
10046 apex {
10047 name: "myapex",
10048 key: "myapex.key",
10049 canned_fs_config: "my_config",
10050 updatable: false,
10051 }
10052
10053 apex_key {
10054 name: "myapex.key",
10055 public_key: "testkey.avbpubkey",
10056 private_key: "testkey.pem",
10057 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010058 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010059 generateFsRule := mod.Rule("generateFsConfig")
10060 cmd := generateFsRule.RuleParams.Command
10061
10062 // Ensure that canned_fs_config has "cat my_config" at the end
10063 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10064}
Spandan Das20fce2d2023-04-12 17:21:39 +000010065
10066func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10067 testCases := []struct {
10068 desc string
10069 hasStubs bool
10070 apexAvailable string
10071 expectedError string
10072 }{
10073 {
10074 desc: "non-stub library can have multiple apex_available",
10075 hasStubs: false,
10076 apexAvailable: `["myapex", "otherapex"]`,
10077 },
10078 {
10079 desc: "stub library should not be available to anyapex",
10080 hasStubs: true,
10081 apexAvailable: `["//apex_available:anyapex"]`,
10082 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10083 },
10084 {
10085 desc: "stub library should not be available to multiple apexes",
10086 hasStubs: true,
10087 apexAvailable: `["myapex", "otherapex"]`,
10088 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10089 },
10090 {
10091 desc: "stub library can be available to a core apex and a test apex",
10092 hasStubs: true,
10093 apexAvailable: `["myapex", "test_myapex"]`,
10094 },
10095 }
10096 bpTemplate := `
10097 cc_library {
10098 name: "libfoo",
10099 %v
10100 apex_available: %v,
10101 }
10102 apex {
10103 name: "myapex",
10104 key: "apex.key",
10105 updatable: false,
10106 native_shared_libs: ["libfoo"],
10107 }
10108 apex {
10109 name: "otherapex",
10110 key: "apex.key",
10111 updatable: false,
10112 }
10113 apex_test {
10114 name: "test_myapex",
10115 key: "apex.key",
10116 updatable: false,
10117 native_shared_libs: ["libfoo"],
10118 }
10119 apex_key {
10120 name: "apex.key",
10121 }
10122 `
10123 for _, tc := range testCases {
10124 stubs := ""
10125 if tc.hasStubs {
10126 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10127 }
10128 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10129 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10130 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10131 })
10132 if tc.expectedError == "" {
10133 testApex(t, bp, mockFsFixturePreparer)
10134 } else {
10135 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10136 }
10137 }
10138}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010139
10140func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10141 context := android.GroupFixturePreparers(
10142 android.PrepareForIntegrationTestWithAndroid,
10143 cc.PrepareForIntegrationTestWithCc,
10144 PrepareForTestWithApexBuildComponents,
10145 prepareForTestWithMyapex,
10146 filesystem.PrepareForTestWithFilesystemBuildComponents,
10147 )
10148 result := context.RunTestWithBp(t, `
10149 android_system_image {
10150 name: "myfilesystem",
10151 deps: [
10152 "libfoo",
10153 ],
10154 linker_config_src: "linker.config.json",
10155 }
10156
10157 cc_library {
10158 name: "libfoo",
10159 shared_libs: [
10160 "libbar",
10161 ],
10162 stl: "none",
10163 }
10164
10165 cc_library {
10166 name: "libbar",
10167 stl: "none",
10168 apex_available: ["myapex"],
10169 }
10170
10171 apex {
10172 name: "myapex",
10173 native_shared_libs: ["libbar"],
10174 key: "myapex.key",
10175 updatable: false,
10176 }
10177
10178 apex_key {
10179 name: "myapex.key",
10180 public_key: "testkey.avbpubkey",
10181 private_key: "testkey.pem",
10182 }
10183 `)
10184
Cole Faust3b806d32024-03-11 15:15:03 -070010185 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010186 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10187 inputs.Strings(),
10188 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10189}
Yu Liueae7b362023-11-16 17:05:47 -080010190
10191var apex_default_bp = `
10192 apex_key {
10193 name: "myapex.key",
10194 public_key: "testkey.avbpubkey",
10195 private_key: "testkey.pem",
10196 }
10197
10198 filegroup {
10199 name: "myapex.manifest",
10200 srcs: ["apex_manifest.json"],
10201 }
10202
10203 filegroup {
10204 name: "myapex.androidmanifest",
10205 srcs: ["AndroidManifest.xml"],
10206 }
10207`
10208
10209func TestAconfigFilesJavaDeps(t *testing.T) {
10210 ctx := testApex(t, apex_default_bp+`
10211 apex {
10212 name: "myapex",
10213 manifest: ":myapex.manifest",
10214 androidManifest: ":myapex.androidmanifest",
10215 key: "myapex.key",
10216 java_libs: [
10217 "my_java_library_foo",
10218 "my_java_library_bar",
10219 ],
10220 updatable: false,
10221 }
10222
10223 java_library {
10224 name: "my_java_library_foo",
10225 srcs: ["foo/bar/MyClass.java"],
10226 sdk_version: "none",
10227 system_modules: "none",
10228 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010229 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010230 "myapex",
10231 ],
10232 }
10233
10234 java_library {
10235 name: "my_java_library_bar",
10236 srcs: ["foo/bar/MyClass.java"],
10237 sdk_version: "none",
10238 system_modules: "none",
10239 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010240 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010241 "myapex",
10242 ],
10243 }
10244
10245 aconfig_declarations {
10246 name: "my_aconfig_declarations_foo",
10247 package: "com.example.package",
10248 container: "myapex",
10249 srcs: ["foo.aconfig"],
10250 }
10251
10252 java_aconfig_library {
10253 name: "my_java_aconfig_library_foo",
10254 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010255 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010256 "myapex",
10257 ],
10258 }
10259
10260 aconfig_declarations {
10261 name: "my_aconfig_declarations_bar",
10262 package: "com.example.package",
10263 container: "myapex",
10264 srcs: ["bar.aconfig"],
10265 }
10266
10267 java_aconfig_library {
10268 name: "my_java_aconfig_library_bar",
10269 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010270 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010271 "myapex",
10272 ],
10273 }
10274 `)
10275
10276 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10277 s := mod.Rule("apexRule").Args["copy_commands"]
10278 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010279 if len(copyCmds) != 12 {
10280 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010281 }
10282
Jooyung Hana3fddf42024-09-03 13:22:21 +090010283 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10284 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10285 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10286 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010287
Yu Liubba555e2024-02-17 00:36:42 +000010288 inputs := []string{
10289 "my_aconfig_declarations_foo/intermediate.pb",
10290 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010291 }
Yu Liubba555e2024-02-17 00:36:42 +000010292 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10293 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10294 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10295 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010296}
10297
10298func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10299 ctx := testApex(t, apex_default_bp+`
10300 apex {
10301 name: "myapex",
10302 manifest: ":myapex.manifest",
10303 androidManifest: ":myapex.androidmanifest",
10304 key: "myapex.key",
10305 java_libs: [
10306 "my_java_library_foo",
10307 ],
10308 native_shared_libs: [
10309 "my_cc_library_bar",
10310 ],
10311 binaries: [
10312 "my_cc_binary_baz",
10313 ],
10314 updatable: false,
10315 }
10316
10317 java_library {
10318 name: "my_java_library_foo",
10319 srcs: ["foo/bar/MyClass.java"],
10320 sdk_version: "none",
10321 system_modules: "none",
10322 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010323 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010324 "myapex",
10325 ],
10326 }
10327
10328 cc_library {
10329 name: "my_cc_library_bar",
10330 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010331 static_libs: [
10332 "my_cc_aconfig_library_bar",
10333 "my_cc_aconfig_library_baz",
10334 ],
Yu Liueae7b362023-11-16 17:05:47 -080010335 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010336 "myapex",
10337 ],
10338 }
10339
10340 cc_binary {
10341 name: "my_cc_binary_baz",
10342 srcs: ["foo/bar/MyClass.cc"],
10343 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010344 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010345 "myapex",
10346 ],
10347 }
10348
10349 aconfig_declarations {
10350 name: "my_aconfig_declarations_foo",
10351 package: "com.example.package",
10352 container: "myapex",
10353 srcs: ["foo.aconfig"],
10354 }
10355
10356 java_aconfig_library {
10357 name: "my_java_aconfig_library_foo",
10358 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010359 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010360 "myapex",
10361 ],
10362 }
10363
10364 aconfig_declarations {
10365 name: "my_aconfig_declarations_bar",
10366 package: "com.example.package",
10367 container: "myapex",
10368 srcs: ["bar.aconfig"],
10369 }
10370
10371 cc_aconfig_library {
10372 name: "my_cc_aconfig_library_bar",
10373 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010374 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010375 "myapex",
10376 ],
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 cc_aconfig_library {
10387 name: "my_cc_aconfig_library_baz",
10388 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010389 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010390 "myapex",
10391 ],
10392 }
10393
10394 cc_library {
10395 name: "server_configurable_flags",
10396 srcs: ["server_configurable_flags.cc"],
10397 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010398 cc_library {
10399 name: "libbase",
10400 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010401 apex_available: [
10402 "myapex",
10403 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010404 }
10405 cc_library {
10406 name: "libaconfig_storage_read_api_cc",
10407 srcs: ["libaconfig_storage_read_api_cc.cc"],
10408 }
Yu Liueae7b362023-11-16 17:05:47 -080010409 `)
10410
10411 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10412 s := mod.Rule("apexRule").Args["copy_commands"]
10413 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010414 if len(copyCmds) != 16 {
10415 t.Fatalf("Expected 16 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010416 }
10417
Jooyung Hana3fddf42024-09-03 13:22:21 +090010418 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10419 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10420 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10421 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010422
Yu Liubba555e2024-02-17 00:36:42 +000010423 inputs := []string{
10424 "my_aconfig_declarations_foo/intermediate.pb",
10425 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10426 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010427 }
Yu Liubba555e2024-02-17 00:36:42 +000010428 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10429 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10430 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10431 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010432}
10433
Yu Liucec0e412023-11-30 16:45:50 -080010434func TestAconfigFilesRustDeps(t *testing.T) {
10435 ctx := testApex(t, apex_default_bp+`
10436 apex {
10437 name: "myapex",
10438 manifest: ":myapex.manifest",
10439 androidManifest: ":myapex.androidmanifest",
10440 key: "myapex.key",
10441 native_shared_libs: [
10442 "libmy_rust_library",
10443 ],
10444 binaries: [
10445 "my_rust_binary",
10446 ],
10447 rust_dyn_libs: [
10448 "libmy_rust_dylib",
10449 ],
10450 updatable: false,
10451 }
10452
10453 rust_library {
10454 name: "libflags_rust", // test mock
10455 crate_name: "flags_rust",
10456 srcs: ["lib.rs"],
10457 apex_available: [
10458 "myapex",
10459 ],
10460 }
10461
10462 rust_library {
10463 name: "liblazy_static", // test mock
10464 crate_name: "lazy_static",
10465 srcs: ["src/lib.rs"],
10466 apex_available: [
10467 "myapex",
10468 ],
10469 }
10470
Ted Bauer02d475c2024-03-27 20:56:26 +000010471 rust_library {
10472 name: "libaconfig_storage_read_api", // test mock
10473 crate_name: "aconfig_storage_read_api",
10474 srcs: ["src/lib.rs"],
10475 apex_available: [
10476 "myapex",
10477 ],
10478 }
10479
Ted Bauer6ef40db2024-03-29 14:04:10 +000010480 rust_library {
10481 name: "liblogger", // test mock
10482 crate_name: "logger",
10483 srcs: ["src/lib.rs"],
10484 apex_available: [
10485 "myapex",
10486 ],
10487 }
10488
10489 rust_library {
10490 name: "liblog_rust", // test mock
10491 crate_name: "log_rust",
10492 srcs: ["src/lib.rs"],
10493 apex_available: [
10494 "myapex",
10495 ],
10496 }
10497
Yu Liucec0e412023-11-30 16:45:50 -080010498 rust_ffi_shared {
10499 name: "libmy_rust_library",
10500 srcs: ["src/lib.rs"],
10501 rustlibs: ["libmy_rust_aconfig_library_foo"],
10502 crate_name: "my_rust_library",
10503 apex_available: [
10504 "myapex",
10505 ],
10506 }
10507
10508 rust_library_dylib {
10509 name: "libmy_rust_dylib",
10510 srcs: ["foo/bar/MyClass.rs"],
10511 rustlibs: ["libmy_rust_aconfig_library_bar"],
10512 crate_name: "my_rust_dylib",
10513 apex_available: [
10514 "myapex",
10515 ],
10516 }
10517
10518 rust_binary {
10519 name: "my_rust_binary",
10520 srcs: ["foo/bar/MyClass.rs"],
10521 rustlibs: [
10522 "libmy_rust_aconfig_library_baz",
10523 "libmy_rust_dylib",
10524 ],
10525 apex_available: [
10526 "myapex",
10527 ],
10528 }
10529
10530 aconfig_declarations {
10531 name: "my_aconfig_declarations_foo",
10532 package: "com.example.package",
10533 container: "myapex",
10534 srcs: ["foo.aconfig"],
10535 }
10536
10537 aconfig_declarations {
10538 name: "my_aconfig_declarations_bar",
10539 package: "com.example.package",
10540 container: "myapex",
10541 srcs: ["bar.aconfig"],
10542 }
10543
10544 aconfig_declarations {
10545 name: "my_aconfig_declarations_baz",
10546 package: "com.example.package",
10547 container: "myapex",
10548 srcs: ["baz.aconfig"],
10549 }
10550
10551 rust_aconfig_library {
10552 name: "libmy_rust_aconfig_library_foo",
10553 aconfig_declarations: "my_aconfig_declarations_foo",
10554 crate_name: "my_rust_aconfig_library_foo",
10555 apex_available: [
10556 "myapex",
10557 ],
10558 }
10559
10560 rust_aconfig_library {
10561 name: "libmy_rust_aconfig_library_bar",
10562 aconfig_declarations: "my_aconfig_declarations_bar",
10563 crate_name: "my_rust_aconfig_library_bar",
10564 apex_available: [
10565 "myapex",
10566 ],
10567 }
10568
10569 rust_aconfig_library {
10570 name: "libmy_rust_aconfig_library_baz",
10571 aconfig_declarations: "my_aconfig_declarations_baz",
10572 crate_name: "my_rust_aconfig_library_baz",
10573 apex_available: [
10574 "myapex",
10575 ],
10576 }
10577 `)
10578
10579 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10580 s := mod.Rule("apexRule").Args["copy_commands"]
10581 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010582 if len(copyCmds) != 36 {
10583 t.Fatalf("Expected 36 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010584 }
10585
Jooyung Hana3fddf42024-09-03 13:22:21 +090010586 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10587 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10588 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10589 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liucec0e412023-11-30 16:45:50 -080010590
Yu Liubba555e2024-02-17 00:36:42 +000010591 inputs := []string{
10592 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010593 "my_aconfig_declarations_bar/intermediate.pb",
10594 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010595 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10596 }
10597 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10598 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10599 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10600 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10601}
10602
10603func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10604 aconfigRule := mod.Description(desc)
10605 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010606 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010607 if len(aconfigArgs) != len(inputs) {
10608 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010609 }
Yu Liucec0e412023-11-30 16:45:50 -080010610
Yu Liubba555e2024-02-17 00:36:42 +000010611 ensureEquals(t, container, aconfigRule.Args["container"])
10612 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10613
10614 buildParams := aconfigRule.BuildParams
10615 for _, input := range inputs {
10616 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10617 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010618 }
Yu Liubba555e2024-02-17 00:36:42 +000010619
10620 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010621}
10622
Yu Liueae7b362023-11-16 17:05:47 -080010623func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10624 ctx := testApex(t, apex_default_bp+`
10625 apex {
10626 name: "myapex",
10627 manifest: ":myapex.manifest",
10628 androidManifest: ":myapex.androidmanifest",
10629 key: "myapex.key",
10630 java_libs: [
10631 "my_java_library_foo",
10632 "other_java_library_bar",
10633 ],
10634 updatable: false,
10635 }
10636
10637 java_library {
10638 name: "my_java_library_foo",
10639 srcs: ["foo/bar/MyClass.java"],
10640 sdk_version: "none",
10641 system_modules: "none",
10642 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010643 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010644 "myapex",
10645 ],
10646 }
10647
10648 java_library {
10649 name: "other_java_library_bar",
10650 srcs: ["foo/bar/MyClass.java"],
10651 sdk_version: "none",
10652 system_modules: "none",
10653 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010654 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010655 "myapex",
10656 ],
10657 }
10658
10659 aconfig_declarations {
10660 name: "my_aconfig_declarations_foo",
10661 package: "com.example.package",
10662 container: "myapex",
10663 srcs: ["foo.aconfig"],
10664 }
10665
10666 java_aconfig_library {
10667 name: "my_java_aconfig_library_foo",
10668 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010669 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010670 "myapex",
10671 ],
10672 }
10673
10674 aconfig_declarations {
10675 name: "other_aconfig_declarations_bar",
10676 package: "com.example.package",
10677 container: "otherapex",
10678 srcs: ["bar.aconfig"],
10679 }
10680
10681 java_aconfig_library {
10682 name: "other_java_aconfig_library_bar",
10683 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010684 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010685 "myapex",
10686 ],
10687 }
10688 `)
10689
10690 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10691 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10692 s := " " + combineAconfigRule.Args["cache_files"]
10693 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10694 if len(aconfigArgs) != 1 {
10695 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10696 }
10697 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10698
10699 buildParams := combineAconfigRule.BuildParams
10700 if len(buildParams.Inputs) != 1 {
10701 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10702 }
10703 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10704 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10705}
10706
10707func TestAconfigFilesRemoveDuplicates(t *testing.T) {
10708 ctx := testApex(t, apex_default_bp+`
10709 apex {
10710 name: "myapex",
10711 manifest: ":myapex.manifest",
10712 androidManifest: ":myapex.androidmanifest",
10713 key: "myapex.key",
10714 java_libs: [
10715 "my_java_library_foo",
10716 "my_java_library_bar",
10717 ],
10718 updatable: false,
10719 }
10720
10721 java_library {
10722 name: "my_java_library_foo",
10723 srcs: ["foo/bar/MyClass.java"],
10724 sdk_version: "none",
10725 system_modules: "none",
10726 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010727 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010728 "myapex",
10729 ],
10730 }
10731
10732 java_library {
10733 name: "my_java_library_bar",
10734 srcs: ["foo/bar/MyClass.java"],
10735 sdk_version: "none",
10736 system_modules: "none",
10737 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010738 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010739 "myapex",
10740 ],
10741 }
10742
10743 aconfig_declarations {
10744 name: "my_aconfig_declarations_foo",
10745 package: "com.example.package",
10746 container: "myapex",
10747 srcs: ["foo.aconfig"],
10748 }
10749
10750 java_aconfig_library {
10751 name: "my_java_aconfig_library_foo",
10752 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010753 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010754 "myapex",
10755 ],
10756 }
10757
10758 java_aconfig_library {
10759 name: "my_java_aconfig_library_bar",
10760 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010761 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010762 "myapex",
10763 ],
10764 }
10765 `)
10766
10767 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10768 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10769 s := " " + combineAconfigRule.Args["cache_files"]
10770 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10771 if len(aconfigArgs) != 1 {
10772 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10773 }
10774 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10775
10776 buildParams := combineAconfigRule.BuildParams
10777 if len(buildParams.Inputs) != 1 {
10778 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10779 }
10780 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10781 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10782}
Spandan Das5be63332023-12-13 00:06:32 +000010783
10784// Test that the boot jars come from the _selected_ apex prebuilt
10785// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10786func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10787 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10788 t.Helper()
10789 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10790 foundLibfooJar := false
10791 base := stem + ".jar"
10792 for _, output := range s.AllOutputs() {
10793 if filepath.Base(output) == base {
10794 foundLibfooJar = true
10795 buildRule := s.Output(output)
10796 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10797 }
10798 }
10799 if !foundLibfooJar {
10800 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10801 }
10802 }
10803
Spandan Das64c9e0c2023-12-20 20:13:34 +000010804 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10805 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10806 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10807 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10808 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10809 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)
10810 }
10811
10812 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10813 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10814 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10815 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10816 }
10817
Spandan Das5be63332023-12-13 00:06:32 +000010818 bp := `
10819 // Source APEX.
10820
10821 java_library {
10822 name: "framework-foo",
10823 srcs: ["foo.java"],
10824 installable: true,
10825 apex_available: [
10826 "com.android.foo",
10827 ],
10828 }
10829
10830 bootclasspath_fragment {
10831 name: "foo-bootclasspath-fragment",
10832 contents: ["framework-foo"],
10833 apex_available: [
10834 "com.android.foo",
10835 ],
10836 hidden_api: {
10837 split_packages: ["*"],
10838 },
10839 }
10840
10841 apex_key {
10842 name: "com.android.foo.key",
10843 public_key: "com.android.foo.avbpubkey",
10844 private_key: "com.android.foo.pem",
10845 }
10846
10847 apex {
10848 name: "com.android.foo",
10849 key: "com.android.foo.key",
10850 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10851 updatable: false,
10852 }
10853
10854 // Prebuilt APEX.
10855
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010856 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010857 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010858 public: {
10859 jars: ["foo.jar"],
10860 },
Spandan Das5be63332023-12-13 00:06:32 +000010861 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010862 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010863 }
10864
10865 prebuilt_bootclasspath_fragment {
10866 name: "foo-bootclasspath-fragment",
10867 contents: ["framework-foo"],
10868 hidden_api: {
10869 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10870 metadata: "my-bootclasspath-fragment/metadata.csv",
10871 index: "my-bootclasspath-fragment/index.csv",
10872 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10873 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10874 },
10875 apex_available: [
10876 "com.android.foo",
10877 ],
10878 }
10879
10880 prebuilt_apex {
10881 name: "com.android.foo",
10882 apex_name: "com.android.foo",
10883 src: "com.android.foo-arm.apex",
10884 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10885 }
10886
10887 // Another Prebuilt ART APEX
10888 prebuilt_apex {
10889 name: "com.android.foo.v2",
10890 apex_name: "com.android.foo", // Used to determine the API domain
10891 src: "com.android.foo-arm.apex",
10892 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10893 }
10894
10895 // APEX contribution modules
10896
10897 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010898 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010899 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010900 contents: ["com.android.foo"],
10901 }
10902
10903 apex_contributions {
10904 name: "foo.prebuilt.contributions",
10905 api_domain: "com.android.foo",
10906 contents: ["prebuilt_com.android.foo"],
10907 }
10908
10909 apex_contributions {
10910 name: "foo.prebuilt.v2.contributions",
10911 api_domain: "com.android.foo",
10912 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010913 }
10914 `
10915
10916 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010917 desc string
10918 selectedApexContributions string
10919 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010920 }{
10921 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010922 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10923 selectedApexContributions: "foo.source.contributions",
10924 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010925 },
10926 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010927 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10928 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010929 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 +000010930 },
10931 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010932 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10933 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010934 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 +000010935 },
10936 }
10937
10938 fragment := java.ApexVariantReference{
10939 Apex: proptools.StringPtr("com.android.foo"),
10940 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10941 }
10942
10943 for _, tc := range testCases {
10944 preparer := android.GroupFixturePreparers(
10945 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10946 android.FixtureMergeMockFs(map[string][]byte{
10947 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10948 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010949 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10950 // file creation.
10951 java.FixtureConfigureBootJars("platform:foo"),
10952 android.FixtureModifyMockFS(func(fs android.MockFS) {
10953 fs["platform/Android.bp"] = []byte(`
10954 java_library {
10955 name: "foo",
10956 srcs: ["Test.java"],
10957 compile_dex: true,
10958 }
10959 `)
10960 fs["platform/Test.java"] = nil
10961 }),
10962
Colin Crossa66b4632024-08-08 15:50:47 -070010963 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010964 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010965 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010966 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010967 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10968 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010969 }
10970}
Spandan Das3576e762024-01-03 18:57:03 +000010971
10972// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10973// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10974func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000010975 // for a mainline module family, check that only the flagged soong module is visible to make
10976 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
10977 variation := func(moduleName string) string {
10978 ret := "android_common_com.android.foo"
10979 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000010980 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000010981 }
10982 return ret
10983 }
10984
10985 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10986 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10987
10988 for _, hiddenModuleName := range hiddenModuleNames {
10989 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10990 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10991
10992 }
10993 }
10994
10995 bp := `
10996 apex_key {
10997 name: "com.android.foo.key",
10998 public_key: "com.android.foo.avbpubkey",
10999 private_key: "com.android.foo.pem",
11000 }
11001
11002 // AOSP source apex
11003 apex {
11004 name: "com.android.foo",
11005 key: "com.android.foo.key",
11006 updatable: false,
11007 }
11008
11009 // Google source apex
11010 override_apex {
11011 name: "com.google.android.foo",
11012 base: "com.android.foo",
11013 key: "com.android.foo.key",
11014 }
11015
11016 // Prebuilt Google APEX.
11017
11018 prebuilt_apex {
11019 name: "com.google.android.foo",
11020 apex_name: "com.android.foo",
11021 src: "com.android.foo-arm.apex",
11022 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11023 }
11024
11025 // Another Prebuilt Google APEX
11026 prebuilt_apex {
11027 name: "com.google.android.foo.v2",
11028 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011029 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011030 src: "com.android.foo-arm.apex",
11031 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11032 }
11033
11034 // APEX contribution modules
11035
11036 apex_contributions {
11037 name: "foo.source.contributions",
11038 api_domain: "com.android.foo",
11039 contents: ["com.google.android.foo"],
11040 }
11041
11042 apex_contributions {
11043 name: "foo.prebuilt.contributions",
11044 api_domain: "com.android.foo",
11045 contents: ["prebuilt_com.google.android.foo"],
11046 }
11047
11048 apex_contributions {
11049 name: "foo.prebuilt.v2.contributions",
11050 api_domain: "com.android.foo",
11051 contents: ["prebuilt_com.google.android.foo.v2"],
11052 }
11053
11054 // This is an incompatible module because it selects multiple versions of the same mainline module
11055 apex_contributions {
11056 name: "foo.prebuilt.duplicate.contributions",
11057 api_domain: "com.android.foo",
11058 contents: [
11059 "prebuilt_com.google.android.foo",
11060 "prebuilt_com.google.android.foo.v2",
11061 ],
11062 }
11063 `
11064
11065 testCases := []struct {
11066 desc string
11067 selectedApexContributions string
11068 expectedVisibleModuleName string
11069 expectedHiddenModuleNames []string
11070 expectedError string
11071 }{
11072 {
11073 desc: "Source apex is selected, prebuilts should be hidden from make",
11074 selectedApexContributions: "foo.source.contributions",
11075 expectedVisibleModuleName: "com.google.android.foo",
11076 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11077 },
11078 {
11079 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11080 selectedApexContributions: "foo.prebuilt.contributions",
11081 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11082 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11083 },
11084 {
11085 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11086 selectedApexContributions: "foo.prebuilt.v2.contributions",
11087 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11088 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11089 },
11090 {
11091 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11092 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11093 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11094 },
11095 }
11096
11097 for _, tc := range testCases {
11098 preparer := android.GroupFixturePreparers(
11099 android.FixtureMergeMockFs(map[string][]byte{
11100 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11101 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011102 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011103 )
11104 if tc.expectedError != "" {
11105 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11106 testApex(t, bp, preparer)
11107 return
11108 }
11109 ctx := testApex(t, bp, preparer)
11110
Spandan Das3576e762024-01-03 18:57:03 +000011111 // Check that
11112 // 1. The contents of the selected apex_contributions are visible to make
11113 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11114 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11115 }
11116}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011117
Spandan Das85bd4622024-08-01 00:51:20 +000011118// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11119func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11120 // for a mainline module family, check that only the flagged soong module is visible to make
11121 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11122 variation := func(moduleName string) string {
11123 ret := "android_common_com.android.adservices"
11124 if moduleName == "com.google.android.foo" {
11125 ret = "android_common_com.google.android.foo_com.google.android.foo"
11126 }
11127 return ret
11128 }
11129
11130 for _, visibleModuleName := range visibleModuleNames {
11131 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11132 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11133 }
11134
11135 for _, hiddenModuleName := range hiddenModuleNames {
11136 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11137 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11138
11139 }
11140 }
11141
11142 bp := `
11143 apex_key {
11144 name: "com.android.adservices.key",
11145 public_key: "com.android.adservices.avbpubkey",
11146 private_key: "com.android.adservices.pem",
11147 }
11148
11149 // AOSP source apex
11150 apex {
11151 name: "com.android.adservices",
11152 key: "com.android.adservices.key",
11153 updatable: false,
11154 }
11155
11156 // Prebuilt Google APEX.
11157
11158 prebuilt_apex {
11159 name: "com.google.android.adservices",
11160 apex_name: "com.android.adservices",
11161 src: "com.android.foo-arm.apex",
11162 }
11163
11164 // Another Prebuilt Google APEX
11165 prebuilt_apex {
11166 name: "com.google.android.adservices.v2",
11167 apex_name: "com.android.adservices",
11168 src: "com.android.foo-arm.apex",
11169 }
11170
11171 // APEX contribution modules
11172
11173
11174 apex_contributions {
11175 name: "adservices.prebuilt.contributions",
11176 api_domain: "com.android.adservices",
11177 contents: ["prebuilt_com.google.android.adservices"],
11178 }
11179
11180 apex_contributions {
11181 name: "adservices.prebuilt.v2.contributions",
11182 api_domain: "com.android.adservices",
11183 contents: ["prebuilt_com.google.android.adservices.v2"],
11184 }
11185 `
11186
11187 testCases := []struct {
11188 desc string
11189 selectedApexContributions string
11190 expectedVisibleModuleNames []string
11191 expectedHiddenModuleNames []string
11192 }{
11193 {
11194 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11195 selectedApexContributions: "",
11196 expectedVisibleModuleNames: []string{"com.android.adservices"},
11197 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11198 },
11199 {
11200 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11201 selectedApexContributions: "adservices.prebuilt.contributions",
11202 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11203 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11204 },
11205 {
11206 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11207 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11208 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11209 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11210 },
11211 }
11212
11213 for _, tc := range testCases {
11214 preparer := android.GroupFixturePreparers(
11215 android.FixtureMergeMockFs(map[string][]byte{
11216 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11217 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011218 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011219 )
11220 ctx := testApex(t, bp, preparer)
11221
11222 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11223 }
11224}
11225
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011226func TestAconfifDeclarationsValidation(t *testing.T) {
11227 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11228 for _, moduleName := range moduleNames {
11229 ret += fmt.Sprintf(`
11230 aconfig_declarations {
11231 name: "%[1]s",
11232 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011233 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011234 srcs: [
11235 "%[1]s.aconfig",
11236 ],
11237 }
11238 java_aconfig_library {
11239 name: "%[1]s-lib",
11240 aconfig_declarations: "%[1]s",
11241 }
11242 `, moduleName)
11243 }
11244 return ret
11245 }
11246
11247 result := android.GroupFixturePreparers(
11248 prepareForApexTest,
11249 java.PrepareForTestWithJavaSdkLibraryFiles,
11250 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011251 ).RunTestWithBp(t, `
11252 java_library {
11253 name: "baz-java-lib",
11254 static_libs: [
11255 "baz-lib",
11256 ],
11257 }
11258 filegroup {
11259 name: "qux-filegroup",
11260 srcs: [
11261 ":qux-lib{.generated_srcjars}",
11262 ],
11263 }
11264 filegroup {
11265 name: "qux-another-filegroup",
11266 srcs: [
11267 ":qux-filegroup",
11268 ],
11269 }
11270 java_library {
11271 name: "quux-java-lib",
11272 srcs: [
11273 "a.java",
11274 ],
11275 libs: [
11276 "quux-lib",
11277 ],
11278 }
11279 java_sdk_library {
11280 name: "foo",
11281 srcs: [
11282 ":qux-another-filegroup",
11283 ],
11284 api_packages: ["foo"],
11285 system: {
11286 enabled: true,
11287 },
11288 module_lib: {
11289 enabled: true,
11290 },
11291 test: {
11292 enabled: true,
11293 },
11294 static_libs: [
11295 "bar-lib",
11296 ],
11297 libs: [
11298 "baz-java-lib",
11299 "quux-java-lib",
11300 ],
11301 aconfig_declarations: [
11302 "bar",
11303 ],
11304 }
11305 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11306
11307 m := result.ModuleForTests("foo.stubs.source", "android_common")
11308 outDir := "out/soong/.intermediates"
11309
11310 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11311 // textproto files
11312 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11313
11314 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11315 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11316 // to aconfig.
11317 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11318 "passed as an input",
11319 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11320
11321 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11322 // to metalava as classpath. Thus the cache file provided by the associated
11323 // aconfig_declarations module "baz" should be passed to aconfig.
11324 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11325 "java_aconfig_library passed as an input",
11326 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11327
11328 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11329 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11330 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11331 "input",
11332 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11333
11334 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11335 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11336 // aconfig_declarations module "quux" should not be passed to aconfig.
11337 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11338 "depend on java_aconfig_library not passed as an input",
11339 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11340}
Cole Faust7c991b42024-05-15 11:17:55 -070011341
11342func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11343 ctx := testApex(t, `
11344 apex {
11345 name: "myapex",
11346 key: "myapex.key",
11347 prebuilts: ["myetc", "myetc2"],
11348 min_sdk_version: "29",
11349 }
11350 apex_key {
11351 name: "myapex.key",
11352 public_key: "testkey.avbpubkey",
11353 private_key: "testkey.pem",
11354 }
11355
11356 prebuilt_etc {
11357 name: "myetc",
11358 src: "myprebuilt",
11359 filename: "myfilename",
11360 }
11361 prebuilt_etc {
11362 name: "myetc2",
11363 sub_dir: "mysubdir",
11364 src: "myprebuilt",
11365 filename: "myfilename",
11366 }
11367 `, withFiles(android.MockFS{
11368 "packages/modules/common/build/allowed_deps.txt": nil,
11369 }))
11370
11371 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11372 data := android.AndroidMkDataForTest(t, ctx, ab)
11373 var builder strings.Builder
11374 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11375 androidMk := builder.String()
11376
11377 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11378 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11379}
Spandan Das50801e22024-05-13 18:29:45 +000011380
11381func TestApexMinSdkVersionOverride(t *testing.T) {
11382 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11383 args := module.Rule("apexRule").Args
11384 optFlags := args["opt_flags"]
11385 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11386 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11387 }
11388 }
11389
11390 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11391 t.Helper()
11392 found := false
11393 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11394 if dep == wantDep {
11395 found = true
11396 }
11397 })
11398 if !found {
11399 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11400 }
11401 }
11402
11403 ctx := testApex(t, `
11404 apex {
11405 name: "com.android.apex30",
11406 min_sdk_version: "30",
11407 key: "apex30.key",
11408 java_libs: ["javalib"],
11409 }
11410
11411 java_library {
11412 name: "javalib",
11413 srcs: ["A.java"],
11414 apex_available: ["com.android.apex30"],
11415 min_sdk_version: "30",
11416 sdk_version: "current",
11417 }
11418
11419 override_apex {
11420 name: "com.mycompany.android.apex30",
11421 base: "com.android.apex30",
11422 }
11423
11424 override_apex {
11425 name: "com.mycompany.android.apex31",
11426 base: "com.android.apex30",
11427 min_sdk_version: "31",
11428 }
11429
11430 apex_key {
11431 name: "apex30.key",
11432 public_key: "testkey.avbpubkey",
11433 private_key: "testkey.pem",
11434 }
11435
11436 `, android.FixtureMergeMockFs(android.MockFS{
11437 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11438 }),
11439 )
11440
11441 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11442 checkMinSdkVersion(t, baseModule, "30")
11443
11444 // Override module, but uses same min_sdk_version
11445 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11446 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11447 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11448 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11449
11450 // Override module, uses different min_sdk_version
11451 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11452 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11453 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11454 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11455}
Spandan Das0b28fa02024-05-28 23:40:17 +000011456
11457func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11458 context := android.GroupFixturePreparers(
11459 android.PrepareForIntegrationTestWithAndroid,
11460 PrepareForTestWithApexBuildComponents,
11461 android.FixtureMergeMockFs(android.MockFS{
11462 "system/sepolicy/apex/foo-file_contexts": nil,
11463 }),
11464 )
11465 res := context.RunTestWithBp(t, `
11466 apex {
11467 name: "foo",
11468 key: "myapex.key",
11469 apex_available_name: "com.android.foo",
11470 variant_version: "0",
11471 updatable: false,
11472 }
11473 apex_key {
11474 name: "myapex.key",
11475 public_key: "testkey.avbpubkey",
11476 private_key: "testkey.pem",
11477 }
11478 prebuilt_apex {
11479 name: "foo",
11480 src: "foo.apex",
11481 prefer: true,
11482 }
11483 override_apex {
11484 name: "myoverrideapex",
11485 base: "foo",
11486 }
11487 `)
11488
11489 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11490}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011491
11492func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11493 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`, `
11494 apex {
11495 name: "myapex",
11496 key: "myapex.key",
11497 updatable: true,
11498 min_sdk_version: "current",
11499 }
11500
11501 apex_key {
11502 name: "myapex.key",
11503 public_key: "testkey.avbpubkey",
11504 private_key: "testkey.pem",
11505 }
11506 `)
11507}
Spandan Das2f68f192024-07-22 19:25:50 +000011508
11509func TestPrebuiltStubNoinstall(t *testing.T) {
11510 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11511 result := android.GroupFixturePreparers(
11512 prepareForApexTest,
11513 android.PrepareForTestWithAndroidMk,
11514 android.PrepareForTestWithMakevars,
11515 android.FixtureMergeMockFs(fs),
11516 ).RunTest(t)
11517
11518 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011519 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011520
11521 installRules := result.InstallMakeRulesForTesting(t)
11522
11523 var installedlibRule *android.InstallMakeRule
11524 for i, rule := range installRules {
11525 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11526 if installedlibRule != nil {
11527 t.Errorf("Duplicate install rules for %s", rule.Target)
11528 }
11529 installedlibRule = &installRules[i]
11530 }
11531 }
11532 if installedlibRule == nil {
11533 t.Errorf("No install rule found for installedlib")
11534 return
11535 }
11536
11537 if expectLibfooOnSystemLib {
11538 android.AssertStringListContains(t,
11539 "installedlib doesn't have install dependency on libfoo impl",
11540 installedlibRule.OrderOnlyDeps,
11541 "out/target/product/test_device/system/lib/libfoo.so")
11542 } else {
11543 android.AssertStringListDoesNotContain(t,
11544 "installedlib has install dependency on libfoo stub",
11545 installedlibRule.Deps,
11546 "out/target/product/test_device/system/lib/libfoo.so")
11547 android.AssertStringListDoesNotContain(t,
11548 "installedlib has order-only install dependency on libfoo stub",
11549 installedlibRule.OrderOnlyDeps,
11550 "out/target/product/test_device/system/lib/libfoo.so")
11551 }
11552 }
11553
11554 prebuiltLibfooBp := []byte(`
11555 cc_prebuilt_library {
11556 name: "libfoo",
11557 prefer: true,
11558 srcs: ["libfoo.so"],
11559 stubs: {
11560 versions: ["1"],
11561 },
11562 apex_available: ["apexfoo"],
11563 }
11564 `)
11565
11566 apexfooBp := []byte(`
11567 apex {
11568 name: "apexfoo",
11569 key: "apexfoo.key",
11570 native_shared_libs: ["libfoo"],
11571 updatable: false,
11572 compile_multilib: "both",
11573 }
11574 apex_key {
11575 name: "apexfoo.key",
11576 public_key: "testkey.avbpubkey",
11577 private_key: "testkey.pem",
11578 }
11579 `)
11580
11581 installedlibBp := []byte(`
11582 cc_library {
11583 name: "installedlib",
11584 shared_libs: ["libfoo"],
11585 }
11586 `)
11587
11588 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11589 testFunc(
11590 t,
11591 /*expectLibfooOnSystemLib=*/ false,
11592 android.MockFS{
11593 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11594 "apexfoo/Android.bp": apexfooBp,
11595 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11596 "Android.bp": installedlibBp,
11597 },
11598 )
11599 })
11600
11601 disabledSourceLibfooBp := []byte(`
11602 cc_library {
11603 name: "libfoo",
11604 enabled: false,
11605 stubs: {
11606 versions: ["1"],
11607 },
11608 apex_available: ["apexfoo"],
11609 }
11610 `)
11611
11612 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11613 testFunc(
11614 t,
11615 /*expectLibfooOnSystemLib=*/ false,
11616 android.MockFS{
11617 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11618 "impl/Android.bp": disabledSourceLibfooBp,
11619 "apexfoo/Android.bp": apexfooBp,
11620 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11621 "Android.bp": installedlibBp,
11622 },
11623 )
11624 })
11625}
Jihoon Kange246bb72024-09-18 22:26:22 +000011626
11627func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11628 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11629 // in libs of android_app and java_library does not lead to class loader context device/host
11630 // path mismatch errors.
11631 android.GroupFixturePreparers(
11632 prepareForApexTest,
11633 android.PrepareForIntegrationTestWithAndroid,
11634 PrepareForTestWithApexBuildComponents,
11635 android.FixtureModifyEnv(func(env map[string]string) {
11636 env["DISABLE_CONTAINER_CHECK"] = "true"
11637 }),
11638 withFiles(filesForSdkLibrary),
11639 android.FixtureMergeMockFs(android.MockFS{
11640 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11641 }),
11642 ).RunTestWithBp(t, `
11643 apex {
11644 name: "com.android.foo30",
11645 key: "myapex.key",
11646 updatable: true,
11647 bootclasspath_fragments: [
11648 "foo-bootclasspath-fragment",
11649 ],
11650 java_libs: [
11651 "bar",
11652 ],
11653 apps: [
11654 "bar-app",
11655 ],
11656 min_sdk_version: "30",
11657 }
11658 apex_key {
11659 name: "myapex.key",
11660 public_key: "testkey.avbpubkey",
11661 private_key: "testkey.pem",
11662 }
11663 bootclasspath_fragment {
11664 name: "foo-bootclasspath-fragment",
11665 contents: [
11666 "framework-foo",
11667 ],
11668 apex_available: [
11669 "com.android.foo30",
11670 ],
11671 hidden_api: {
11672 split_packages: ["*"]
11673 },
11674 }
11675
11676 java_sdk_library {
11677 name: "framework-foo",
11678 srcs: [
11679 "A.java"
11680 ],
11681 unsafe_ignore_missing_latest_api: true,
11682 apex_available: [
11683 "com.android.foo30",
11684 ],
11685 compile_dex: true,
11686 sdk_version: "core_current",
11687 shared_library: false,
11688 }
11689
11690 java_library {
11691 name: "bar",
11692 srcs: [
11693 "A.java"
11694 ],
11695 libs: [
11696 "framework-foo.impl",
11697 ],
11698 apex_available: [
11699 "com.android.foo30",
11700 ],
11701 sdk_version: "core_current",
11702 }
11703
11704 java_library {
11705 name: "baz",
11706 srcs: [
11707 "A.java"
11708 ],
11709 libs: [
11710 "bar",
11711 ],
11712 sdk_version: "core_current",
11713 }
11714
11715 android_app {
11716 name: "bar-app",
11717 srcs: [
11718 "A.java"
11719 ],
11720 libs: [
11721 "baz",
11722 "framework-foo.impl",
11723 ],
11724 apex_available: [
11725 "com.android.foo30",
11726 ],
11727 sdk_version: "core_current",
11728 min_sdk_version: "30",
11729 manifest: "AndroidManifest.xml",
11730 }
11731 `)
11732}