blob: 8cb8a913230ff12bcd20e8272392138687eb204f [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())
Dario Frenie3546902020-01-14 23:50:25 +00007113 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007114
7115 // The copies of the libraries in the apex should have one more dependency than
7116 // the ones outside the apex, namely the unwinder. Ideally we should check
7117 // the dependency names directly here but for some reason the names are blank in
7118 // this test.
7119 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007120 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007121 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7122 if len(apexImplicits) != len(nonApexImplicits)+1 {
7123 t.Errorf("%q missing unwinder dep", lib)
7124 }
7125 }
Jooyung Han214bf372019-11-12 13:03:50 +09007126}
7127
Paul Duffine05480a2021-03-08 15:07:14 +00007128var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007129 "api/current.txt": nil,
7130 "api/removed.txt": nil,
7131 "api/system-current.txt": nil,
7132 "api/system-removed.txt": nil,
7133 "api/test-current.txt": nil,
7134 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007135
Anton Hanssondff2c782020-12-21 17:10:01 +00007136 "100/public/api/foo.txt": nil,
7137 "100/public/api/foo-removed.txt": nil,
7138 "100/system/api/foo.txt": nil,
7139 "100/system/api/foo-removed.txt": nil,
7140
Paul Duffineedc5d52020-06-12 17:46:39 +01007141 // For java_sdk_library_import
7142 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007143}
7144
Jooyung Han58f26ab2019-12-18 15:34:32 +09007145func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007146 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007147 apex {
7148 name: "myapex",
7149 key: "myapex.key",
7150 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007151 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007152 }
7153
7154 apex_key {
7155 name: "myapex.key",
7156 public_key: "testkey.avbpubkey",
7157 private_key: "testkey.pem",
7158 }
7159
7160 java_sdk_library {
7161 name: "foo",
7162 srcs: ["a.java"],
7163 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007164 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007165 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007166
7167 prebuilt_apis {
7168 name: "sdk",
7169 api_dirs: ["100"],
7170 }
Paul Duffin9b879592020-05-26 13:21:35 +01007171 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007172
7173 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007174 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007175 "javalib/foo.jar",
7176 "etc/permissions/foo.xml",
7177 })
7178 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007179 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7180 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7181 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007182}
7183
Spandan Das3ee19692024-06-19 04:47:40 +00007184func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7185 ctx := testApex(t, `
7186 override_apex {
7187 name: "mycompanyapex",
7188 base: "myapex",
7189 }
7190 apex {
7191 name: "myapex",
7192 key: "myapex.key",
7193 java_libs: ["foo"],
7194 updatable: false,
7195 }
7196
7197 apex_key {
7198 name: "myapex.key",
7199 public_key: "testkey.avbpubkey",
7200 private_key: "testkey.pem",
7201 }
7202
7203 java_sdk_library {
7204 name: "foo",
7205 srcs: ["a.java"],
7206 api_packages: ["foo"],
7207 apex_available: [ "myapex" ],
7208 }
7209
7210 prebuilt_apis {
7211 name: "sdk",
7212 api_dirs: ["100"],
7213 }
7214 `, withFiles(filesForSdkLibrary))
7215
7216 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7217 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7218 // (com.android.foo), the filepath should not contain override apex name.
7219 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7220 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7221 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7222}
7223
Paul Duffin9b879592020-05-26 13:21:35 +01007224func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007225 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007226 apex {
7227 name: "myapex",
7228 key: "myapex.key",
7229 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007230 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007231 }
7232
7233 apex_key {
7234 name: "myapex.key",
7235 public_key: "testkey.avbpubkey",
7236 private_key: "testkey.pem",
7237 }
7238
7239 java_sdk_library {
7240 name: "foo",
7241 srcs: ["a.java"],
7242 api_packages: ["foo"],
7243 apex_available: ["myapex"],
7244 sdk_version: "none",
7245 system_modules: "none",
7246 }
7247
7248 java_library {
7249 name: "bar",
7250 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007251 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007252 apex_available: ["myapex"],
7253 sdk_version: "none",
7254 system_modules: "none",
7255 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007256
7257 prebuilt_apis {
7258 name: "sdk",
7259 api_dirs: ["100"],
7260 }
Paul Duffin9b879592020-05-26 13:21:35 +01007261 `, withFiles(filesForSdkLibrary))
7262
7263 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007264 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007265 "javalib/bar.jar",
7266 "javalib/foo.jar",
7267 "etc/permissions/foo.xml",
7268 })
7269
7270 // The bar library should depend on the implementation jar.
7271 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007272 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007273 t.Errorf("expected %q, found %#q", expected, actual)
7274 }
7275}
7276
7277func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007278 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007279 apex {
7280 name: "myapex",
7281 key: "myapex.key",
7282 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007283 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007284 }
7285
7286 apex_key {
7287 name: "myapex.key",
7288 public_key: "testkey.avbpubkey",
7289 private_key: "testkey.pem",
7290 }
7291
7292 java_sdk_library {
7293 name: "foo",
7294 srcs: ["a.java"],
7295 api_packages: ["foo"],
7296 apex_available: ["myapex"],
7297 sdk_version: "none",
7298 system_modules: "none",
7299 }
7300
7301 java_library {
7302 name: "bar",
7303 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007304 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007305 sdk_version: "none",
7306 system_modules: "none",
7307 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007308
7309 prebuilt_apis {
7310 name: "sdk",
7311 api_dirs: ["100"],
7312 }
Paul Duffin9b879592020-05-26 13:21:35 +01007313 `, withFiles(filesForSdkLibrary))
7314
7315 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007316 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007317 "javalib/foo.jar",
7318 "etc/permissions/foo.xml",
7319 })
7320
7321 // The bar library should depend on the stubs jar.
7322 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007323 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007324 t.Errorf("expected %q, found %#q", expected, actual)
7325 }
7326}
7327
Paul Duffineedc5d52020-06-12 17:46:39 +01007328func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007329 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007330 prebuilt_apis {
7331 name: "sdk",
7332 api_dirs: ["100"],
7333 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007334 withFiles(map[string][]byte{
7335 "apex/a.java": nil,
7336 "apex/apex_manifest.json": nil,
7337 "apex/Android.bp": []byte(`
7338 package {
7339 default_visibility: ["//visibility:private"],
7340 }
7341
7342 apex {
7343 name: "myapex",
7344 key: "myapex.key",
7345 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007346 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007347 }
7348
7349 apex_key {
7350 name: "myapex.key",
7351 public_key: "testkey.avbpubkey",
7352 private_key: "testkey.pem",
7353 }
7354
7355 java_library {
7356 name: "bar",
7357 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007358 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007359 apex_available: ["myapex"],
7360 sdk_version: "none",
7361 system_modules: "none",
7362 }
7363`),
7364 "source/a.java": nil,
7365 "source/api/current.txt": nil,
7366 "source/api/removed.txt": nil,
7367 "source/Android.bp": []byte(`
7368 package {
7369 default_visibility: ["//visibility:private"],
7370 }
7371
7372 java_sdk_library {
7373 name: "foo",
7374 visibility: ["//apex"],
7375 srcs: ["a.java"],
7376 api_packages: ["foo"],
7377 apex_available: ["myapex"],
7378 sdk_version: "none",
7379 system_modules: "none",
7380 public: {
7381 enabled: true,
7382 },
7383 }
7384`),
7385 "prebuilt/a.jar": nil,
7386 "prebuilt/Android.bp": []byte(`
7387 package {
7388 default_visibility: ["//visibility:private"],
7389 }
7390
7391 java_sdk_library_import {
7392 name: "foo",
7393 visibility: ["//apex", "//source"],
7394 apex_available: ["myapex"],
7395 prefer: true,
7396 public: {
7397 jars: ["a.jar"],
7398 },
7399 }
7400`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007401 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007402 )
7403
7404 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007405 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007406 "javalib/bar.jar",
7407 "javalib/foo.jar",
7408 "etc/permissions/foo.xml",
7409 })
7410
7411 // The bar library should depend on the implementation jar.
7412 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007413 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007414 t.Errorf("expected %q, found %#q", expected, actual)
7415 }
7416}
7417
7418func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7419 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7420 apex {
7421 name: "myapex",
7422 key: "myapex.key",
7423 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007424 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007425 }
7426
7427 apex_key {
7428 name: "myapex.key",
7429 public_key: "testkey.avbpubkey",
7430 private_key: "testkey.pem",
7431 }
7432
7433 java_sdk_library_import {
7434 name: "foo",
7435 apex_available: ["myapex"],
7436 prefer: true,
7437 public: {
7438 jars: ["a.jar"],
7439 },
7440 }
7441
7442 `, withFiles(filesForSdkLibrary))
7443}
7444
atrost6e126252020-01-27 17:01:16 +00007445func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007446 result := android.GroupFixturePreparers(
7447 prepareForApexTest,
7448 java.PrepareForTestWithPlatformCompatConfig,
7449 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007450 apex {
7451 name: "myapex",
7452 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007453 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007454 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007455 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007456 }
7457
7458 apex_key {
7459 name: "myapex.key",
7460 public_key: "testkey.avbpubkey",
7461 private_key: "testkey.pem",
7462 }
7463
7464 platform_compat_config {
7465 name: "myjar-platform-compat-config",
7466 src: ":myjar",
7467 }
7468
7469 java_library {
7470 name: "myjar",
7471 srcs: ["foo/bar/MyClass.java"],
7472 sdk_version: "none",
7473 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007474 apex_available: [ "myapex" ],
7475 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007476
7477 // Make sure that a preferred prebuilt does not affect the apex contents.
7478 prebuilt_platform_compat_config {
7479 name: "myjar-platform-compat-config",
7480 metadata: "compat-config/metadata.xml",
7481 prefer: true,
7482 }
atrost6e126252020-01-27 17:01:16 +00007483 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007484 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007485 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007486 "etc/compatconfig/myjar-platform-compat-config.xml",
7487 "javalib/myjar.jar",
7488 })
7489}
7490
Jooyung Han862c0d62022-12-21 10:15:37 +09007491func TestNoDupeApexFiles(t *testing.T) {
7492 android.GroupFixturePreparers(
7493 android.PrepareForTestWithAndroidBuildComponents,
7494 PrepareForTestWithApexBuildComponents,
7495 prepareForTestWithMyapex,
7496 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7497 ).
7498 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7499 RunTestWithBp(t, `
7500 apex {
7501 name: "myapex",
7502 key: "myapex.key",
7503 prebuilts: ["foo", "bar"],
7504 updatable: false,
7505 }
7506
7507 apex_key {
7508 name: "myapex.key",
7509 public_key: "testkey.avbpubkey",
7510 private_key: "testkey.pem",
7511 }
7512
7513 prebuilt_etc {
7514 name: "foo",
7515 src: "myprebuilt",
7516 filename_from_src: true,
7517 }
7518
7519 prebuilt_etc {
7520 name: "bar",
7521 src: "myprebuilt",
7522 filename_from_src: true,
7523 }
7524 `)
7525}
7526
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007527func TestApexUnwantedTransitiveDeps(t *testing.T) {
7528 bp := `
7529 apex {
7530 name: "myapex",
7531 key: "myapex.key",
7532 native_shared_libs: ["libfoo"],
7533 updatable: false,
7534 unwanted_transitive_deps: ["libbar"],
7535 }
7536
7537 apex_key {
7538 name: "myapex.key",
7539 public_key: "testkey.avbpubkey",
7540 private_key: "testkey.pem",
7541 }
7542
7543 cc_library {
7544 name: "libfoo",
7545 srcs: ["foo.cpp"],
7546 shared_libs: ["libbar"],
7547 apex_available: ["myapex"],
7548 }
7549
7550 cc_library {
7551 name: "libbar",
7552 srcs: ["bar.cpp"],
7553 apex_available: ["myapex"],
7554 }`
7555 ctx := testApex(t, bp)
7556 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7557 "*/libc++.so",
7558 "*/libfoo.so",
7559 // not libbar.so
7560 })
7561}
7562
Jiyong Park479321d2019-12-16 11:47:12 +09007563func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7564 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7565 apex {
7566 name: "myapex",
7567 key: "myapex.key",
7568 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007569 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007570 }
7571
7572 apex_key {
7573 name: "myapex.key",
7574 public_key: "testkey.avbpubkey",
7575 private_key: "testkey.pem",
7576 }
7577
7578 java_library {
7579 name: "myjar",
7580 srcs: ["foo/bar/MyClass.java"],
7581 sdk_version: "none",
7582 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007583 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007584 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007585 }
7586 `)
7587}
7588
Jiyong Park7afd1072019-12-30 16:56:33 +09007589func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007590 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007591 apex {
7592 name: "myapex",
7593 key: "myapex.key",
7594 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007595 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007596 }
7597
7598 apex_key {
7599 name: "myapex.key",
7600 public_key: "testkey.avbpubkey",
7601 private_key: "testkey.pem",
7602 }
7603
7604 cc_library {
7605 name: "mylib",
7606 srcs: ["mylib.cpp"],
7607 system_shared_libs: [],
7608 stl: "none",
7609 required: ["a", "b"],
7610 host_required: ["c", "d"],
7611 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007612 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007613 }
7614 `)
7615
Jooyung Hana0503a52023-08-23 13:12:50 +09007616 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007617 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007618 name := apexBundle.BaseModuleName()
7619 prefix := "TARGET_"
7620 var builder strings.Builder
7621 data.Custom(&builder, name, prefix, "", data)
7622 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007623 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007624 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7625 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007626}
7627
Jiyong Park7cd10e32020-01-14 09:22:18 +09007628func TestSymlinksFromApexToSystem(t *testing.T) {
7629 bp := `
7630 apex {
7631 name: "myapex",
7632 key: "myapex.key",
7633 native_shared_libs: ["mylib"],
7634 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007635 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007636 }
7637
Jiyong Park9d677202020-02-19 16:29:35 +09007638 apex {
7639 name: "myapex.updatable",
7640 key: "myapex.key",
7641 native_shared_libs: ["mylib"],
7642 java_libs: ["myjar"],
7643 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007644 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007645 }
7646
Jiyong Park7cd10e32020-01-14 09:22:18 +09007647 apex_key {
7648 name: "myapex.key",
7649 public_key: "testkey.avbpubkey",
7650 private_key: "testkey.pem",
7651 }
7652
7653 cc_library {
7654 name: "mylib",
7655 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007656 shared_libs: [
7657 "myotherlib",
7658 "myotherlib_ext",
7659 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007660 system_shared_libs: [],
7661 stl: "none",
7662 apex_available: [
7663 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007664 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007665 "//apex_available:platform",
7666 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007667 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007668 }
7669
7670 cc_library {
7671 name: "myotherlib",
7672 srcs: ["mylib.cpp"],
7673 system_shared_libs: [],
7674 stl: "none",
7675 apex_available: [
7676 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007677 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007678 "//apex_available:platform",
7679 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007680 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007681 }
7682
Jiyong Parkce243632023-02-17 18:22:25 +09007683 cc_library {
7684 name: "myotherlib_ext",
7685 srcs: ["mylib.cpp"],
7686 system_shared_libs: [],
7687 system_ext_specific: true,
7688 stl: "none",
7689 apex_available: [
7690 "myapex",
7691 "myapex.updatable",
7692 "//apex_available:platform",
7693 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007694 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007695 }
7696
Jiyong Park7cd10e32020-01-14 09:22:18 +09007697 java_library {
7698 name: "myjar",
7699 srcs: ["foo/bar/MyClass.java"],
7700 sdk_version: "none",
7701 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007702 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007703 apex_available: [
7704 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007705 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007706 "//apex_available:platform",
7707 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007708 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007709 }
7710
7711 java_library {
7712 name: "myotherjar",
7713 srcs: ["foo/bar/MyClass.java"],
7714 sdk_version: "none",
7715 system_modules: "none",
7716 apex_available: [
7717 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007718 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007719 "//apex_available:platform",
7720 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007721 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007722 }
7723 `
7724
7725 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7726 for _, f := range files {
7727 if f.path == file {
7728 if f.isLink {
7729 t.Errorf("%q is not a real file", file)
7730 }
7731 return
7732 }
7733 }
7734 t.Errorf("%q is not found", file)
7735 }
7736
Jiyong Parkce243632023-02-17 18:22:25 +09007737 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007738 for _, f := range files {
7739 if f.path == file {
7740 if !f.isLink {
7741 t.Errorf("%q is not a symlink", file)
7742 }
Jiyong Parkce243632023-02-17 18:22:25 +09007743 if f.src != target {
7744 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7745 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007746 return
7747 }
7748 }
7749 t.Errorf("%q is not found", file)
7750 }
7751
Jiyong Park9d677202020-02-19 16:29:35 +09007752 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7753 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007754 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007755 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007756 ensureRealfileExists(t, files, "javalib/myjar.jar")
7757 ensureRealfileExists(t, files, "lib64/mylib.so")
7758 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007759 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007760
Jooyung Hana0503a52023-08-23 13:12:50 +09007761 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007762 ensureRealfileExists(t, files, "javalib/myjar.jar")
7763 ensureRealfileExists(t, files, "lib64/mylib.so")
7764 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007765 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007766
7767 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007768 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007769 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007770 ensureRealfileExists(t, files, "javalib/myjar.jar")
7771 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007772 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7773 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007774
Jooyung Hana0503a52023-08-23 13:12:50 +09007775 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007776 ensureRealfileExists(t, files, "javalib/myjar.jar")
7777 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007778 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7779 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007780}
7781
Yo Chiange8128052020-07-23 20:09:18 +08007782func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007783 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007784 apex {
7785 name: "myapex",
7786 key: "myapex.key",
7787 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007788 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007789 }
7790
7791 apex_key {
7792 name: "myapex.key",
7793 public_key: "testkey.avbpubkey",
7794 private_key: "testkey.pem",
7795 }
7796
7797 cc_library_shared {
7798 name: "mylib",
7799 srcs: ["mylib.cpp"],
7800 shared_libs: ["myotherlib"],
7801 system_shared_libs: [],
7802 stl: "none",
7803 apex_available: [
7804 "myapex",
7805 "//apex_available:platform",
7806 ],
7807 }
7808
7809 cc_prebuilt_library_shared {
7810 name: "myotherlib",
7811 srcs: ["prebuilt.so"],
7812 system_shared_libs: [],
7813 stl: "none",
7814 apex_available: [
7815 "myapex",
7816 "//apex_available:platform",
7817 ],
7818 }
7819 `)
7820
Jooyung Hana0503a52023-08-23 13:12:50 +09007821 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007822 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007823 var builder strings.Builder
7824 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7825 androidMk := builder.String()
7826 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007827 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007828 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7829 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7830 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007831 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007832}
7833
Jooyung Han643adc42020-02-27 13:50:06 +09007834func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007835 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007836 apex {
7837 name: "myapex",
7838 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007839 binaries: ["mybin"],
7840 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007841 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007842 }
7843
7844 apex_key {
7845 name: "myapex.key",
7846 public_key: "testkey.avbpubkey",
7847 private_key: "testkey.pem",
7848 }
7849
7850 cc_library {
7851 name: "mylib",
7852 srcs: ["mylib.cpp"],
7853 shared_libs: ["mylib2"],
7854 system_shared_libs: [],
7855 stl: "none",
7856 apex_available: [ "myapex" ],
7857 }
7858
7859 cc_library {
7860 name: "mylib2",
7861 srcs: ["mylib.cpp"],
7862 system_shared_libs: [],
7863 stl: "none",
7864 apex_available: [ "myapex" ],
7865 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007866
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007867 // Used as both a JNI library and a regular shared library.
7868 cc_library {
7869 name: "mylib3",
7870 srcs: ["mylib.cpp"],
7871 system_shared_libs: [],
7872 stl: "none",
7873 apex_available: [ "myapex" ],
7874 }
7875
7876 cc_binary {
7877 name: "mybin",
7878 srcs: ["mybin.cpp"],
7879 shared_libs: ["mylib3"],
7880 system_shared_libs: [],
7881 stl: "none",
7882 apex_available: [ "myapex" ],
7883 }
7884
Jiyong Park34d5c332022-02-24 18:02:44 +09007885 rust_ffi_shared {
7886 name: "libfoo.rust",
7887 crate_name: "foo",
7888 srcs: ["foo.rs"],
7889 shared_libs: ["libfoo.shared_from_rust"],
7890 prefer_rlib: true,
7891 apex_available: ["myapex"],
7892 }
7893
7894 cc_library_shared {
7895 name: "libfoo.shared_from_rust",
7896 srcs: ["mylib.cpp"],
7897 system_shared_libs: [],
7898 stl: "none",
7899 stubs: {
7900 versions: ["10", "11", "12"],
7901 },
7902 }
7903
Jooyung Han643adc42020-02-27 13:50:06 +09007904 `)
7905
Jooyung Hana0503a52023-08-23 13:12:50 +09007906 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007907 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007908 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007909 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007910 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007911 "lib64/mylib.so",
7912 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007913 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007914 "lib64/libfoo.rust.so",
7915 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7916 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007917 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007918
7919 // b/220397949
7920 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007921}
7922
Jooyung Han49f67012020-04-17 13:43:10 +09007923func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007924 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007925 apex {
7926 name: "myapex",
7927 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007928 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007929 }
7930 apex_key {
7931 name: "myapex.key",
7932 public_key: "testkey.avbpubkey",
7933 private_key: "testkey.pem",
7934 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007935 `,
7936 android.FixtureModifyConfig(func(config android.Config) {
7937 delete(config.Targets, android.Android)
7938 config.AndroidCommonTarget = android.Target{}
7939 }),
7940 )
Jooyung Han49f67012020-04-17 13:43:10 +09007941
7942 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7943 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7944 }
7945}
7946
Jiyong Parkbd159612020-02-28 15:22:21 +09007947func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007948 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007949 apex {
7950 name: "myapex",
7951 key: "myapex.key",
7952 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007953 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007954 }
7955
7956 apex_key {
7957 name: "myapex.key",
7958 public_key: "testkey.avbpubkey",
7959 private_key: "testkey.pem",
7960 }
7961
7962 android_app {
7963 name: "AppFoo",
7964 srcs: ["foo/bar/MyClass.java"],
7965 sdk_version: "none",
7966 system_modules: "none",
7967 apex_available: [ "myapex" ],
7968 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007969 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007970
Jooyung Hana0503a52023-08-23 13:12:50 +09007971 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007972 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007973
7974 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007975 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 +09007976}
7977
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007978func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007979 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007980 apex {
7981 name: "myapex",
7982 key: "myapex.key",
7983 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007984 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007985 }
7986
7987 apex_key {
7988 name: "myapex.key",
7989 public_key: "testkey.avbpubkey",
7990 private_key: "testkey.pem",
7991 }
7992
7993 android_app_set {
7994 name: "AppSet",
7995 set: "AppSet.apks",
7996 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007997 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007998 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007999 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008000 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8001 s := mod.Rule("apexRule").Args["copy_commands"]
8002 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008003 if len(copyCmds) != 4 {
8004 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008005 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008006 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8007 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008008 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8009 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008010
8011 // Ensure that canned_fs_config has an entry for the app set zip file
8012 generateFsRule := mod.Rule("generateFsConfig")
8013 cmd := generateFsRule.RuleParams.Command
8014 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008015}
8016
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008017func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008018 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008019 apex_set {
8020 name: "myapex",
8021 filename: "foo_v2.apex",
8022 sanitized: {
8023 none: { set: "myapex.apks", },
8024 hwaddress: { set: "myapex.hwasan.apks", },
8025 },
Paul Duffin24704672021-04-06 16:09:30 +01008026 }
8027 `
8028 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008029
Paul Duffin24704672021-04-06 16:09:30 +01008030 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008031 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008032
Spandan Das9d6e2092024-09-21 02:50:00 +00008033 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008034 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008035
Paul Duffin24704672021-04-06 16:09:30 +01008036 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8037
8038 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008039 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8040 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008041
8042 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008043}
8044
Pranav Guptaeba03b02022-09-27 00:27:08 +00008045func TestApexSetApksModuleAssignment(t *testing.T) {
8046 ctx := testApex(t, `
8047 apex_set {
8048 name: "myapex",
8049 set: ":myapex_apks_file",
8050 }
8051
8052 filegroup {
8053 name: "myapex_apks_file",
8054 srcs: ["myapex.apks"],
8055 }
8056 `)
8057
Spandan Das9d6e2092024-09-21 02:50:00 +00008058 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008059
8060 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008061 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008062 extractedApex := m.Output(extractorOutput)
8063
8064 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8065}
8066
Paul Duffin89f570a2021-06-16 01:42:33 +01008067func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008068 t.Helper()
8069
Paul Duffin55607122021-03-30 23:32:51 +01008070 fs := android.MockFS{
8071 "a.java": nil,
8072 "a.jar": nil,
8073 "apex_manifest.json": nil,
8074 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008075 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008076 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8077 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8078 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008079 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008080 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008081
Paul Duffin55607122021-03-30 23:32:51 +01008082 errorHandler := android.FixtureExpectsNoErrors
8083 if errmsg != "" {
8084 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008085 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008086
Paul Duffin55607122021-03-30 23:32:51 +01008087 result := android.GroupFixturePreparers(
8088 cc.PrepareForTestWithCcDefaultModules,
8089 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008090 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008091 java.PrepareForTestWithJavaSdkLibraryFiles,
8092 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008093 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008094 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008095 android.FixtureModifyMockFS(func(fs android.MockFS) {
8096 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8097 insert := ""
8098 for _, fragment := range fragments {
8099 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8100 }
8101 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8102 platform_bootclasspath {
8103 name: "platform-bootclasspath",
8104 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008105 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008106 %s
8107 ],
8108 }
8109 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008110 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008111 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008112 // Dexpreopt for boot jars requires the ART boot image profile.
8113 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8114 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008115 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008116 ).
8117 ExtendWithErrorHandler(errorHandler).
8118 RunTestWithBp(t, bp)
8119
8120 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008121}
8122
Jooyung Han548640b2020-04-27 12:10:30 +09008123func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8124 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8125 apex {
8126 name: "myapex",
8127 key: "myapex.key",
8128 updatable: true,
8129 }
8130
8131 apex_key {
8132 name: "myapex.key",
8133 public_key: "testkey.avbpubkey",
8134 private_key: "testkey.pem",
8135 }
8136 `)
8137}
8138
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008139func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8140 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8141 apex {
8142 name: "myapex",
8143 key: "myapex.key",
8144 }
8145
8146 apex_key {
8147 name: "myapex.key",
8148 public_key: "testkey.avbpubkey",
8149 private_key: "testkey.pem",
8150 }
8151 `)
8152}
8153
satayevb98371c2021-06-15 16:49:50 +01008154func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8155 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8156 apex {
8157 name: "myapex",
8158 key: "myapex.key",
8159 systemserverclasspath_fragments: [
8160 "mysystemserverclasspathfragment",
8161 ],
8162 min_sdk_version: "29",
8163 updatable: true,
8164 }
8165
8166 apex_key {
8167 name: "myapex.key",
8168 public_key: "testkey.avbpubkey",
8169 private_key: "testkey.pem",
8170 }
8171
8172 java_library {
8173 name: "foo",
8174 srcs: ["b.java"],
8175 min_sdk_version: "29",
8176 installable: true,
8177 apex_available: [
8178 "myapex",
8179 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008180 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008181 }
8182
8183 systemserverclasspath_fragment {
8184 name: "mysystemserverclasspathfragment",
8185 generate_classpaths_proto: false,
8186 contents: [
8187 "foo",
8188 ],
8189 apex_available: [
8190 "myapex",
8191 ],
8192 }
satayevabcd5972021-08-06 17:49:46 +01008193 `,
8194 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8195 )
satayevb98371c2021-06-15 16:49:50 +01008196}
8197
Paul Duffin064b70c2020-11-02 17:32:38 +00008198func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008199 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008200 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008201 fragment := java.ApexVariantReference{
8202 Apex: proptools.StringPtr("myapex"),
8203 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8204 }
8205
Paul Duffin064b70c2020-11-02 17:32:38 +00008206 testDexpreoptWithApexes(t, `
8207 prebuilt_apex {
8208 name: "myapex" ,
8209 arch: {
8210 arm64: {
8211 src: "myapex-arm64.apex",
8212 },
8213 arm: {
8214 src: "myapex-arm.apex",
8215 },
8216 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008217 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8218 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008219
Paul Duffin89f570a2021-06-16 01:42:33 +01008220 prebuilt_bootclasspath_fragment {
8221 name: "my-bootclasspath-fragment",
8222 contents: ["libfoo"],
8223 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008224 hidden_api: {
8225 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8226 metadata: "my-bootclasspath-fragment/metadata.csv",
8227 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008228 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8229 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8230 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008231 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008232 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008233
Spandan Das52c01a12024-09-20 01:09:48 +00008234 java_sdk_library_import {
8235 name: "libfoo",
8236 prefer: true,
8237 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008238 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008239 },
8240 apex_available: ["myapex"],
8241 shared_library: false,
8242 permitted_packages: ["libfoo"],
8243 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008244 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008245 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008246}
8247
Spandan Dasf14e2542021-11-12 00:01:37 +00008248func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008249 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008250 bp += `
8251 apex_key {
8252 name: "myapex.key",
8253 public_key: "testkey.avbpubkey",
8254 private_key: "testkey.pem",
8255 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008256 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008257 "lib1/src/A.java": nil,
8258 "lib2/src/B.java": nil,
8259 "system/sepolicy/apex/myapex-file_contexts": nil,
8260 }
8261
Paul Duffin45338f02021-03-30 23:07:52 +01008262 errorHandler := android.FixtureExpectsNoErrors
8263 if errmsg != "" {
8264 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008265 }
Colin Crossae8600b2020-10-29 17:09:13 -07008266
Paul Duffin45338f02021-03-30 23:07:52 +01008267 android.GroupFixturePreparers(
8268 android.PrepareForTestWithAndroidBuildComponents,
8269 java.PrepareForTestWithJavaBuildComponents,
8270 PrepareForTestWithApexBuildComponents,
8271 android.PrepareForTestWithNeverallowRules(rules),
8272 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008273 apexBootJars := make([]string, 0, len(bootJars))
8274 for _, apexBootJar := range bootJars {
8275 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008276 }
satayevd604b212021-07-21 14:23:52 +01008277 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008278 }),
8279 fs.AddToFixture(),
8280 ).
8281 ExtendWithErrorHandler(errorHandler).
8282 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008283}
8284
8285func TestApexPermittedPackagesRules(t *testing.T) {
8286 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008287 name string
8288 expectedError string
8289 bp string
8290 bootJars []string
8291 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008292 }{
8293
8294 {
8295 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8296 expectedError: "",
8297 bp: `
8298 java_library {
8299 name: "bcp_lib1",
8300 srcs: ["lib1/src/*.java"],
8301 permitted_packages: ["foo.bar"],
8302 apex_available: ["myapex"],
8303 sdk_version: "none",
8304 system_modules: "none",
8305 }
8306 java_library {
8307 name: "nonbcp_lib2",
8308 srcs: ["lib2/src/*.java"],
8309 apex_available: ["myapex"],
8310 permitted_packages: ["a.b"],
8311 sdk_version: "none",
8312 system_modules: "none",
8313 }
8314 apex {
8315 name: "myapex",
8316 key: "myapex.key",
8317 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008318 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008319 }`,
8320 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008321 bcpPermittedPackages: map[string][]string{
8322 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008323 "foo.bar",
8324 },
8325 },
8326 },
8327 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008328 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008329 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 +01008330 bp: `
8331 java_library {
8332 name: "bcp_lib1",
8333 srcs: ["lib1/src/*.java"],
8334 apex_available: ["myapex"],
8335 permitted_packages: ["foo.bar"],
8336 sdk_version: "none",
8337 system_modules: "none",
8338 }
8339 java_library {
8340 name: "bcp_lib2",
8341 srcs: ["lib2/src/*.java"],
8342 apex_available: ["myapex"],
8343 permitted_packages: ["foo.bar", "bar.baz"],
8344 sdk_version: "none",
8345 system_modules: "none",
8346 }
8347 apex {
8348 name: "myapex",
8349 key: "myapex.key",
8350 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008351 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008352 }
8353 `,
8354 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008355 bcpPermittedPackages: map[string][]string{
8356 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008357 "foo.bar",
8358 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008359 "bcp_lib2": []string{
8360 "foo.bar",
8361 },
8362 },
8363 },
8364 {
8365 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8366 expectedError: "",
8367 bp: `
8368 java_library {
8369 name: "bcp_lib_restricted",
8370 srcs: ["lib1/src/*.java"],
8371 apex_available: ["myapex"],
8372 permitted_packages: ["foo.bar"],
8373 sdk_version: "none",
8374 min_sdk_version: "29",
8375 system_modules: "none",
8376 }
8377 java_library {
8378 name: "bcp_lib_unrestricted",
8379 srcs: ["lib2/src/*.java"],
8380 apex_available: ["myapex"],
8381 permitted_packages: ["foo.bar", "bar.baz"],
8382 sdk_version: "none",
8383 min_sdk_version: "29",
8384 system_modules: "none",
8385 }
8386 apex {
8387 name: "myapex",
8388 key: "myapex.key",
8389 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8390 updatable: true,
8391 min_sdk_version: "29",
8392 }
8393 `,
8394 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8395 bcpPermittedPackages: map[string][]string{
8396 "bcp_lib1_non_updateable": []string{
8397 "foo.bar",
8398 },
8399 // 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 +01008400 },
8401 },
8402 }
8403 for _, tc := range testcases {
8404 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008405 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8406 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008407 })
8408 }
8409}
8410
Jiyong Park62304bb2020-04-13 16:19:48 +09008411func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008412 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008413 apex {
8414 name: "myapex",
8415 key: "myapex.key",
8416 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008417 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008418 }
8419
8420 apex_key {
8421 name: "myapex.key",
8422 public_key: "testkey.avbpubkey",
8423 private_key: "testkey.pem",
8424 }
8425
8426 cc_library {
8427 name: "mylib",
8428 srcs: ["mylib.cpp"],
8429 system_shared_libs: [],
8430 stl: "none",
8431 stubs: {
8432 versions: ["1"],
8433 },
8434 apex_available: ["myapex"],
8435 }
8436
8437 cc_library {
8438 name: "myprivlib",
8439 srcs: ["mylib.cpp"],
8440 system_shared_libs: [],
8441 stl: "none",
8442 apex_available: ["myapex"],
8443 }
8444
8445
8446 cc_test {
8447 name: "mytest",
8448 gtest: false,
8449 srcs: ["mylib.cpp"],
8450 system_shared_libs: [],
8451 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008452 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008453 test_for: ["myapex"]
8454 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008455
8456 cc_library {
8457 name: "mytestlib",
8458 srcs: ["mylib.cpp"],
8459 system_shared_libs: [],
8460 shared_libs: ["mylib", "myprivlib"],
8461 stl: "none",
8462 test_for: ["myapex"],
8463 }
8464
8465 cc_benchmark {
8466 name: "mybench",
8467 srcs: ["mylib.cpp"],
8468 system_shared_libs: [],
8469 shared_libs: ["mylib", "myprivlib"],
8470 stl: "none",
8471 test_for: ["myapex"],
8472 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008473 `)
8474
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008475 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008476 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008477 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8478 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8479 }
8480
8481 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008482 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008483 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8484 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8485 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8486}
Jiyong Park46a512f2020-12-04 18:02:13 +09008487
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008488func TestIndirectTestFor(t *testing.T) {
8489 ctx := testApex(t, `
8490 apex {
8491 name: "myapex",
8492 key: "myapex.key",
8493 native_shared_libs: ["mylib", "myprivlib"],
8494 updatable: false,
8495 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008496
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008497 apex_key {
8498 name: "myapex.key",
8499 public_key: "testkey.avbpubkey",
8500 private_key: "testkey.pem",
8501 }
8502
8503 cc_library {
8504 name: "mylib",
8505 srcs: ["mylib.cpp"],
8506 system_shared_libs: [],
8507 stl: "none",
8508 stubs: {
8509 versions: ["1"],
8510 },
8511 apex_available: ["myapex"],
8512 }
8513
8514 cc_library {
8515 name: "myprivlib",
8516 srcs: ["mylib.cpp"],
8517 system_shared_libs: [],
8518 stl: "none",
8519 shared_libs: ["mylib"],
8520 apex_available: ["myapex"],
8521 }
8522
8523 cc_library {
8524 name: "mytestlib",
8525 srcs: ["mylib.cpp"],
8526 system_shared_libs: [],
8527 shared_libs: ["myprivlib"],
8528 stl: "none",
8529 test_for: ["myapex"],
8530 }
8531 `)
8532
8533 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008534 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008535 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8536 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8537 }
8538
8539 // The platform variant of mytestlib links to the platform variant of the
8540 // internal myprivlib.
8541 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8542
8543 // The platform variant of myprivlib links to the platform variant of mylib
8544 // and bypasses its stubs.
8545 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 +09008546}
8547
Martin Stjernholmec009002021-03-27 15:18:31 +00008548func TestTestForForLibInOtherApex(t *testing.T) {
8549 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8550 _ = testApex(t, `
8551 apex {
8552 name: "com.android.art",
8553 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008554 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008555 updatable: false,
8556 }
8557
8558 apex {
8559 name: "com.android.art.debug",
8560 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008561 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008562 updatable: false,
8563 }
8564
8565 apex_key {
8566 name: "myapex.key",
8567 public_key: "testkey.avbpubkey",
8568 private_key: "testkey.pem",
8569 }
8570
8571 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008572 name: "libnativebridge",
8573 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008574 system_shared_libs: [],
8575 stl: "none",
8576 stubs: {
8577 versions: ["1"],
8578 },
8579 apex_available: ["com.android.art", "com.android.art.debug"],
8580 }
8581
8582 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008583 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008584 srcs: ["mylib.cpp"],
8585 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008586 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008587 stl: "none",
8588 apex_available: ["com.android.art.debug"],
8589 test_for: ["com.android.art"],
8590 }
8591 `,
8592 android.MockFS{
8593 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8594 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8595 }.AddToFixture())
8596}
8597
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008598// TODO(jungjw): Move this to proptools
8599func intPtr(i int) *int {
8600 return &i
8601}
8602
8603func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008604 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008605 apex_set {
8606 name: "myapex",
8607 set: "myapex.apks",
8608 filename: "foo_v2.apex",
8609 overrides: ["foo"],
8610 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008611 `,
8612 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8613 variables.Platform_sdk_version = intPtr(30)
8614 }),
8615 android.FixtureModifyConfig(func(config android.Config) {
8616 config.Targets[android.Android] = []android.Target{
8617 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8618 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8619 }
8620 }),
8621 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008622
Spandan Das9d6e2092024-09-21 02:50:00 +00008623 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008624
8625 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008626 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008627 actual := extractedApex.Args["abis"]
8628 expected := "ARMEABI_V7A,ARM64_V8A"
8629 if actual != expected {
8630 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8631 }
8632 actual = extractedApex.Args["sdk-version"]
8633 expected = "30"
8634 if actual != expected {
8635 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8636 }
8637
Paul Duffin6717d882021-06-15 19:09:41 +01008638 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008639 a := m.Module().(*ApexSet)
8640 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008641 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008642 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8643 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8644 }
8645}
8646
Anton Hansson805e0a52022-11-25 14:06:46 +00008647func TestApexSet_NativeBridge(t *testing.T) {
8648 ctx := testApex(t, `
8649 apex_set {
8650 name: "myapex",
8651 set: "myapex.apks",
8652 filename: "foo_v2.apex",
8653 overrides: ["foo"],
8654 }
8655 `,
8656 android.FixtureModifyConfig(func(config android.Config) {
8657 config.Targets[android.Android] = []android.Target{
8658 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8659 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8660 }
8661 }),
8662 )
8663
Spandan Das9d6e2092024-09-21 02:50:00 +00008664 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008665
8666 // Check extract_apks tool parameters. No native bridge arch expected
8667 extractedApex := m.Output("extracted/myapex.apks")
8668 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8669}
8670
Jiyong Park7d95a512020-05-10 15:16:24 +09008671func TestNoStaticLinkingToStubsLib(t *testing.T) {
8672 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8673 apex {
8674 name: "myapex",
8675 key: "myapex.key",
8676 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008677 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008678 }
8679
8680 apex_key {
8681 name: "myapex.key",
8682 public_key: "testkey.avbpubkey",
8683 private_key: "testkey.pem",
8684 }
8685
8686 cc_library {
8687 name: "mylib",
8688 srcs: ["mylib.cpp"],
8689 static_libs: ["otherlib"],
8690 system_shared_libs: [],
8691 stl: "none",
8692 apex_available: [ "myapex" ],
8693 }
8694
8695 cc_library {
8696 name: "otherlib",
8697 srcs: ["mylib.cpp"],
8698 system_shared_libs: [],
8699 stl: "none",
8700 stubs: {
8701 versions: ["1", "2", "3"],
8702 },
8703 apex_available: [ "myapex" ],
8704 }
8705 `)
8706}
8707
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008708func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008709 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008710 apex {
8711 name: "myapex",
8712 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008713 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008714 custom_sign_tool: "sign_myapex",
8715 }
8716
8717 apex_key {
8718 name: "myapex.key",
8719 public_key: "testkey.avbpubkey",
8720 private_key: "testkey.pem",
8721 }
8722 `)
8723
Jooyung Han286957d2023-10-30 16:17:56 +09008724 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008725 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008726 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 +09008727}
8728
8729func TestApexKeysTxtOverrides(t *testing.T) {
8730 ctx := testApex(t, `
8731 apex {
8732 name: "myapex",
8733 key: "myapex.key",
8734 updatable: false,
8735 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008736 }
8737
8738 apex_key {
8739 name: "myapex.key",
8740 public_key: "testkey.avbpubkey",
8741 private_key: "testkey.pem",
8742 }
8743
8744 prebuilt_apex {
8745 name: "myapex",
8746 prefer: true,
8747 arch: {
8748 arm64: {
8749 src: "myapex-arm64.apex",
8750 },
8751 arm: {
8752 src: "myapex-arm.apex",
8753 },
8754 },
8755 }
8756
8757 apex_set {
8758 name: "myapex_set",
8759 set: "myapex.apks",
8760 filename: "myapex_set.apex",
8761 overrides: ["myapex"],
8762 }
8763 `)
8764
Colin Crossf61d03d2023-11-02 16:56:39 -07008765 content := android.ContentFromFileRuleForTests(t, ctx,
8766 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008767 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 -07008768 content = android.ContentFromFileRuleForTests(t, ctx,
8769 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008770 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 +09008771}
8772
Jooyung Han938b5932020-06-20 12:47:47 +09008773func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008774 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008775 apex {
8776 name: "myapex",
8777 key: "myapex.key",
8778 apps: ["app"],
8779 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008780 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008781 }
8782
8783 apex_key {
8784 name: "myapex.key",
8785 public_key: "testkey.avbpubkey",
8786 private_key: "testkey.pem",
8787 }
8788
8789 android_app {
8790 name: "app",
8791 srcs: ["foo/bar/MyClass.java"],
8792 package_name: "foo",
8793 sdk_version: "none",
8794 system_modules: "none",
8795 apex_available: [ "myapex" ],
8796 }
8797 `, withFiles(map[string][]byte{
8798 "sub/Android.bp": []byte(`
8799 override_apex {
8800 name: "override_myapex",
8801 base: "myapex",
8802 apps: ["override_app"],
8803 allowed_files: ":allowed",
8804 }
8805 // Overridable "path" property should be referenced indirectly
8806 filegroup {
8807 name: "allowed",
8808 srcs: ["allowed.txt"],
8809 }
8810 override_android_app {
8811 name: "override_app",
8812 base: "app",
8813 package_name: "bar",
8814 }
8815 `),
8816 }))
8817
Jooyung Hana0503a52023-08-23 13:12:50 +09008818 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008819 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8820 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8821 }
8822
Spandan Das50801e22024-05-13 18:29:45 +00008823 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008824 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8825 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8826 }
8827}
8828
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008829func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008830 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008831 apex {
8832 name: "myapex",
8833 key: "myapex.key",
8834 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008835 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008836 }
8837
8838 apex_key {
8839 name: "myapex.key",
8840 public_key: "testkey.avbpubkey",
8841 private_key: "testkey.pem",
8842 }
8843
8844 cc_library {
8845 name: "mylib",
8846 srcs: ["mylib.cpp"],
8847 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008848 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008849 },
8850 apex_available: ["myapex"],
8851 }
8852
8853 cc_prebuilt_library_shared {
8854 name: "mylib",
8855 prefer: false,
8856 srcs: ["prebuilt.so"],
8857 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008858 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008859 },
8860 apex_available: ["myapex"],
8861 }
8862 `)
8863}
8864
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008865func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008866 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008867 apex {
8868 name: "myapex",
8869 key: "myapex.key",
8870 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008871 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008872 }
8873 apex_key {
8874 name: "myapex.key",
8875 public_key: "testkey.avbpubkey",
8876 private_key: "testkey.pem",
8877 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008878 `,
8879 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8880 variables.CompressedApex = proptools.BoolPtr(true)
8881 }),
8882 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008883
Jooyung Hana0503a52023-08-23 13:12:50 +09008884 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008885 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8886
Jooyung Hana0503a52023-08-23 13:12:50 +09008887 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008888 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8889
8890 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008891 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008892 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8893
8894 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008895 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008896 var builder strings.Builder
8897 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8898 androidMk := builder.String()
8899 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8900}
8901
Jooyung Han26ec8482024-07-31 15:04:05 +09008902func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8903 for _, compressionEnabled := range []bool{true, false} {
8904 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8905 ctx := testApex(t, `
8906 apex_set {
8907 name: "com.company.android.myapex",
8908 apex_name: "com.android.myapex",
8909 set: "company-myapex.apks",
8910 }
8911 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8912 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8913 }),
8914 )
8915
8916 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8917 if compressionEnabled {
8918 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8919 } else {
8920 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8921 }
8922 })
8923 }
8924}
8925
Martin Stjernholm2856c662020-12-02 15:03:42 +00008926func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008927 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008928 apex {
8929 name: "myapex",
8930 key: "myapex.key",
8931 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008932 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008933 }
8934
8935 apex_key {
8936 name: "myapex.key",
8937 public_key: "testkey.avbpubkey",
8938 private_key: "testkey.pem",
8939 }
8940
8941 cc_library {
8942 name: "mylib",
8943 srcs: ["mylib.cpp"],
8944 apex_available: ["myapex"],
8945 shared_libs: ["otherlib"],
8946 system_shared_libs: [],
8947 }
8948
8949 cc_library {
8950 name: "otherlib",
8951 srcs: ["mylib.cpp"],
8952 stubs: {
8953 versions: ["current"],
8954 },
8955 }
8956
8957 cc_prebuilt_library_shared {
8958 name: "otherlib",
8959 prefer: true,
8960 srcs: ["prebuilt.so"],
8961 stubs: {
8962 versions: ["current"],
8963 },
8964 }
8965 `)
8966
Jooyung Hana0503a52023-08-23 13:12:50 +09008967 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008968 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008969 var builder strings.Builder
8970 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8971 androidMk := builder.String()
8972
8973 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8974 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008975 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00008976}
8977
Jiyong Parke3867542020-12-03 17:28:25 +09008978func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008979 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008980 apex {
8981 name: "myapex",
8982 key: "myapex.key",
8983 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008984 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008985 }
8986
8987 apex_key {
8988 name: "myapex.key",
8989 public_key: "testkey.avbpubkey",
8990 private_key: "testkey.pem",
8991 }
8992
8993 cc_library {
8994 name: "mylib",
8995 srcs: ["mylib.cpp"],
8996 system_shared_libs: [],
8997 stl: "none",
8998 apex_available: ["myapex"],
8999 shared_libs: ["mylib2"],
9000 target: {
9001 apex: {
9002 exclude_shared_libs: ["mylib2"],
9003 },
9004 },
9005 }
9006
9007 cc_library {
9008 name: "mylib2",
9009 srcs: ["mylib.cpp"],
9010 system_shared_libs: [],
9011 stl: "none",
9012 }
9013 `)
9014
9015 // Check if mylib is linked to mylib2 for the non-apex target
9016 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9017 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9018
9019 // Make sure that the link doesn't occur for the apex target
9020 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9021 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9022
9023 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009024 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009025 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9026}
9027
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009028func TestPrebuiltStubLibDep(t *testing.T) {
9029 bpBase := `
9030 apex {
9031 name: "myapex",
9032 key: "myapex.key",
9033 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009034 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009035 }
9036 apex_key {
9037 name: "myapex.key",
9038 public_key: "testkey.avbpubkey",
9039 private_key: "testkey.pem",
9040 }
9041 cc_library {
9042 name: "mylib",
9043 srcs: ["mylib.cpp"],
9044 apex_available: ["myapex"],
9045 shared_libs: ["stublib"],
9046 system_shared_libs: [],
9047 }
9048 apex {
9049 name: "otherapex",
9050 enabled: %s,
9051 key: "myapex.key",
9052 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009053 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009054 }
9055 `
9056
9057 stublibSourceBp := `
9058 cc_library {
9059 name: "stublib",
9060 srcs: ["mylib.cpp"],
9061 apex_available: ["otherapex"],
9062 system_shared_libs: [],
9063 stl: "none",
9064 stubs: {
9065 versions: ["1"],
9066 },
9067 }
9068 `
9069
9070 stublibPrebuiltBp := `
9071 cc_prebuilt_library_shared {
9072 name: "stublib",
9073 srcs: ["prebuilt.so"],
9074 apex_available: ["otherapex"],
9075 stubs: {
9076 versions: ["1"],
9077 },
9078 %s
9079 }
9080 `
9081
9082 tests := []struct {
9083 name string
9084 stublibBp string
9085 usePrebuilt bool
9086 modNames []string // Modules to collect AndroidMkEntries for
9087 otherApexEnabled []string
9088 }{
9089 {
9090 name: "only_source",
9091 stublibBp: stublibSourceBp,
9092 usePrebuilt: false,
9093 modNames: []string{"stublib"},
9094 otherApexEnabled: []string{"true", "false"},
9095 },
9096 {
9097 name: "source_preferred",
9098 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9099 usePrebuilt: false,
9100 modNames: []string{"stublib", "prebuilt_stublib"},
9101 otherApexEnabled: []string{"true", "false"},
9102 },
9103 {
9104 name: "prebuilt_preferred",
9105 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9106 usePrebuilt: true,
9107 modNames: []string{"stublib", "prebuilt_stublib"},
9108 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9109 },
9110 {
9111 name: "only_prebuilt",
9112 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9113 usePrebuilt: true,
9114 modNames: []string{"stublib"},
9115 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9116 },
9117 }
9118
9119 for _, test := range tests {
9120 t.Run(test.name, func(t *testing.T) {
9121 for _, otherApexEnabled := range test.otherApexEnabled {
9122 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009123 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009124
9125 type modAndMkEntries struct {
9126 mod *cc.Module
9127 mkEntries android.AndroidMkEntries
9128 }
9129 entries := []*modAndMkEntries{}
9130
9131 // Gather shared lib modules that are installable
9132 for _, modName := range test.modNames {
9133 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9134 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9135 continue
9136 }
9137 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009138 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009139 continue
9140 }
Colin Crossaa255532020-07-03 13:18:24 -07009141 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009142 if ent.Disabled {
9143 continue
9144 }
9145 entries = append(entries, &modAndMkEntries{
9146 mod: mod,
9147 mkEntries: ent,
9148 })
9149 }
9150 }
9151 }
9152
9153 var entry *modAndMkEntries = nil
9154 for _, ent := range entries {
9155 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9156 if entry != nil {
9157 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9158 } else {
9159 entry = ent
9160 }
9161 }
9162 }
9163
9164 if entry == nil {
9165 t.Errorf("AndroidMk entry for \"stublib\" missing")
9166 } else {
9167 isPrebuilt := entry.mod.Prebuilt() != nil
9168 if isPrebuilt != test.usePrebuilt {
9169 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9170 }
9171 if !entry.mod.IsStubs() {
9172 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9173 }
9174 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9175 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9176 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009177 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009178 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009179 if !android.InList(expected, cflags) {
9180 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9181 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009182 }
9183 })
9184 }
9185 })
9186 }
9187}
9188
Colin Crossc33e5212021-05-25 18:16:02 -07009189func TestApexJavaCoverage(t *testing.T) {
9190 bp := `
9191 apex {
9192 name: "myapex",
9193 key: "myapex.key",
9194 java_libs: ["mylib"],
9195 bootclasspath_fragments: ["mybootclasspathfragment"],
9196 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9197 updatable: false,
9198 }
9199
9200 apex_key {
9201 name: "myapex.key",
9202 public_key: "testkey.avbpubkey",
9203 private_key: "testkey.pem",
9204 }
9205
9206 java_library {
9207 name: "mylib",
9208 srcs: ["mylib.java"],
9209 apex_available: ["myapex"],
9210 compile_dex: true,
9211 }
9212
9213 bootclasspath_fragment {
9214 name: "mybootclasspathfragment",
9215 contents: ["mybootclasspathlib"],
9216 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009217 hidden_api: {
9218 split_packages: ["*"],
9219 },
Colin Crossc33e5212021-05-25 18:16:02 -07009220 }
9221
9222 java_library {
9223 name: "mybootclasspathlib",
9224 srcs: ["mybootclasspathlib.java"],
9225 apex_available: ["myapex"],
9226 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009227 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009228 }
9229
9230 systemserverclasspath_fragment {
9231 name: "mysystemserverclasspathfragment",
9232 contents: ["mysystemserverclasspathlib"],
9233 apex_available: ["myapex"],
9234 }
9235
9236 java_library {
9237 name: "mysystemserverclasspathlib",
9238 srcs: ["mysystemserverclasspathlib.java"],
9239 apex_available: ["myapex"],
9240 compile_dex: true,
9241 }
9242 `
9243
9244 result := android.GroupFixturePreparers(
9245 PrepareForTestWithApexBuildComponents,
9246 prepareForTestWithMyapex,
9247 java.PrepareForTestWithJavaDefaultModules,
9248 android.PrepareForTestWithAndroidBuildComponents,
9249 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009250 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9251 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009252 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009253 ).RunTest(t)
9254
9255 // Make sure jacoco ran on both mylib and mybootclasspathlib
9256 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9257 t.Errorf("Failed to find jacoco rule for mylib")
9258 }
9259 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9260 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9261 }
9262 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9263 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9264 }
9265}
9266
Jiyong Park192600a2021-08-03 07:52:17 +00009267func TestProhibitStaticExecutable(t *testing.T) {
9268 testApexError(t, `executable mybin is static`, `
9269 apex {
9270 name: "myapex",
9271 key: "myapex.key",
9272 binaries: ["mybin"],
9273 min_sdk_version: "29",
9274 }
9275
9276 apex_key {
9277 name: "myapex.key",
9278 public_key: "testkey.avbpubkey",
9279 private_key: "testkey.pem",
9280 }
9281
9282 cc_binary {
9283 name: "mybin",
9284 srcs: ["mylib.cpp"],
9285 relative_install_path: "foo/bar",
9286 static_executable: true,
9287 system_shared_libs: [],
9288 stl: "none",
9289 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009290 min_sdk_version: "29",
9291 }
9292 `)
9293
9294 testApexError(t, `executable mybin.rust is static`, `
9295 apex {
9296 name: "myapex",
9297 key: "myapex.key",
9298 binaries: ["mybin.rust"],
9299 min_sdk_version: "29",
9300 }
9301
9302 apex_key {
9303 name: "myapex.key",
9304 public_key: "testkey.avbpubkey",
9305 private_key: "testkey.pem",
9306 }
9307
9308 rust_binary {
9309 name: "mybin.rust",
9310 srcs: ["foo.rs"],
9311 static_executable: true,
9312 apex_available: ["myapex"],
9313 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009314 }
9315 `)
9316}
9317
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009318func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9319 ctx := testApex(t, `
9320 apex {
9321 name: "myapex",
9322 key: "myapex.key",
9323 updatable: false,
9324 java_libs: ["foo"],
9325 }
9326
9327 apex_key {
9328 name: "myapex.key",
9329 public_key: "testkey.avbpubkey",
9330 private_key: "testkey.pem",
9331 }
9332
9333 java_library {
9334 name: "foo",
9335 srcs: ["foo.java"],
9336 apex_available: ["myapex"],
9337 installable: true,
9338 }
9339 `,
9340 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9341 )
9342
Jooyung Hana0503a52023-08-23 13:12:50 +09009343 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009344 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9345 var builder strings.Builder
9346 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9347 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009348 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 +00009349}
9350
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009351func TestAndroidMk_RequiredModules(t *testing.T) {
9352 ctx := testApex(t, `
9353 apex {
9354 name: "myapex",
9355 key: "myapex.key",
9356 updatable: false,
9357 java_libs: ["foo"],
9358 required: ["otherapex"],
9359 }
9360
9361 apex {
9362 name: "otherapex",
9363 key: "myapex.key",
9364 updatable: false,
9365 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009366 }
9367
9368 apex_key {
9369 name: "myapex.key",
9370 public_key: "testkey.avbpubkey",
9371 private_key: "testkey.pem",
9372 }
9373
9374 java_library {
9375 name: "foo",
9376 srcs: ["foo.java"],
9377 apex_available: ["myapex", "otherapex"],
9378 installable: true,
9379 }
9380 `)
9381
Jooyung Hana0503a52023-08-23 13:12:50 +09009382 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009383 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9384 var builder strings.Builder
9385 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9386 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009387 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009388}
9389
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009390func TestAndroidMk_RequiredDeps(t *testing.T) {
9391 ctx := testApex(t, `
9392 apex {
9393 name: "myapex",
9394 key: "myapex.key",
9395 updatable: false,
9396 }
9397
9398 apex_key {
9399 name: "myapex.key",
9400 public_key: "testkey.avbpubkey",
9401 private_key: "testkey.pem",
9402 }
9403 `)
9404
Jooyung Hana0503a52023-08-23 13:12:50 +09009405 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009406 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009407 data := android.AndroidMkDataForTest(t, ctx, bundle)
9408 var builder strings.Builder
9409 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9410 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009411 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009412}
9413
Jooyung Hana6d36672022-02-24 13:58:07 +09009414func TestApexOutputFileProducer(t *testing.T) {
9415 for _, tc := range []struct {
9416 name string
9417 ref string
9418 expected_data []string
9419 }{
9420 {
9421 name: "test_using_output",
9422 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009423 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009424 },
9425 {
9426 name: "test_using_apex",
9427 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009428 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009429 },
9430 } {
9431 t.Run(tc.name, func(t *testing.T) {
9432 ctx := testApex(t, `
9433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 compressible: true,
9437 updatable: false,
9438 }
9439
9440 apex_key {
9441 name: "myapex.key",
9442 public_key: "testkey.avbpubkey",
9443 private_key: "testkey.pem",
9444 }
9445
9446 java_test {
9447 name: "`+tc.name+`",
9448 srcs: ["a.java"],
9449 data: ["`+tc.ref+`"],
9450 }
9451 `,
9452 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9453 variables.CompressedApex = proptools.BoolPtr(true)
9454 }))
9455 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9456 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9457 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9458 })
9459 }
9460}
9461
satayev758968a2021-12-06 11:42:40 +00009462func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9463 preparer := android.GroupFixturePreparers(
9464 PrepareForTestWithApexBuildComponents,
9465 prepareForTestWithMyapex,
9466 java.PrepareForTestWithJavaSdkLibraryFiles,
9467 java.PrepareForTestWithJavaDefaultModules,
9468 android.PrepareForTestWithAndroidBuildComponents,
9469 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9470 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9471 )
9472
9473 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9474 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9475 preparer.RunTestWithBp(t, `
9476 apex {
9477 name: "myapex",
9478 key: "myapex.key",
9479 bootclasspath_fragments: ["mybootclasspathfragment"],
9480 min_sdk_version: "30",
9481 updatable: false,
9482 }
9483
9484 apex_key {
9485 name: "myapex.key",
9486 public_key: "testkey.avbpubkey",
9487 private_key: "testkey.pem",
9488 }
9489
9490 bootclasspath_fragment {
9491 name: "mybootclasspathfragment",
9492 contents: ["mybootclasspathlib"],
9493 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009494 hidden_api: {
9495 split_packages: ["*"],
9496 },
satayev758968a2021-12-06 11:42:40 +00009497 }
9498
9499 java_sdk_library {
9500 name: "mybootclasspathlib",
9501 srcs: ["mybootclasspathlib.java"],
9502 apex_available: ["myapex"],
9503 compile_dex: true,
9504 unsafe_ignore_missing_latest_api: true,
9505 min_sdk_version: "31",
9506 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009507 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009508 }
9509
9510 java_library {
9511 name: "util",
9512 srcs: ["a.java"],
9513 apex_available: ["myapex"],
9514 min_sdk_version: "31",
9515 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009516 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009517 }
9518
9519 java_library {
9520 name: "another_util",
9521 srcs: ["a.java"],
9522 min_sdk_version: "31",
9523 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009524 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009525 }
9526 `)
9527 })
9528
9529 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9530 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9531 preparer.RunTestWithBp(t, `
9532 apex {
9533 name: "myapex",
9534 key: "myapex.key",
9535 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9536 min_sdk_version: "30",
9537 updatable: false,
9538 }
9539
9540 apex_key {
9541 name: "myapex.key",
9542 public_key: "testkey.avbpubkey",
9543 private_key: "testkey.pem",
9544 }
9545
9546 systemserverclasspath_fragment {
9547 name: "mysystemserverclasspathfragment",
9548 contents: ["mysystemserverclasspathlib"],
9549 apex_available: ["myapex"],
9550 }
9551
9552 java_sdk_library {
9553 name: "mysystemserverclasspathlib",
9554 srcs: ["mysystemserverclasspathlib.java"],
9555 apex_available: ["myapex"],
9556 compile_dex: true,
9557 min_sdk_version: "32",
9558 unsafe_ignore_missing_latest_api: true,
9559 static_libs: ["util"],
9560 }
9561
9562 java_library {
9563 name: "util",
9564 srcs: ["a.java"],
9565 apex_available: ["myapex"],
9566 min_sdk_version: "31",
9567 static_libs: ["another_util"],
9568 }
9569
9570 java_library {
9571 name: "another_util",
9572 srcs: ["a.java"],
9573 min_sdk_version: "31",
9574 apex_available: ["myapex"],
9575 }
9576 `)
9577 })
9578
9579 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009580 preparer.
satayev758968a2021-12-06 11:42:40 +00009581 RunTestWithBp(t, `
9582 apex {
9583 name: "myapex",
9584 key: "myapex.key",
9585 bootclasspath_fragments: ["mybootclasspathfragment"],
9586 min_sdk_version: "30",
9587 updatable: false,
9588 }
9589
9590 apex_key {
9591 name: "myapex.key",
9592 public_key: "testkey.avbpubkey",
9593 private_key: "testkey.pem",
9594 }
9595
9596 bootclasspath_fragment {
9597 name: "mybootclasspathfragment",
9598 contents: ["mybootclasspathlib"],
9599 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009600 hidden_api: {
9601 split_packages: ["*"],
9602 },
satayev758968a2021-12-06 11:42:40 +00009603 }
9604
9605 java_sdk_library {
9606 name: "mybootclasspathlib",
9607 srcs: ["mybootclasspathlib.java"],
9608 apex_available: ["myapex"],
9609 compile_dex: true,
9610 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009611 sdk_version: "current",
9612 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009613 }
9614 `)
9615 })
9616
9617 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9618 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9619 RunTestWithBp(t, `
9620 apex {
9621 name: "myapex",
9622 key: "myapex.key",
9623 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9624 min_sdk_version: "30",
9625 updatable: false,
9626 }
9627
9628 apex_key {
9629 name: "myapex.key",
9630 public_key: "testkey.avbpubkey",
9631 private_key: "testkey.pem",
9632 }
9633
9634 systemserverclasspath_fragment {
9635 name: "mysystemserverclasspathfragment",
9636 contents: ["mysystemserverclasspathlib"],
9637 apex_available: ["myapex"],
9638 }
9639
9640 java_sdk_library {
9641 name: "mysystemserverclasspathlib",
9642 srcs: ["mysystemserverclasspathlib.java"],
9643 apex_available: ["myapex"],
9644 compile_dex: true,
9645 unsafe_ignore_missing_latest_api: true,
9646 }
9647 `)
9648 })
9649}
9650
Jiakai Zhang6decef92022-01-12 17:56:19 +00009651// Verifies that the APEX depends on all the Make modules in the list.
9652func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9653 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9654 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009655 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009656 }
9657}
9658
9659// Verifies that the APEX does not depend on any of the Make modules in the list.
9660func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9661 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9662 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009663 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009664 }
9665}
9666
Cole Faust24e25c02024-01-19 14:12:17 -08009667func TestApexStrictUpdtabilityLint(t *testing.T) {
9668 bpTemplate := `
9669 apex {
9670 name: "myapex",
9671 key: "myapex.key",
9672 java_libs: ["myjavalib"],
9673 updatable: %v,
9674 min_sdk_version: "29",
9675 }
9676 apex_key {
9677 name: "myapex.key",
9678 }
9679 java_library {
9680 name: "myjavalib",
9681 srcs: ["MyClass.java"],
9682 apex_available: [ "myapex" ],
9683 lint: {
9684 strict_updatability_linting: %v,
9685 %s
9686 },
9687 sdk_version: "current",
9688 min_sdk_version: "29",
9689 }
9690 `
9691 fs := android.MockFS{
9692 "lint-baseline.xml": nil,
9693 }
9694
9695 testCases := []struct {
9696 testCaseName string
9697 apexUpdatable bool
9698 javaStrictUpdtabilityLint bool
9699 lintFileExists bool
9700 disallowedFlagExpected bool
9701 }{
9702 {
9703 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9704 apexUpdatable: true,
9705 javaStrictUpdtabilityLint: true,
9706 lintFileExists: false,
9707 disallowedFlagExpected: false,
9708 },
9709 {
9710 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9711 apexUpdatable: false,
9712 javaStrictUpdtabilityLint: false,
9713 lintFileExists: true,
9714 disallowedFlagExpected: false,
9715 },
9716 {
9717 testCaseName: "non-updatable apex respects strict updatability of javalib",
9718 apexUpdatable: false,
9719 javaStrictUpdtabilityLint: true,
9720 lintFileExists: true,
9721 disallowedFlagExpected: true,
9722 },
9723 {
9724 testCaseName: "updatable apex sets strict updatability of javalib to true",
9725 apexUpdatable: true,
9726 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9727 lintFileExists: true,
9728 disallowedFlagExpected: true,
9729 },
9730 }
9731
9732 for _, testCase := range testCases {
9733 fixtures := []android.FixturePreparer{}
9734 baselineProperty := ""
9735 if testCase.lintFileExists {
9736 fixtures = append(fixtures, fs.AddToFixture())
9737 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9738 }
9739 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9740
9741 result := testApex(t, bp, fixtures...)
9742 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9743 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9744 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9745
9746 if disallowedFlagActual != testCase.disallowedFlagExpected {
9747 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9748 }
9749 }
9750}
9751
Cole Faust24e25c02024-01-19 14:12:17 -08009752// checks transtive deps of an apex coming from bootclasspath_fragment
9753func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9754 bp := `
9755 apex {
9756 name: "myapex",
9757 key: "myapex.key",
9758 bootclasspath_fragments: ["mybootclasspathfragment"],
9759 updatable: true,
9760 min_sdk_version: "29",
9761 }
9762 apex_key {
9763 name: "myapex.key",
9764 }
9765 bootclasspath_fragment {
9766 name: "mybootclasspathfragment",
9767 contents: ["myjavalib"],
9768 apex_available: ["myapex"],
9769 hidden_api: {
9770 split_packages: ["*"],
9771 },
9772 }
9773 java_library {
9774 name: "myjavalib",
9775 srcs: ["MyClass.java"],
9776 apex_available: [ "myapex" ],
9777 sdk_version: "current",
9778 min_sdk_version: "29",
9779 compile_dex: true,
9780 lint: {
9781 baseline_filename: "lint-baseline.xml",
9782 }
9783 }
9784 `
9785 fs := android.MockFS{
9786 "lint-baseline.xml": nil,
9787 }
9788
9789 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9790 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9791 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9792 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9793 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9794 }
9795}
Spandan Das66773252022-01-15 00:23:18 +00009796
Jihoon Kang784c0052024-06-25 22:15:39 +00009797func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9798 bp := `
9799 apex {
9800 name: "myapex",
9801 key: "myapex.key",
9802 bootclasspath_fragments: ["mybootclasspathfragment"],
9803 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009804 java_libs: [
9805 "jacocoagent",
9806 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009807 }
9808 apex_key {
9809 name: "myapex.key",
9810 }
9811 bootclasspath_fragment {
9812 name: "mybootclasspathfragment",
9813 contents: ["foo"],
9814 apex_available: ["myapex"],
9815 hidden_api: {
9816 split_packages: ["*"],
9817 },
9818 }
9819 java_sdk_library {
9820 name: "foo",
9821 srcs: ["MyClass.java"],
9822 apex_available: [ "myapex" ],
9823 sdk_version: "current",
9824 min_sdk_version: "29",
9825 compile_dex: true,
9826 }
9827 `
9828 fs := android.MockFS{
9829 "lint-baseline.xml": nil,
9830 }
9831
9832 result := android.GroupFixturePreparers(
9833 prepareForApexTest,
9834 java.PrepareForTestWithJavaSdkLibraryFiles,
9835 java.PrepareForTestWithJacocoInstrumentation,
9836 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009837 android.FixtureMergeMockFs(fs),
9838 ).RunTestWithBp(t, bp)
9839
9840 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9841 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9842 android.AssertStringDoesContain(t,
9843 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9844 lintReportInputs, "foo.impl")
9845}
9846
Spandan Das42e89502022-05-06 22:12:55 +00009847// updatable apexes should propagate updatable=true to its apps
9848func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9849 bp := `
9850 apex {
9851 name: "myapex",
9852 key: "myapex.key",
9853 updatable: %v,
9854 apps: [
9855 "myapp",
9856 ],
9857 min_sdk_version: "30",
9858 }
9859 apex_key {
9860 name: "myapex.key",
9861 }
9862 android_app {
9863 name: "myapp",
9864 updatable: %v,
9865 apex_available: [
9866 "myapex",
9867 ],
9868 sdk_version: "current",
9869 min_sdk_version: "30",
9870 }
9871 `
9872 testCases := []struct {
9873 name string
9874 apex_is_updatable_bp bool
9875 app_is_updatable_bp bool
9876 app_is_updatable_expected bool
9877 }{
9878 {
9879 name: "Non-updatable apex respects updatable property of non-updatable app",
9880 apex_is_updatable_bp: false,
9881 app_is_updatable_bp: false,
9882 app_is_updatable_expected: false,
9883 },
9884 {
9885 name: "Non-updatable apex respects updatable property of updatable app",
9886 apex_is_updatable_bp: false,
9887 app_is_updatable_bp: true,
9888 app_is_updatable_expected: true,
9889 },
9890 {
9891 name: "Updatable apex respects updatable property of updatable app",
9892 apex_is_updatable_bp: true,
9893 app_is_updatable_bp: true,
9894 app_is_updatable_expected: true,
9895 },
9896 {
9897 name: "Updatable apex sets updatable=true on non-updatable app",
9898 apex_is_updatable_bp: true,
9899 app_is_updatable_bp: false,
9900 app_is_updatable_expected: true,
9901 },
9902 }
9903 for _, testCase := range testCases {
9904 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9905 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9906 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9907 }
9908}
9909
Dennis Shend4f5d932023-01-31 20:27:21 +00009910func TestTrimmedApex(t *testing.T) {
9911 bp := `
9912 apex {
9913 name: "myapex",
9914 key: "myapex.key",
9915 native_shared_libs: ["libfoo","libbaz"],
9916 min_sdk_version: "29",
9917 trim_against: "mydcla",
9918 }
9919 apex {
9920 name: "mydcla",
9921 key: "myapex.key",
9922 native_shared_libs: ["libfoo","libbar"],
9923 min_sdk_version: "29",
9924 file_contexts: ":myapex-file_contexts",
9925 dynamic_common_lib_apex: true,
9926 }
9927 apex_key {
9928 name: "myapex.key",
9929 }
9930 cc_library {
9931 name: "libfoo",
9932 shared_libs: ["libc"],
9933 apex_available: ["myapex","mydcla"],
9934 min_sdk_version: "29",
9935 }
9936 cc_library {
9937 name: "libbar",
9938 shared_libs: ["libc"],
9939 apex_available: ["myapex","mydcla"],
9940 min_sdk_version: "29",
9941 }
9942 cc_library {
9943 name: "libbaz",
9944 shared_libs: ["libc"],
9945 apex_available: ["myapex","mydcla"],
9946 min_sdk_version: "29",
9947 }
Dennis Shend4f5d932023-01-31 20:27:21 +00009948 `
9949 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09009950 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +00009951 apexRule := module.MaybeRule("apexRule")
9952 if apexRule.Rule == nil {
9953 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
9954 }
9955
9956 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +09009957 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +00009958 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
9959 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
9960 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
9961 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
9962}
Jingwen Chendea7a642023-03-28 11:30:50 +00009963
9964func TestCannedFsConfig(t *testing.T) {
9965 ctx := testApex(t, `
9966 apex {
9967 name: "myapex",
9968 key: "myapex.key",
9969 updatable: false,
9970 }
9971
9972 apex_key {
9973 name: "myapex.key",
9974 public_key: "testkey.avbpubkey",
9975 private_key: "testkey.pem",
9976 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009977 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009978 generateFsRule := mod.Rule("generateFsConfig")
9979 cmd := generateFsRule.RuleParams.Command
9980
9981 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
9982}
9983
9984func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
9985 ctx := testApex(t, `
9986 apex {
9987 name: "myapex",
9988 key: "myapex.key",
9989 canned_fs_config: "my_config",
9990 updatable: false,
9991 }
9992
9993 apex_key {
9994 name: "myapex.key",
9995 public_key: "testkey.avbpubkey",
9996 private_key: "testkey.pem",
9997 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009998 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009999 generateFsRule := mod.Rule("generateFsConfig")
10000 cmd := generateFsRule.RuleParams.Command
10001
10002 // Ensure that canned_fs_config has "cat my_config" at the end
10003 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10004}
Spandan Das20fce2d2023-04-12 17:21:39 +000010005
10006func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10007 testCases := []struct {
10008 desc string
10009 hasStubs bool
10010 apexAvailable string
10011 expectedError string
10012 }{
10013 {
10014 desc: "non-stub library can have multiple apex_available",
10015 hasStubs: false,
10016 apexAvailable: `["myapex", "otherapex"]`,
10017 },
10018 {
10019 desc: "stub library should not be available to anyapex",
10020 hasStubs: true,
10021 apexAvailable: `["//apex_available:anyapex"]`,
10022 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10023 },
10024 {
10025 desc: "stub library should not be available to multiple apexes",
10026 hasStubs: true,
10027 apexAvailable: `["myapex", "otherapex"]`,
10028 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10029 },
10030 {
10031 desc: "stub library can be available to a core apex and a test apex",
10032 hasStubs: true,
10033 apexAvailable: `["myapex", "test_myapex"]`,
10034 },
10035 }
10036 bpTemplate := `
10037 cc_library {
10038 name: "libfoo",
10039 %v
10040 apex_available: %v,
10041 }
10042 apex {
10043 name: "myapex",
10044 key: "apex.key",
10045 updatable: false,
10046 native_shared_libs: ["libfoo"],
10047 }
10048 apex {
10049 name: "otherapex",
10050 key: "apex.key",
10051 updatable: false,
10052 }
10053 apex_test {
10054 name: "test_myapex",
10055 key: "apex.key",
10056 updatable: false,
10057 native_shared_libs: ["libfoo"],
10058 }
10059 apex_key {
10060 name: "apex.key",
10061 }
10062 `
10063 for _, tc := range testCases {
10064 stubs := ""
10065 if tc.hasStubs {
10066 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10067 }
10068 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10069 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10070 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10071 })
10072 if tc.expectedError == "" {
10073 testApex(t, bp, mockFsFixturePreparer)
10074 } else {
10075 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10076 }
10077 }
10078}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010079
10080func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10081 context := android.GroupFixturePreparers(
10082 android.PrepareForIntegrationTestWithAndroid,
10083 cc.PrepareForIntegrationTestWithCc,
10084 PrepareForTestWithApexBuildComponents,
10085 prepareForTestWithMyapex,
10086 filesystem.PrepareForTestWithFilesystemBuildComponents,
10087 )
10088 result := context.RunTestWithBp(t, `
10089 android_system_image {
10090 name: "myfilesystem",
10091 deps: [
10092 "libfoo",
10093 ],
10094 linker_config_src: "linker.config.json",
10095 }
10096
10097 cc_library {
10098 name: "libfoo",
10099 shared_libs: [
10100 "libbar",
10101 ],
10102 stl: "none",
10103 }
10104
10105 cc_library {
10106 name: "libbar",
10107 stl: "none",
10108 apex_available: ["myapex"],
10109 }
10110
10111 apex {
10112 name: "myapex",
10113 native_shared_libs: ["libbar"],
10114 key: "myapex.key",
10115 updatable: false,
10116 }
10117
10118 apex_key {
10119 name: "myapex.key",
10120 public_key: "testkey.avbpubkey",
10121 private_key: "testkey.pem",
10122 }
10123 `)
10124
Cole Faust3b806d32024-03-11 15:15:03 -070010125 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010126 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10127 inputs.Strings(),
10128 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10129}
Yu Liueae7b362023-11-16 17:05:47 -080010130
10131var apex_default_bp = `
10132 apex_key {
10133 name: "myapex.key",
10134 public_key: "testkey.avbpubkey",
10135 private_key: "testkey.pem",
10136 }
10137
10138 filegroup {
10139 name: "myapex.manifest",
10140 srcs: ["apex_manifest.json"],
10141 }
10142
10143 filegroup {
10144 name: "myapex.androidmanifest",
10145 srcs: ["AndroidManifest.xml"],
10146 }
10147`
10148
10149func TestAconfigFilesJavaDeps(t *testing.T) {
10150 ctx := testApex(t, apex_default_bp+`
10151 apex {
10152 name: "myapex",
10153 manifest: ":myapex.manifest",
10154 androidManifest: ":myapex.androidmanifest",
10155 key: "myapex.key",
10156 java_libs: [
10157 "my_java_library_foo",
10158 "my_java_library_bar",
10159 ],
10160 updatable: false,
10161 }
10162
10163 java_library {
10164 name: "my_java_library_foo",
10165 srcs: ["foo/bar/MyClass.java"],
10166 sdk_version: "none",
10167 system_modules: "none",
10168 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010169 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010170 "myapex",
10171 ],
10172 }
10173
10174 java_library {
10175 name: "my_java_library_bar",
10176 srcs: ["foo/bar/MyClass.java"],
10177 sdk_version: "none",
10178 system_modules: "none",
10179 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010180 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010181 "myapex",
10182 ],
10183 }
10184
10185 aconfig_declarations {
10186 name: "my_aconfig_declarations_foo",
10187 package: "com.example.package",
10188 container: "myapex",
10189 srcs: ["foo.aconfig"],
10190 }
10191
10192 java_aconfig_library {
10193 name: "my_java_aconfig_library_foo",
10194 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010195 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010196 "myapex",
10197 ],
10198 }
10199
10200 aconfig_declarations {
10201 name: "my_aconfig_declarations_bar",
10202 package: "com.example.package",
10203 container: "myapex",
10204 srcs: ["bar.aconfig"],
10205 }
10206
10207 java_aconfig_library {
10208 name: "my_java_aconfig_library_bar",
10209 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010210 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010211 "myapex",
10212 ],
10213 }
10214 `)
10215
10216 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10217 s := mod.Rule("apexRule").Args["copy_commands"]
10218 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010219 if len(copyCmds) != 14 {
10220 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010221 }
10222
Jooyung Hana3fddf42024-09-03 13:22:21 +090010223 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10224 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10225 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10226 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010227 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010228
Yu Liubba555e2024-02-17 00:36:42 +000010229 inputs := []string{
10230 "my_aconfig_declarations_foo/intermediate.pb",
10231 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010232 }
Yu Liubba555e2024-02-17 00:36:42 +000010233 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10234 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10235 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10236 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010237 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010238}
10239
10240func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10241 ctx := testApex(t, apex_default_bp+`
10242 apex {
10243 name: "myapex",
10244 manifest: ":myapex.manifest",
10245 androidManifest: ":myapex.androidmanifest",
10246 key: "myapex.key",
10247 java_libs: [
10248 "my_java_library_foo",
10249 ],
10250 native_shared_libs: [
10251 "my_cc_library_bar",
10252 ],
10253 binaries: [
10254 "my_cc_binary_baz",
10255 ],
10256 updatable: false,
10257 }
10258
10259 java_library {
10260 name: "my_java_library_foo",
10261 srcs: ["foo/bar/MyClass.java"],
10262 sdk_version: "none",
10263 system_modules: "none",
10264 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010265 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010266 "myapex",
10267 ],
10268 }
10269
10270 cc_library {
10271 name: "my_cc_library_bar",
10272 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010273 static_libs: [
10274 "my_cc_aconfig_library_bar",
10275 "my_cc_aconfig_library_baz",
10276 ],
Yu Liueae7b362023-11-16 17:05:47 -080010277 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010278 "myapex",
10279 ],
10280 }
10281
10282 cc_binary {
10283 name: "my_cc_binary_baz",
10284 srcs: ["foo/bar/MyClass.cc"],
10285 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010286 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010287 "myapex",
10288 ],
10289 }
10290
10291 aconfig_declarations {
10292 name: "my_aconfig_declarations_foo",
10293 package: "com.example.package",
10294 container: "myapex",
10295 srcs: ["foo.aconfig"],
10296 }
10297
10298 java_aconfig_library {
10299 name: "my_java_aconfig_library_foo",
10300 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010301 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010302 "myapex",
10303 ],
10304 }
10305
10306 aconfig_declarations {
10307 name: "my_aconfig_declarations_bar",
10308 package: "com.example.package",
10309 container: "myapex",
10310 srcs: ["bar.aconfig"],
10311 }
10312
10313 cc_aconfig_library {
10314 name: "my_cc_aconfig_library_bar",
10315 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010316 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010317 "myapex",
10318 ],
10319 }
10320
10321 aconfig_declarations {
10322 name: "my_aconfig_declarations_baz",
10323 package: "com.example.package",
10324 container: "myapex",
10325 srcs: ["baz.aconfig"],
10326 }
10327
10328 cc_aconfig_library {
10329 name: "my_cc_aconfig_library_baz",
10330 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010331 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010332 "myapex",
10333 ],
10334 }
10335
10336 cc_library {
10337 name: "server_configurable_flags",
10338 srcs: ["server_configurable_flags.cc"],
10339 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010340 cc_library {
10341 name: "libbase",
10342 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010343 apex_available: [
10344 "myapex",
10345 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010346 }
10347 cc_library {
10348 name: "libaconfig_storage_read_api_cc",
10349 srcs: ["libaconfig_storage_read_api_cc.cc"],
10350 }
Yu Liueae7b362023-11-16 17:05:47 -080010351 `)
10352
10353 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10354 s := mod.Rule("apexRule").Args["copy_commands"]
10355 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010356 if len(copyCmds) != 18 {
10357 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010358 }
10359
Jooyung Hana3fddf42024-09-03 13:22:21 +090010360 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10361 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10362 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10363 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010364 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010365
Yu Liubba555e2024-02-17 00:36:42 +000010366 inputs := []string{
10367 "my_aconfig_declarations_foo/intermediate.pb",
10368 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10369 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010370 }
Yu Liubba555e2024-02-17 00:36:42 +000010371 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10372 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10373 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10374 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010375 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010376}
10377
Yu Liucec0e412023-11-30 16:45:50 -080010378func TestAconfigFilesRustDeps(t *testing.T) {
10379 ctx := testApex(t, apex_default_bp+`
10380 apex {
10381 name: "myapex",
10382 manifest: ":myapex.manifest",
10383 androidManifest: ":myapex.androidmanifest",
10384 key: "myapex.key",
10385 native_shared_libs: [
10386 "libmy_rust_library",
10387 ],
10388 binaries: [
10389 "my_rust_binary",
10390 ],
10391 rust_dyn_libs: [
10392 "libmy_rust_dylib",
10393 ],
10394 updatable: false,
10395 }
10396
10397 rust_library {
10398 name: "libflags_rust", // test mock
10399 crate_name: "flags_rust",
10400 srcs: ["lib.rs"],
10401 apex_available: [
10402 "myapex",
10403 ],
10404 }
10405
10406 rust_library {
10407 name: "liblazy_static", // test mock
10408 crate_name: "lazy_static",
10409 srcs: ["src/lib.rs"],
10410 apex_available: [
10411 "myapex",
10412 ],
10413 }
10414
Ted Bauer02d475c2024-03-27 20:56:26 +000010415 rust_library {
10416 name: "libaconfig_storage_read_api", // test mock
10417 crate_name: "aconfig_storage_read_api",
10418 srcs: ["src/lib.rs"],
10419 apex_available: [
10420 "myapex",
10421 ],
10422 }
10423
Ted Bauer6ef40db2024-03-29 14:04:10 +000010424 rust_library {
10425 name: "liblogger", // test mock
10426 crate_name: "logger",
10427 srcs: ["src/lib.rs"],
10428 apex_available: [
10429 "myapex",
10430 ],
10431 }
10432
10433 rust_library {
10434 name: "liblog_rust", // test mock
10435 crate_name: "log_rust",
10436 srcs: ["src/lib.rs"],
10437 apex_available: [
10438 "myapex",
10439 ],
10440 }
10441
Yu Liucec0e412023-11-30 16:45:50 -080010442 rust_ffi_shared {
10443 name: "libmy_rust_library",
10444 srcs: ["src/lib.rs"],
10445 rustlibs: ["libmy_rust_aconfig_library_foo"],
10446 crate_name: "my_rust_library",
10447 apex_available: [
10448 "myapex",
10449 ],
10450 }
10451
10452 rust_library_dylib {
10453 name: "libmy_rust_dylib",
10454 srcs: ["foo/bar/MyClass.rs"],
10455 rustlibs: ["libmy_rust_aconfig_library_bar"],
10456 crate_name: "my_rust_dylib",
10457 apex_available: [
10458 "myapex",
10459 ],
10460 }
10461
10462 rust_binary {
10463 name: "my_rust_binary",
10464 srcs: ["foo/bar/MyClass.rs"],
10465 rustlibs: [
10466 "libmy_rust_aconfig_library_baz",
10467 "libmy_rust_dylib",
10468 ],
10469 apex_available: [
10470 "myapex",
10471 ],
10472 }
10473
10474 aconfig_declarations {
10475 name: "my_aconfig_declarations_foo",
10476 package: "com.example.package",
10477 container: "myapex",
10478 srcs: ["foo.aconfig"],
10479 }
10480
10481 aconfig_declarations {
10482 name: "my_aconfig_declarations_bar",
10483 package: "com.example.package",
10484 container: "myapex",
10485 srcs: ["bar.aconfig"],
10486 }
10487
10488 aconfig_declarations {
10489 name: "my_aconfig_declarations_baz",
10490 package: "com.example.package",
10491 container: "myapex",
10492 srcs: ["baz.aconfig"],
10493 }
10494
10495 rust_aconfig_library {
10496 name: "libmy_rust_aconfig_library_foo",
10497 aconfig_declarations: "my_aconfig_declarations_foo",
10498 crate_name: "my_rust_aconfig_library_foo",
10499 apex_available: [
10500 "myapex",
10501 ],
10502 }
10503
10504 rust_aconfig_library {
10505 name: "libmy_rust_aconfig_library_bar",
10506 aconfig_declarations: "my_aconfig_declarations_bar",
10507 crate_name: "my_rust_aconfig_library_bar",
10508 apex_available: [
10509 "myapex",
10510 ],
10511 }
10512
10513 rust_aconfig_library {
10514 name: "libmy_rust_aconfig_library_baz",
10515 aconfig_declarations: "my_aconfig_declarations_baz",
10516 crate_name: "my_rust_aconfig_library_baz",
10517 apex_available: [
10518 "myapex",
10519 ],
10520 }
10521 `)
10522
10523 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10524 s := mod.Rule("apexRule").Args["copy_commands"]
10525 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010526 if len(copyCmds) != 38 {
10527 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010528 }
10529
Jooyung Hana3fddf42024-09-03 13:22:21 +090010530 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10531 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10532 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10533 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010534 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010535
Yu Liubba555e2024-02-17 00:36:42 +000010536 inputs := []string{
10537 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010538 "my_aconfig_declarations_bar/intermediate.pb",
10539 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010540 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10541 }
10542 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10543 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10544 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10545 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010546 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010547}
10548
10549func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10550 aconfigRule := mod.Description(desc)
10551 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010552 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010553 if len(aconfigArgs) != len(inputs) {
10554 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010555 }
Yu Liucec0e412023-11-30 16:45:50 -080010556
Yu Liubba555e2024-02-17 00:36:42 +000010557 ensureEquals(t, container, aconfigRule.Args["container"])
10558 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10559
10560 buildParams := aconfigRule.BuildParams
10561 for _, input := range inputs {
10562 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10563 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010564 }
Yu Liubba555e2024-02-17 00:36:42 +000010565
10566 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010567}
10568
Yu Liueae7b362023-11-16 17:05:47 -080010569func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10570 ctx := testApex(t, apex_default_bp+`
10571 apex {
10572 name: "myapex",
10573 manifest: ":myapex.manifest",
10574 androidManifest: ":myapex.androidmanifest",
10575 key: "myapex.key",
10576 java_libs: [
10577 "my_java_library_foo",
10578 "other_java_library_bar",
10579 ],
10580 updatable: false,
10581 }
10582
10583 java_library {
10584 name: "my_java_library_foo",
10585 srcs: ["foo/bar/MyClass.java"],
10586 sdk_version: "none",
10587 system_modules: "none",
10588 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010589 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010590 "myapex",
10591 ],
10592 }
10593
10594 java_library {
10595 name: "other_java_library_bar",
10596 srcs: ["foo/bar/MyClass.java"],
10597 sdk_version: "none",
10598 system_modules: "none",
10599 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010600 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010601 "myapex",
10602 ],
10603 }
10604
10605 aconfig_declarations {
10606 name: "my_aconfig_declarations_foo",
10607 package: "com.example.package",
10608 container: "myapex",
10609 srcs: ["foo.aconfig"],
10610 }
10611
10612 java_aconfig_library {
10613 name: "my_java_aconfig_library_foo",
10614 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010615 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010616 "myapex",
10617 ],
10618 }
10619
10620 aconfig_declarations {
10621 name: "other_aconfig_declarations_bar",
10622 package: "com.example.package",
10623 container: "otherapex",
10624 srcs: ["bar.aconfig"],
10625 }
10626
10627 java_aconfig_library {
10628 name: "other_java_aconfig_library_bar",
10629 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010630 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010631 "myapex",
10632 ],
10633 }
10634 `)
10635
10636 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10637 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10638 s := " " + combineAconfigRule.Args["cache_files"]
10639 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10640 if len(aconfigArgs) != 1 {
10641 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10642 }
10643 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10644
10645 buildParams := combineAconfigRule.BuildParams
10646 if len(buildParams.Inputs) != 1 {
10647 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10648 }
10649 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10650 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10651}
10652
10653func TestAconfigFilesRemoveDuplicates(t *testing.T) {
10654 ctx := testApex(t, apex_default_bp+`
10655 apex {
10656 name: "myapex",
10657 manifest: ":myapex.manifest",
10658 androidManifest: ":myapex.androidmanifest",
10659 key: "myapex.key",
10660 java_libs: [
10661 "my_java_library_foo",
10662 "my_java_library_bar",
10663 ],
10664 updatable: false,
10665 }
10666
10667 java_library {
10668 name: "my_java_library_foo",
10669 srcs: ["foo/bar/MyClass.java"],
10670 sdk_version: "none",
10671 system_modules: "none",
10672 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010673 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010674 "myapex",
10675 ],
10676 }
10677
10678 java_library {
10679 name: "my_java_library_bar",
10680 srcs: ["foo/bar/MyClass.java"],
10681 sdk_version: "none",
10682 system_modules: "none",
10683 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010684 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010685 "myapex",
10686 ],
10687 }
10688
10689 aconfig_declarations {
10690 name: "my_aconfig_declarations_foo",
10691 package: "com.example.package",
10692 container: "myapex",
10693 srcs: ["foo.aconfig"],
10694 }
10695
10696 java_aconfig_library {
10697 name: "my_java_aconfig_library_foo",
10698 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010699 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010700 "myapex",
10701 ],
10702 }
10703
10704 java_aconfig_library {
10705 name: "my_java_aconfig_library_bar",
10706 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010707 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010708 "myapex",
10709 ],
10710 }
10711 `)
10712
10713 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10714 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10715 s := " " + combineAconfigRule.Args["cache_files"]
10716 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10717 if len(aconfigArgs) != 1 {
10718 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10719 }
10720 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10721
10722 buildParams := combineAconfigRule.BuildParams
10723 if len(buildParams.Inputs) != 1 {
10724 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10725 }
10726 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10727 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10728}
Spandan Das5be63332023-12-13 00:06:32 +000010729
10730// Test that the boot jars come from the _selected_ apex prebuilt
10731// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10732func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10733 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10734 t.Helper()
10735 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10736 foundLibfooJar := false
10737 base := stem + ".jar"
10738 for _, output := range s.AllOutputs() {
10739 if filepath.Base(output) == base {
10740 foundLibfooJar = true
10741 buildRule := s.Output(output)
10742 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10743 }
10744 }
10745 if !foundLibfooJar {
10746 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10747 }
10748 }
10749
Spandan Das64c9e0c2023-12-20 20:13:34 +000010750 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10751 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10752 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10753 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10754 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10755 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)
10756 }
10757
10758 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10759 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10760 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10761 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10762 }
10763
Spandan Das5be63332023-12-13 00:06:32 +000010764 bp := `
10765 // Source APEX.
10766
10767 java_library {
10768 name: "framework-foo",
10769 srcs: ["foo.java"],
10770 installable: true,
10771 apex_available: [
10772 "com.android.foo",
10773 ],
10774 }
10775
10776 bootclasspath_fragment {
10777 name: "foo-bootclasspath-fragment",
10778 contents: ["framework-foo"],
10779 apex_available: [
10780 "com.android.foo",
10781 ],
10782 hidden_api: {
10783 split_packages: ["*"],
10784 },
10785 }
10786
10787 apex_key {
10788 name: "com.android.foo.key",
10789 public_key: "com.android.foo.avbpubkey",
10790 private_key: "com.android.foo.pem",
10791 }
10792
10793 apex {
10794 name: "com.android.foo",
10795 key: "com.android.foo.key",
10796 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10797 updatable: false,
10798 }
10799
10800 // Prebuilt APEX.
10801
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010802 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010803 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010804 public: {
10805 jars: ["foo.jar"],
10806 },
Spandan Das5be63332023-12-13 00:06:32 +000010807 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010808 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010809 }
10810
10811 prebuilt_bootclasspath_fragment {
10812 name: "foo-bootclasspath-fragment",
10813 contents: ["framework-foo"],
10814 hidden_api: {
10815 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10816 metadata: "my-bootclasspath-fragment/metadata.csv",
10817 index: "my-bootclasspath-fragment/index.csv",
10818 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10819 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10820 },
10821 apex_available: [
10822 "com.android.foo",
10823 ],
10824 }
10825
10826 prebuilt_apex {
10827 name: "com.android.foo",
10828 apex_name: "com.android.foo",
10829 src: "com.android.foo-arm.apex",
10830 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10831 }
10832
10833 // Another Prebuilt ART APEX
10834 prebuilt_apex {
10835 name: "com.android.foo.v2",
10836 apex_name: "com.android.foo", // Used to determine the API domain
10837 src: "com.android.foo-arm.apex",
10838 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10839 }
10840
10841 // APEX contribution modules
10842
10843 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010844 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010845 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010846 contents: ["com.android.foo"],
10847 }
10848
10849 apex_contributions {
10850 name: "foo.prebuilt.contributions",
10851 api_domain: "com.android.foo",
10852 contents: ["prebuilt_com.android.foo"],
10853 }
10854
10855 apex_contributions {
10856 name: "foo.prebuilt.v2.contributions",
10857 api_domain: "com.android.foo",
10858 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010859 }
10860 `
10861
10862 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010863 desc string
10864 selectedApexContributions string
10865 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010866 }{
10867 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010868 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10869 selectedApexContributions: "foo.source.contributions",
10870 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010871 },
10872 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010873 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10874 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010875 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 +000010876 },
10877 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010878 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10879 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010880 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 +000010881 },
10882 }
10883
10884 fragment := java.ApexVariantReference{
10885 Apex: proptools.StringPtr("com.android.foo"),
10886 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10887 }
10888
10889 for _, tc := range testCases {
10890 preparer := android.GroupFixturePreparers(
10891 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10892 android.FixtureMergeMockFs(map[string][]byte{
10893 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10894 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010895 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10896 // file creation.
10897 java.FixtureConfigureBootJars("platform:foo"),
10898 android.FixtureModifyMockFS(func(fs android.MockFS) {
10899 fs["platform/Android.bp"] = []byte(`
10900 java_library {
10901 name: "foo",
10902 srcs: ["Test.java"],
10903 compile_dex: true,
10904 }
10905 `)
10906 fs["platform/Test.java"] = nil
10907 }),
10908
Colin Crossa66b4632024-08-08 15:50:47 -070010909 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010910 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010911 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010912 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010913 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10914 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010915 }
10916}
Spandan Das3576e762024-01-03 18:57:03 +000010917
10918// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10919// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10920func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000010921 // for a mainline module family, check that only the flagged soong module is visible to make
10922 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
10923 variation := func(moduleName string) string {
10924 ret := "android_common_com.android.foo"
10925 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000010926 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000010927 }
10928 return ret
10929 }
10930
10931 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10932 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10933
10934 for _, hiddenModuleName := range hiddenModuleNames {
10935 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10936 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10937
10938 }
10939 }
10940
10941 bp := `
10942 apex_key {
10943 name: "com.android.foo.key",
10944 public_key: "com.android.foo.avbpubkey",
10945 private_key: "com.android.foo.pem",
10946 }
10947
10948 // AOSP source apex
10949 apex {
10950 name: "com.android.foo",
10951 key: "com.android.foo.key",
10952 updatable: false,
10953 }
10954
10955 // Google source apex
10956 override_apex {
10957 name: "com.google.android.foo",
10958 base: "com.android.foo",
10959 key: "com.android.foo.key",
10960 }
10961
10962 // Prebuilt Google APEX.
10963
10964 prebuilt_apex {
10965 name: "com.google.android.foo",
10966 apex_name: "com.android.foo",
10967 src: "com.android.foo-arm.apex",
10968 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10969 }
10970
10971 // Another Prebuilt Google APEX
10972 prebuilt_apex {
10973 name: "com.google.android.foo.v2",
10974 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000010975 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000010976 src: "com.android.foo-arm.apex",
10977 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10978 }
10979
10980 // APEX contribution modules
10981
10982 apex_contributions {
10983 name: "foo.source.contributions",
10984 api_domain: "com.android.foo",
10985 contents: ["com.google.android.foo"],
10986 }
10987
10988 apex_contributions {
10989 name: "foo.prebuilt.contributions",
10990 api_domain: "com.android.foo",
10991 contents: ["prebuilt_com.google.android.foo"],
10992 }
10993
10994 apex_contributions {
10995 name: "foo.prebuilt.v2.contributions",
10996 api_domain: "com.android.foo",
10997 contents: ["prebuilt_com.google.android.foo.v2"],
10998 }
10999
11000 // This is an incompatible module because it selects multiple versions of the same mainline module
11001 apex_contributions {
11002 name: "foo.prebuilt.duplicate.contributions",
11003 api_domain: "com.android.foo",
11004 contents: [
11005 "prebuilt_com.google.android.foo",
11006 "prebuilt_com.google.android.foo.v2",
11007 ],
11008 }
11009 `
11010
11011 testCases := []struct {
11012 desc string
11013 selectedApexContributions string
11014 expectedVisibleModuleName string
11015 expectedHiddenModuleNames []string
11016 expectedError string
11017 }{
11018 {
11019 desc: "Source apex is selected, prebuilts should be hidden from make",
11020 selectedApexContributions: "foo.source.contributions",
11021 expectedVisibleModuleName: "com.google.android.foo",
11022 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11023 },
11024 {
11025 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11026 selectedApexContributions: "foo.prebuilt.contributions",
11027 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11028 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11029 },
11030 {
11031 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11032 selectedApexContributions: "foo.prebuilt.v2.contributions",
11033 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11034 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11035 },
11036 {
11037 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11038 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11039 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11040 },
11041 }
11042
11043 for _, tc := range testCases {
11044 preparer := android.GroupFixturePreparers(
11045 android.FixtureMergeMockFs(map[string][]byte{
11046 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11047 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011048 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011049 )
11050 if tc.expectedError != "" {
11051 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11052 testApex(t, bp, preparer)
11053 return
11054 }
11055 ctx := testApex(t, bp, preparer)
11056
Spandan Das3576e762024-01-03 18:57:03 +000011057 // Check that
11058 // 1. The contents of the selected apex_contributions are visible to make
11059 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11060 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11061 }
11062}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011063
Spandan Das85bd4622024-08-01 00:51:20 +000011064// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11065func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11066 // for a mainline module family, check that only the flagged soong module is visible to make
11067 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11068 variation := func(moduleName string) string {
11069 ret := "android_common_com.android.adservices"
11070 if moduleName == "com.google.android.foo" {
11071 ret = "android_common_com.google.android.foo_com.google.android.foo"
11072 }
11073 return ret
11074 }
11075
11076 for _, visibleModuleName := range visibleModuleNames {
11077 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11078 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11079 }
11080
11081 for _, hiddenModuleName := range hiddenModuleNames {
11082 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11083 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11084
11085 }
11086 }
11087
11088 bp := `
11089 apex_key {
11090 name: "com.android.adservices.key",
11091 public_key: "com.android.adservices.avbpubkey",
11092 private_key: "com.android.adservices.pem",
11093 }
11094
11095 // AOSP source apex
11096 apex {
11097 name: "com.android.adservices",
11098 key: "com.android.adservices.key",
11099 updatable: false,
11100 }
11101
11102 // Prebuilt Google APEX.
11103
11104 prebuilt_apex {
11105 name: "com.google.android.adservices",
11106 apex_name: "com.android.adservices",
11107 src: "com.android.foo-arm.apex",
11108 }
11109
11110 // Another Prebuilt Google APEX
11111 prebuilt_apex {
11112 name: "com.google.android.adservices.v2",
11113 apex_name: "com.android.adservices",
11114 src: "com.android.foo-arm.apex",
11115 }
11116
11117 // APEX contribution modules
11118
11119
11120 apex_contributions {
11121 name: "adservices.prebuilt.contributions",
11122 api_domain: "com.android.adservices",
11123 contents: ["prebuilt_com.google.android.adservices"],
11124 }
11125
11126 apex_contributions {
11127 name: "adservices.prebuilt.v2.contributions",
11128 api_domain: "com.android.adservices",
11129 contents: ["prebuilt_com.google.android.adservices.v2"],
11130 }
11131 `
11132
11133 testCases := []struct {
11134 desc string
11135 selectedApexContributions string
11136 expectedVisibleModuleNames []string
11137 expectedHiddenModuleNames []string
11138 }{
11139 {
11140 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11141 selectedApexContributions: "",
11142 expectedVisibleModuleNames: []string{"com.android.adservices"},
11143 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11144 },
11145 {
11146 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11147 selectedApexContributions: "adservices.prebuilt.contributions",
11148 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11149 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11150 },
11151 {
11152 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11153 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11154 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11155 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11156 },
11157 }
11158
11159 for _, tc := range testCases {
11160 preparer := android.GroupFixturePreparers(
11161 android.FixtureMergeMockFs(map[string][]byte{
11162 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11163 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011164 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011165 )
11166 ctx := testApex(t, bp, preparer)
11167
11168 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11169 }
11170}
11171
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011172func TestAconfifDeclarationsValidation(t *testing.T) {
11173 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11174 for _, moduleName := range moduleNames {
11175 ret += fmt.Sprintf(`
11176 aconfig_declarations {
11177 name: "%[1]s",
11178 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011179 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011180 srcs: [
11181 "%[1]s.aconfig",
11182 ],
11183 }
11184 java_aconfig_library {
11185 name: "%[1]s-lib",
11186 aconfig_declarations: "%[1]s",
11187 }
11188 `, moduleName)
11189 }
11190 return ret
11191 }
11192
11193 result := android.GroupFixturePreparers(
11194 prepareForApexTest,
11195 java.PrepareForTestWithJavaSdkLibraryFiles,
11196 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011197 ).RunTestWithBp(t, `
11198 java_library {
11199 name: "baz-java-lib",
11200 static_libs: [
11201 "baz-lib",
11202 ],
11203 }
11204 filegroup {
11205 name: "qux-filegroup",
11206 srcs: [
11207 ":qux-lib{.generated_srcjars}",
11208 ],
11209 }
11210 filegroup {
11211 name: "qux-another-filegroup",
11212 srcs: [
11213 ":qux-filegroup",
11214 ],
11215 }
11216 java_library {
11217 name: "quux-java-lib",
11218 srcs: [
11219 "a.java",
11220 ],
11221 libs: [
11222 "quux-lib",
11223 ],
11224 }
11225 java_sdk_library {
11226 name: "foo",
11227 srcs: [
11228 ":qux-another-filegroup",
11229 ],
11230 api_packages: ["foo"],
11231 system: {
11232 enabled: true,
11233 },
11234 module_lib: {
11235 enabled: true,
11236 },
11237 test: {
11238 enabled: true,
11239 },
11240 static_libs: [
11241 "bar-lib",
11242 ],
11243 libs: [
11244 "baz-java-lib",
11245 "quux-java-lib",
11246 ],
11247 aconfig_declarations: [
11248 "bar",
11249 ],
11250 }
11251 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11252
11253 m := result.ModuleForTests("foo.stubs.source", "android_common")
11254 outDir := "out/soong/.intermediates"
11255
11256 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11257 // textproto files
11258 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11259
11260 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11261 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11262 // to aconfig.
11263 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11264 "passed as an input",
11265 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11266
11267 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11268 // to metalava as classpath. Thus the cache file provided by the associated
11269 // aconfig_declarations module "baz" should be passed to aconfig.
11270 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11271 "java_aconfig_library passed as an input",
11272 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11273
11274 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11275 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11276 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11277 "input",
11278 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11279
11280 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11281 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11282 // aconfig_declarations module "quux" should not be passed to aconfig.
11283 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11284 "depend on java_aconfig_library not passed as an input",
11285 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11286}
Cole Faust7c991b42024-05-15 11:17:55 -070011287
11288func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11289 ctx := testApex(t, `
11290 apex {
11291 name: "myapex",
11292 key: "myapex.key",
11293 prebuilts: ["myetc", "myetc2"],
11294 min_sdk_version: "29",
11295 }
11296 apex_key {
11297 name: "myapex.key",
11298 public_key: "testkey.avbpubkey",
11299 private_key: "testkey.pem",
11300 }
11301
11302 prebuilt_etc {
11303 name: "myetc",
11304 src: "myprebuilt",
11305 filename: "myfilename",
11306 }
11307 prebuilt_etc {
11308 name: "myetc2",
11309 sub_dir: "mysubdir",
11310 src: "myprebuilt",
11311 filename: "myfilename",
11312 }
11313 `, withFiles(android.MockFS{
11314 "packages/modules/common/build/allowed_deps.txt": nil,
11315 }))
11316
11317 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11318 data := android.AndroidMkDataForTest(t, ctx, ab)
11319 var builder strings.Builder
11320 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11321 androidMk := builder.String()
11322
11323 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11324 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11325}
Spandan Das50801e22024-05-13 18:29:45 +000011326
11327func TestApexMinSdkVersionOverride(t *testing.T) {
11328 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11329 args := module.Rule("apexRule").Args
11330 optFlags := args["opt_flags"]
11331 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11332 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11333 }
11334 }
11335
11336 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11337 t.Helper()
11338 found := false
11339 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11340 if dep == wantDep {
11341 found = true
11342 }
11343 })
11344 if !found {
11345 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11346 }
11347 }
11348
11349 ctx := testApex(t, `
11350 apex {
11351 name: "com.android.apex30",
11352 min_sdk_version: "30",
11353 key: "apex30.key",
11354 java_libs: ["javalib"],
11355 }
11356
11357 java_library {
11358 name: "javalib",
11359 srcs: ["A.java"],
11360 apex_available: ["com.android.apex30"],
11361 min_sdk_version: "30",
11362 sdk_version: "current",
11363 }
11364
11365 override_apex {
11366 name: "com.mycompany.android.apex30",
11367 base: "com.android.apex30",
11368 }
11369
11370 override_apex {
11371 name: "com.mycompany.android.apex31",
11372 base: "com.android.apex30",
11373 min_sdk_version: "31",
11374 }
11375
11376 apex_key {
11377 name: "apex30.key",
11378 public_key: "testkey.avbpubkey",
11379 private_key: "testkey.pem",
11380 }
11381
11382 `, android.FixtureMergeMockFs(android.MockFS{
11383 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11384 }),
11385 )
11386
11387 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11388 checkMinSdkVersion(t, baseModule, "30")
11389
11390 // Override module, but uses same min_sdk_version
11391 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11392 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11393 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11394 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11395
11396 // Override module, uses different min_sdk_version
11397 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11398 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11399 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11400 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11401}
Spandan Das0b28fa02024-05-28 23:40:17 +000011402
11403func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11404 context := android.GroupFixturePreparers(
11405 android.PrepareForIntegrationTestWithAndroid,
11406 PrepareForTestWithApexBuildComponents,
11407 android.FixtureMergeMockFs(android.MockFS{
11408 "system/sepolicy/apex/foo-file_contexts": nil,
11409 }),
11410 )
11411 res := context.RunTestWithBp(t, `
11412 apex {
11413 name: "foo",
11414 key: "myapex.key",
11415 apex_available_name: "com.android.foo",
11416 variant_version: "0",
11417 updatable: false,
11418 }
11419 apex_key {
11420 name: "myapex.key",
11421 public_key: "testkey.avbpubkey",
11422 private_key: "testkey.pem",
11423 }
11424 prebuilt_apex {
11425 name: "foo",
11426 src: "foo.apex",
11427 prefer: true,
11428 }
11429 override_apex {
11430 name: "myoverrideapex",
11431 base: "foo",
11432 }
11433 `)
11434
11435 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11436}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011437
11438func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11439 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`, `
11440 apex {
11441 name: "myapex",
11442 key: "myapex.key",
11443 updatable: true,
11444 min_sdk_version: "current",
11445 }
11446
11447 apex_key {
11448 name: "myapex.key",
11449 public_key: "testkey.avbpubkey",
11450 private_key: "testkey.pem",
11451 }
11452 `)
11453}
Spandan Das2f68f192024-07-22 19:25:50 +000011454
11455func TestPrebuiltStubNoinstall(t *testing.T) {
11456 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11457 result := android.GroupFixturePreparers(
11458 prepareForApexTest,
11459 android.PrepareForTestWithAndroidMk,
11460 android.PrepareForTestWithMakevars,
11461 android.FixtureMergeMockFs(fs),
11462 ).RunTest(t)
11463
11464 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011465 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011466
11467 installRules := result.InstallMakeRulesForTesting(t)
11468
11469 var installedlibRule *android.InstallMakeRule
11470 for i, rule := range installRules {
11471 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11472 if installedlibRule != nil {
11473 t.Errorf("Duplicate install rules for %s", rule.Target)
11474 }
11475 installedlibRule = &installRules[i]
11476 }
11477 }
11478 if installedlibRule == nil {
11479 t.Errorf("No install rule found for installedlib")
11480 return
11481 }
11482
11483 if expectLibfooOnSystemLib {
11484 android.AssertStringListContains(t,
11485 "installedlib doesn't have install dependency on libfoo impl",
11486 installedlibRule.OrderOnlyDeps,
11487 "out/target/product/test_device/system/lib/libfoo.so")
11488 } else {
11489 android.AssertStringListDoesNotContain(t,
11490 "installedlib has install dependency on libfoo stub",
11491 installedlibRule.Deps,
11492 "out/target/product/test_device/system/lib/libfoo.so")
11493 android.AssertStringListDoesNotContain(t,
11494 "installedlib has order-only install dependency on libfoo stub",
11495 installedlibRule.OrderOnlyDeps,
11496 "out/target/product/test_device/system/lib/libfoo.so")
11497 }
11498 }
11499
11500 prebuiltLibfooBp := []byte(`
11501 cc_prebuilt_library {
11502 name: "libfoo",
11503 prefer: true,
11504 srcs: ["libfoo.so"],
11505 stubs: {
11506 versions: ["1"],
11507 },
11508 apex_available: ["apexfoo"],
11509 }
11510 `)
11511
11512 apexfooBp := []byte(`
11513 apex {
11514 name: "apexfoo",
11515 key: "apexfoo.key",
11516 native_shared_libs: ["libfoo"],
11517 updatable: false,
11518 compile_multilib: "both",
11519 }
11520 apex_key {
11521 name: "apexfoo.key",
11522 public_key: "testkey.avbpubkey",
11523 private_key: "testkey.pem",
11524 }
11525 `)
11526
11527 installedlibBp := []byte(`
11528 cc_library {
11529 name: "installedlib",
11530 shared_libs: ["libfoo"],
11531 }
11532 `)
11533
11534 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11535 testFunc(
11536 t,
11537 /*expectLibfooOnSystemLib=*/ false,
11538 android.MockFS{
11539 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11540 "apexfoo/Android.bp": apexfooBp,
11541 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11542 "Android.bp": installedlibBp,
11543 },
11544 )
11545 })
11546
11547 disabledSourceLibfooBp := []byte(`
11548 cc_library {
11549 name: "libfoo",
11550 enabled: false,
11551 stubs: {
11552 versions: ["1"],
11553 },
11554 apex_available: ["apexfoo"],
11555 }
11556 `)
11557
11558 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11559 testFunc(
11560 t,
11561 /*expectLibfooOnSystemLib=*/ false,
11562 android.MockFS{
11563 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11564 "impl/Android.bp": disabledSourceLibfooBp,
11565 "apexfoo/Android.bp": apexfooBp,
11566 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11567 "Android.bp": installedlibBp,
11568 },
11569 )
11570 })
11571}
Jihoon Kange246bb72024-09-18 22:26:22 +000011572
11573func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11574 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11575 // in libs of android_app and java_library does not lead to class loader context device/host
11576 // path mismatch errors.
11577 android.GroupFixturePreparers(
11578 prepareForApexTest,
11579 android.PrepareForIntegrationTestWithAndroid,
11580 PrepareForTestWithApexBuildComponents,
11581 android.FixtureModifyEnv(func(env map[string]string) {
11582 env["DISABLE_CONTAINER_CHECK"] = "true"
11583 }),
11584 withFiles(filesForSdkLibrary),
11585 android.FixtureMergeMockFs(android.MockFS{
11586 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11587 }),
11588 ).RunTestWithBp(t, `
11589 apex {
11590 name: "com.android.foo30",
11591 key: "myapex.key",
11592 updatable: true,
11593 bootclasspath_fragments: [
11594 "foo-bootclasspath-fragment",
11595 ],
11596 java_libs: [
11597 "bar",
11598 ],
11599 apps: [
11600 "bar-app",
11601 ],
11602 min_sdk_version: "30",
11603 }
11604 apex_key {
11605 name: "myapex.key",
11606 public_key: "testkey.avbpubkey",
11607 private_key: "testkey.pem",
11608 }
11609 bootclasspath_fragment {
11610 name: "foo-bootclasspath-fragment",
11611 contents: [
11612 "framework-foo",
11613 ],
11614 apex_available: [
11615 "com.android.foo30",
11616 ],
11617 hidden_api: {
11618 split_packages: ["*"]
11619 },
11620 }
11621
11622 java_sdk_library {
11623 name: "framework-foo",
11624 srcs: [
11625 "A.java"
11626 ],
11627 unsafe_ignore_missing_latest_api: true,
11628 apex_available: [
11629 "com.android.foo30",
11630 ],
11631 compile_dex: true,
11632 sdk_version: "core_current",
11633 shared_library: false,
11634 }
11635
11636 java_library {
11637 name: "bar",
11638 srcs: [
11639 "A.java"
11640 ],
11641 libs: [
11642 "framework-foo.impl",
11643 ],
11644 apex_available: [
11645 "com.android.foo30",
11646 ],
11647 sdk_version: "core_current",
11648 }
11649
11650 java_library {
11651 name: "baz",
11652 srcs: [
11653 "A.java"
11654 ],
11655 libs: [
11656 "bar",
11657 ],
11658 sdk_version: "core_current",
11659 }
11660
11661 android_app {
11662 name: "bar-app",
11663 srcs: [
11664 "A.java"
11665 ],
11666 libs: [
11667 "baz",
11668 "framework-foo.impl",
11669 ],
11670 apex_available: [
11671 "com.android.foo30",
11672 ],
11673 sdk_version: "core_current",
11674 min_sdk_version: "30",
11675 manifest: "AndroidManifest.xml",
11676 }
11677 `)
11678}