blob: c45c1e42e820cb42bd4a3f2f4094f5e545b445b7 [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 Das2069c3f2023-12-06 19:40:24 +00003688 deapexer := ctx.ModuleForTests(moduleName+".deapexer", 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
4962 java_import {
4963 name: "libfoo",
4964 jars: ["libfoo.jar"],
4965 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004966 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00004967 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004968 }
Paul Duffin37856732021-02-26 14:24:15 +00004969
4970 java_sdk_library_import {
4971 name: "libbar",
4972 public: {
4973 jars: ["libbar.jar"],
4974 },
4975 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004976 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004977 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004978 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004979 `
4980
Paul Duffin89f570a2021-06-16 01:42:33 +01004981 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004982
Paul Duffin537ea3d2021-05-14 10:38:00 +01004983 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00004984 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01004985 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004986 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004987 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01004988 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 +01004989 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004990 })
4991
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004992 t.Run("apex_set only", func(t *testing.T) {
4993 bp := `
4994 apex_set {
4995 name: "myapex",
4996 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004997 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04004998 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
4999 }
5000
Paul Duffin89f570a2021-06-16 01:42:33 +01005001 prebuilt_bootclasspath_fragment {
5002 name: "my-bootclasspath-fragment",
5003 contents: ["libfoo", "libbar"],
5004 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005005 hidden_api: {
5006 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5007 metadata: "my-bootclasspath-fragment/metadata.csv",
5008 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005009 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5010 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5011 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005012 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005013 }
5014
Liz Kammer2dc72442023-04-20 10:10:48 -04005015 prebuilt_systemserverclasspath_fragment {
5016 name: "my-systemserverclasspath-fragment",
5017 contents: ["libbaz"],
5018 apex_available: ["myapex"],
5019 }
5020
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005021 java_import {
5022 name: "libfoo",
5023 jars: ["libfoo.jar"],
5024 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005025 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005026 }
5027
5028 java_sdk_library_import {
5029 name: "libbar",
5030 public: {
5031 jars: ["libbar.jar"],
5032 },
5033 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005034 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005035 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005036 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005037
5038 java_sdk_library_import {
5039 name: "libbaz",
5040 public: {
5041 jars: ["libbaz.jar"],
5042 },
5043 apex_available: ["myapex"],
5044 shared_library: false,
5045 permitted_packages: ["baz"],
5046 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005047 `
5048
Paul Duffin89f570a2021-06-16 01:42:33 +01005049 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005050
Paul Duffin537ea3d2021-05-14 10:38:00 +01005051 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005052 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005053 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005054 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005055 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005056 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 +01005057 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005058
5059 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5060
5061 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005062 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005063 "myjavalib.myapex",
5064 "libfoo.myapex",
5065 "libbar.myapex",
5066 "libbaz.myapex",
5067 }
5068 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5069 for i, e := range mkEntries {
5070 g := e.OverrideName
5071 if w := overrideNames[i]; w != g {
5072 t.Errorf("Expected override name %q, got %q", w, g)
5073 }
5074 }
5075
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005076 })
5077
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005078 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5079 bp := `
5080 prebuilt_apex {
5081 name: "myapex",
5082 arch: {
5083 arm64: {
5084 src: "myapex-arm64.apex",
5085 },
5086 arm: {
5087 src: "myapex-arm.apex",
5088 },
5089 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005090 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5091 }
5092
5093 prebuilt_bootclasspath_fragment {
5094 name: "my-bootclasspath-fragment",
5095 contents: ["libfoo", "libbar"],
5096 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005097 hidden_api: {
5098 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5099 metadata: "my-bootclasspath-fragment/metadata.csv",
5100 index: "my-bootclasspath-fragment/index.csv",
5101 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5102 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5103 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005104 }
5105
5106 java_import {
5107 name: "libfoo",
5108 jars: ["libfoo.jar"],
5109 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005110 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005111 }
5112
5113 java_library {
5114 name: "libfoo",
5115 srcs: ["foo/bar/MyClass.java"],
5116 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005117 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005118 }
Paul Duffin37856732021-02-26 14:24:15 +00005119
5120 java_sdk_library_import {
5121 name: "libbar",
5122 public: {
5123 jars: ["libbar.jar"],
5124 },
5125 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005126 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005127 }
5128
5129 java_sdk_library {
5130 name: "libbar",
5131 srcs: ["foo/bar/MyClass.java"],
5132 unsafe_ignore_missing_latest_api: true,
5133 apex_available: ["myapex"],
5134 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 `
5136
5137 // In this test the source (java_library) libfoo is active since the
5138 // prebuilt (java_import) defaults to prefer:false. However the
5139 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5140 // find the dex boot jar in it. We either need to disable the source libfoo
5141 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005142 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005143 // dexbootjar check is skipped if AllowMissingDependencies is true
5144 preparerAllowMissingDeps := android.GroupFixturePreparers(
5145 preparer,
5146 android.PrepareForTestWithAllowMissingDependencies,
5147 )
5148 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005149 })
5150
5151 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5152 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005153 apex {
5154 name: "myapex",
5155 key: "myapex.key",
5156 updatable: false,
5157 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5158 }
5159
5160 apex_key {
5161 name: "myapex.key",
5162 public_key: "testkey.avbpubkey",
5163 private_key: "testkey.pem",
5164 }
5165
5166 bootclasspath_fragment {
5167 name: "my-bootclasspath-fragment",
5168 contents: ["libfoo", "libbar"],
5169 apex_available: ["myapex"],
5170 hidden_api: {
5171 split_packages: ["*"],
5172 },
5173 }
5174
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005175 prebuilt_apex {
5176 name: "myapex",
5177 arch: {
5178 arm64: {
5179 src: "myapex-arm64.apex",
5180 },
5181 arm: {
5182 src: "myapex-arm.apex",
5183 },
5184 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005185 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5186 }
5187
5188 prebuilt_bootclasspath_fragment {
5189 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005190 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005191 contents: ["libfoo", "libbar"],
5192 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005193 hidden_api: {
5194 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5195 metadata: "my-bootclasspath-fragment/metadata.csv",
5196 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005197 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5198 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5199 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005200 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005201 }
5202
5203 java_import {
5204 name: "libfoo",
5205 prefer: true,
5206 jars: ["libfoo.jar"],
5207 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005209 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005210 }
5211
5212 java_library {
5213 name: "libfoo",
5214 srcs: ["foo/bar/MyClass.java"],
5215 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005216 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005217 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 }
Paul Duffin37856732021-02-26 14:24:15 +00005219
5220 java_sdk_library_import {
5221 name: "libbar",
5222 prefer: true,
5223 public: {
5224 jars: ["libbar.jar"],
5225 },
5226 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005227 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005228 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005229 }
5230
5231 java_sdk_library {
5232 name: "libbar",
5233 srcs: ["foo/bar/MyClass.java"],
5234 unsafe_ignore_missing_latest_api: true,
5235 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005236 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005237 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005238 `
5239
Paul Duffin89f570a2021-06-16 01:42:33 +01005240 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005241
Paul Duffin537ea3d2021-05-14 10:38:00 +01005242 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005243 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005244 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005245 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005246 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005247 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 +01005248 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005249 })
5250
5251 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5252 bp := `
5253 apex {
5254 name: "myapex",
5255 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005256 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005257 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005258 }
5259
5260 apex_key {
5261 name: "myapex.key",
5262 public_key: "testkey.avbpubkey",
5263 private_key: "testkey.pem",
5264 }
5265
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005266 bootclasspath_fragment {
5267 name: "my-bootclasspath-fragment",
5268 contents: ["libfoo", "libbar"],
5269 apex_available: ["myapex"],
5270 hidden_api: {
5271 split_packages: ["*"],
5272 },
5273 }
5274
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005275 prebuilt_apex {
5276 name: "myapex",
5277 arch: {
5278 arm64: {
5279 src: "myapex-arm64.apex",
5280 },
5281 arm: {
5282 src: "myapex-arm.apex",
5283 },
5284 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005285 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5286 }
5287
5288 prebuilt_bootclasspath_fragment {
5289 name: "my-bootclasspath-fragment",
5290 contents: ["libfoo", "libbar"],
5291 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005292 hidden_api: {
5293 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5294 metadata: "my-bootclasspath-fragment/metadata.csv",
5295 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005296 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5297 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5298 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005299 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 }
5301
5302 java_import {
5303 name: "libfoo",
5304 jars: ["libfoo.jar"],
5305 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005306 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005307 }
5308
5309 java_library {
5310 name: "libfoo",
5311 srcs: ["foo/bar/MyClass.java"],
5312 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005313 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005314 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005315 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005316 }
Paul Duffin37856732021-02-26 14:24:15 +00005317
5318 java_sdk_library_import {
5319 name: "libbar",
5320 public: {
5321 jars: ["libbar.jar"],
5322 },
5323 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005324 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005325 }
5326
5327 java_sdk_library {
5328 name: "libbar",
5329 srcs: ["foo/bar/MyClass.java"],
5330 unsafe_ignore_missing_latest_api: true,
5331 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005332 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005333 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005334 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005335 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005336 `
5337
Paul Duffin89f570a2021-06-16 01:42:33 +01005338 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005339
Paul Duffin537ea3d2021-05-14 10:38:00 +01005340 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005341 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005342 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5343 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005344 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5345 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 +01005346 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 })
5348
5349 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5350 bp := `
5351 apex {
5352 name: "myapex",
5353 enabled: false,
5354 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005355 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 }
5357
5358 apex_key {
5359 name: "myapex.key",
5360 public_key: "testkey.avbpubkey",
5361 private_key: "testkey.pem",
5362 }
5363
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005364 bootclasspath_fragment {
5365 name: "my-bootclasspath-fragment",
5366 enabled: false,
5367 contents: ["libfoo", "libbar"],
5368 apex_available: ["myapex"],
5369 hidden_api: {
5370 split_packages: ["*"],
5371 },
5372 }
5373
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 prebuilt_apex {
5375 name: "myapex",
5376 arch: {
5377 arm64: {
5378 src: "myapex-arm64.apex",
5379 },
5380 arm: {
5381 src: "myapex-arm.apex",
5382 },
5383 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005384 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5385 }
5386
5387 prebuilt_bootclasspath_fragment {
5388 name: "my-bootclasspath-fragment",
5389 contents: ["libfoo", "libbar"],
5390 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005391 hidden_api: {
5392 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5393 metadata: "my-bootclasspath-fragment/metadata.csv",
5394 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005395 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5396 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5397 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005398 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 }
5400
5401 java_import {
5402 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005403 jars: ["libfoo.jar"],
5404 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005405 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005406 }
5407
5408 java_library {
5409 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005410 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 srcs: ["foo/bar/MyClass.java"],
5412 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005413 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005414 }
Paul Duffin37856732021-02-26 14:24:15 +00005415
5416 java_sdk_library_import {
5417 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005418 public: {
5419 jars: ["libbar.jar"],
5420 },
5421 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005422 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005423 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005424 }
5425
5426 java_sdk_library {
5427 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005428 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005429 srcs: ["foo/bar/MyClass.java"],
5430 unsafe_ignore_missing_latest_api: true,
5431 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005432 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005433 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005434 `
Cole Fausta963b942024-04-11 17:43:00 -07005435 // This test disables libbar, which causes the ComponentDepsMutator to add
5436 // deps on libbar.stubs and other sub-modules that don't exist. We can
5437 // enable AllowMissingDependencies to work around that, but enabling that
5438 // causes extra checks for missing source files to dex_bootjars, so add those
5439 // to the mock fs as well.
5440 preparer2 := android.GroupFixturePreparers(
5441 preparer,
5442 android.PrepareForTestWithAllowMissingDependencies,
5443 android.FixtureMergeMockFs(map[string][]byte{
5444 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5445 "frameworks/base/config/boot-profile.txt": nil,
5446 }),
5447 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448
Cole Fausta963b942024-04-11 17:43:00 -07005449 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005450
Paul Duffin537ea3d2021-05-14 10:38:00 +01005451 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005452 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005453 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005454 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005455 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005456 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 +01005457 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005458 })
Spandan Das3a392012024-01-17 18:26:27 +00005459
Spandan Dasf2c10572024-02-27 04:49:52 +00005460 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005461 bp := `
5462 // Source
5463 apex {
5464 name: "myapex",
5465 enabled: false,
5466 key: "myapex.key",
5467 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5468 }
5469
5470 apex_key {
5471 name: "myapex.key",
5472 public_key: "testkey.avbpubkey",
5473 private_key: "testkey.pem",
5474 }
5475
5476 // Prebuilt
5477 prebuilt_apex {
5478 name: "myapex.v1",
5479 source_apex_name: "myapex",
5480 arch: {
5481 arm64: {
5482 src: "myapex-arm64.apex",
5483 },
5484 arm: {
5485 src: "myapex-arm.apex",
5486 },
5487 },
5488 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5489 prefer: true,
5490 }
5491 prebuilt_apex {
5492 name: "myapex.v2",
5493 source_apex_name: "myapex",
5494 arch: {
5495 arm64: {
5496 src: "myapex-arm64.apex",
5497 },
5498 arm: {
5499 src: "myapex-arm.apex",
5500 },
5501 },
5502 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5503 prefer: true,
5504 }
5505
5506 prebuilt_bootclasspath_fragment {
5507 name: "my-bootclasspath-fragment",
5508 contents: ["libfoo", "libbar"],
5509 apex_available: ["myapex"],
5510 hidden_api: {
5511 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5512 metadata: "my-bootclasspath-fragment/metadata.csv",
5513 index: "my-bootclasspath-fragment/index.csv",
5514 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5515 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5516 },
5517 prefer: true,
5518 }
5519
5520 java_import {
5521 name: "libfoo",
5522 jars: ["libfoo.jar"],
5523 apex_available: ["myapex"],
5524 prefer: true,
5525 }
5526 java_import {
5527 name: "libbar",
5528 jars: ["libbar.jar"],
5529 apex_available: ["myapex"],
5530 prefer: true,
5531 }
5532 `
5533
Spandan Dasf2c10572024-02-27 04:49:52 +00005534 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 +00005535 })
5536
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005537}
5538
Roland Levillain630846d2019-06-26 12:48:34 +01005539func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005540 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005541 apex_test {
5542 name: "myapex",
5543 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005544 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005545 tests: [
5546 "mytest",
5547 ],
5548 }
5549
5550 apex_key {
5551 name: "myapex.key",
5552 public_key: "testkey.avbpubkey",
5553 private_key: "testkey.pem",
5554 }
5555
Liz Kammer1c14a212020-05-12 15:26:55 -07005556 filegroup {
5557 name: "fg",
5558 srcs: [
5559 "baz",
5560 "bar/baz"
5561 ],
5562 }
5563
Roland Levillain630846d2019-06-26 12:48:34 +01005564 cc_test {
5565 name: "mytest",
5566 gtest: false,
5567 srcs: ["mytest.cpp"],
5568 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005569 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005570 system_shared_libs: [],
5571 static_executable: true,
5572 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005573 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005574 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005575
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005576 cc_library {
5577 name: "mylib",
5578 srcs: ["mylib.cpp"],
5579 system_shared_libs: [],
5580 stl: "none",
5581 }
5582
Liz Kammer5bd365f2020-05-27 15:15:11 -07005583 filegroup {
5584 name: "fg2",
5585 srcs: [
5586 "testdata/baz"
5587 ],
5588 }
Roland Levillain630846d2019-06-26 12:48:34 +01005589 `)
5590
Jooyung Hana0503a52023-08-23 13:12:50 +09005591 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005592 copyCmds := apexRule.Args["copy_commands"]
5593
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005594 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005595 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005597
Liz Kammer1c14a212020-05-12 15:26:55 -07005598 //Ensure that test data are copied into apex.
5599 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5600 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5601
Roland Levillainf89cd092019-07-29 16:22:59 +01005602 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005603 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005604 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005605 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005606 prefix := "TARGET_"
5607 var builder strings.Builder
5608 data.Custom(&builder, name, prefix, "", data)
5609 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005610 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005611 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005612}
5613
Jooyung Hand48f3c32019-08-23 11:18:57 +09005614func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5615 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5616 apex {
5617 name: "myapex",
5618 key: "myapex.key",
5619 native_shared_libs: ["libfoo"],
5620 }
5621
5622 apex_key {
5623 name: "myapex.key",
5624 public_key: "testkey.avbpubkey",
5625 private_key: "testkey.pem",
5626 }
5627
5628 cc_library {
5629 name: "libfoo",
5630 stl: "none",
5631 system_shared_libs: [],
5632 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005633 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005634 }
5635 `)
5636 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5637 apex {
5638 name: "myapex",
5639 key: "myapex.key",
5640 java_libs: ["myjar"],
5641 }
5642
5643 apex_key {
5644 name: "myapex.key",
5645 public_key: "testkey.avbpubkey",
5646 private_key: "testkey.pem",
5647 }
5648
5649 java_library {
5650 name: "myjar",
5651 srcs: ["foo/bar/MyClass.java"],
5652 sdk_version: "none",
5653 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005654 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005655 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005656 }
5657 `)
5658}
5659
Bill Peckhama41a6962021-01-11 10:58:54 -08005660func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005661 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005662 apex {
5663 name: "myapex",
5664 key: "myapex.key",
5665 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005666 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005667 }
5668
5669 apex_key {
5670 name: "myapex.key",
5671 public_key: "testkey.avbpubkey",
5672 private_key: "testkey.pem",
5673 }
5674
5675 java_import {
5676 name: "myjavaimport",
5677 apex_available: ["myapex"],
5678 jars: ["my.jar"],
5679 compile_dex: true,
5680 }
5681 `)
5682
Jooyung Hana0503a52023-08-23 13:12:50 +09005683 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005684 apexRule := module.Rule("apexRule")
5685 copyCmds := apexRule.Args["copy_commands"]
5686 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5687}
5688
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005689func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005690 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005691 apex {
5692 name: "myapex",
5693 key: "myapex.key",
5694 apps: [
5695 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005696 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005697 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005698 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005699 }
5700
5701 apex_key {
5702 name: "myapex.key",
5703 public_key: "testkey.avbpubkey",
5704 private_key: "testkey.pem",
5705 }
5706
5707 android_app {
5708 name: "AppFoo",
5709 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005710 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005711 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005712 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005713 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005715 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005716 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005717
5718 android_app {
5719 name: "AppFooPriv",
5720 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005721 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005722 system_modules: "none",
5723 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005724 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005725 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005726 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005727 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005728
5729 cc_library_shared {
5730 name: "libjni",
5731 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005732 shared_libs: ["libfoo"],
5733 stl: "none",
5734 system_shared_libs: [],
5735 apex_available: [ "myapex" ],
5736 sdk_version: "current",
5737 }
5738
5739 cc_library_shared {
5740 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005741 stl: "none",
5742 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005743 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005744 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005745 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005746 `)
5747
Jooyung Hana0503a52023-08-23 13:12:50 +09005748 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005749 apexRule := module.Rule("apexRule")
5750 copyCmds := apexRule.Args["copy_commands"]
5751
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005752 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5753 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005754 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005755
Colin Crossaede88c2020-08-11 12:17:01 -07005756 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005757 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005758 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005759 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005760 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005761 // JNI libraries including transitive deps are
5762 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005763 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005764 // ... embedded inside APK (jnilibs.zip)
5765 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5766 // ... and not directly inside the APEX
5767 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5768 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005769
5770 apexBundle := module.Module().(*apexBundle)
5771 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5772 var builder strings.Builder
5773 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5774 androidMk := builder.String()
5775 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5776 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5777 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5778 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5779 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5780 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 +01005781}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005782
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005783func TestApexWithAppImportBuildId(t *testing.T) {
5784 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5785 for _, id := range invalidBuildIds {
5786 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5787 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5788 variables.BuildId = proptools.StringPtr(id)
5789 })
5790 testApexError(t, message, `apex {
5791 name: "myapex",
5792 key: "myapex.key",
5793 apps: ["AppFooPrebuilt"],
5794 updatable: false,
5795 }
5796
5797 apex_key {
5798 name: "myapex.key",
5799 public_key: "testkey.avbpubkey",
5800 private_key: "testkey.pem",
5801 }
5802
5803 android_app_import {
5804 name: "AppFooPrebuilt",
5805 apk: "PrebuiltAppFoo.apk",
5806 presigned: true,
5807 apex_available: ["myapex"],
5808 }
5809 `, fixture)
5810 }
5811}
5812
Dario Frenicde2a032019-10-27 00:29:22 +01005813func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005814 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005815 apex {
5816 name: "myapex",
5817 key: "myapex.key",
5818 apps: [
5819 "AppFooPrebuilt",
5820 "AppFooPrivPrebuilt",
5821 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005822 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005823 }
5824
5825 apex_key {
5826 name: "myapex.key",
5827 public_key: "testkey.avbpubkey",
5828 private_key: "testkey.pem",
5829 }
5830
5831 android_app_import {
5832 name: "AppFooPrebuilt",
5833 apk: "PrebuiltAppFoo.apk",
5834 presigned: true,
5835 dex_preopt: {
5836 enabled: false,
5837 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005838 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005839 }
5840
5841 android_app_import {
5842 name: "AppFooPrivPrebuilt",
5843 apk: "PrebuiltAppFooPriv.apk",
5844 privileged: true,
5845 presigned: true,
5846 dex_preopt: {
5847 enabled: false,
5848 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005849 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005850 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005851 }
5852 `)
5853
Jooyung Hana0503a52023-08-23 13:12:50 +09005854 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01005855 apexRule := module.Rule("apexRule")
5856 copyCmds := apexRule.Args["copy_commands"]
5857
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005858 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5859 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005860}
5861
5862func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005863 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005864 apex {
5865 name: "myapex",
5866 key: "myapex.key",
5867 apps: [
5868 "AppFoo",
5869 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005870 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005871 }
5872
5873 apex_key {
5874 name: "myapex.key",
5875 public_key: "testkey.avbpubkey",
5876 private_key: "testkey.pem",
5877 }
5878
5879 android_app {
5880 name: "AppFoo",
5881 srcs: ["foo/bar/MyClass.java"],
5882 sdk_version: "none",
5883 system_modules: "none",
5884 apex_available: [ "myapex" ],
5885 }
5886
5887 android_app_import {
5888 name: "AppFoo",
5889 apk: "AppFooPrebuilt.apk",
5890 filename: "AppFooPrebuilt.apk",
5891 presigned: true,
5892 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005893 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005894 }
5895 `, withFiles(map[string][]byte{
5896 "AppFooPrebuilt.apk": nil,
5897 }))
5898
Jooyung Hana0503a52023-08-23 13:12:50 +09005899 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005900 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005901 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005902}
5903
Dario Freni6f3937c2019-12-20 22:58:03 +00005904func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005905 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005906 apex {
5907 name: "myapex",
5908 key: "myapex.key",
5909 apps: [
5910 "TesterHelpAppFoo",
5911 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005912 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005913 }
5914
5915 apex_key {
5916 name: "myapex.key",
5917 public_key: "testkey.avbpubkey",
5918 private_key: "testkey.pem",
5919 }
5920
5921 android_test_helper_app {
5922 name: "TesterHelpAppFoo",
5923 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005924 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005925 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00005926 }
5927
5928 `)
5929
Jooyung Hana0503a52023-08-23 13:12:50 +09005930 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00005931 apexRule := module.Rule("apexRule")
5932 copyCmds := apexRule.Args["copy_commands"]
5933
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005934 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005935}
5936
Jooyung Han18020ea2019-11-13 10:50:48 +09005937func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5938 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005939 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005940 apex {
5941 name: "myapex",
5942 key: "myapex.key",
5943 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005944 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005945 }
5946
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }
5952
5953 apex {
5954 name: "otherapex",
5955 key: "myapex.key",
5956 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005957 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005958 }
5959
5960 cc_defaults {
5961 name: "libfoo-defaults",
5962 apex_available: ["otherapex"],
5963 }
5964
5965 cc_library {
5966 name: "libfoo",
5967 defaults: ["libfoo-defaults"],
5968 stl: "none",
5969 system_shared_libs: [],
5970 }`)
5971}
5972
Paul Duffine52e66f2020-03-30 17:54:29 +01005973func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005974 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005975 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005976 apex {
5977 name: "myapex",
5978 key: "myapex.key",
5979 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005980 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005981 }
5982
5983 apex_key {
5984 name: "myapex.key",
5985 public_key: "testkey.avbpubkey",
5986 private_key: "testkey.pem",
5987 }
5988
5989 apex {
5990 name: "otherapex",
5991 key: "otherapex.key",
5992 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005993 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005994 }
5995
5996 apex_key {
5997 name: "otherapex.key",
5998 public_key: "testkey.avbpubkey",
5999 private_key: "testkey.pem",
6000 }
6001
6002 cc_library {
6003 name: "libfoo",
6004 stl: "none",
6005 system_shared_libs: [],
6006 apex_available: ["otherapex"],
6007 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006008}
Jiyong Park127b40b2019-09-30 16:04:35 +09006009
Paul Duffine52e66f2020-03-30 17:54:29 +01006010func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006011 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006012 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006013.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006014.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006015.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006016.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006017.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006018.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006019 apex {
6020 name: "myapex",
6021 key: "myapex.key",
6022 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006023 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006024 }
6025
6026 apex_key {
6027 name: "myapex.key",
6028 public_key: "testkey.avbpubkey",
6029 private_key: "testkey.pem",
6030 }
6031
Jiyong Park127b40b2019-09-30 16:04:35 +09006032 cc_library {
6033 name: "libfoo",
6034 stl: "none",
6035 shared_libs: ["libbar"],
6036 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006037 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006038 }
6039
6040 cc_library {
6041 name: "libbar",
6042 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006043 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006044 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006045 apex_available: ["myapex"],
6046 }
6047
6048 cc_library {
6049 name: "libbaz",
6050 stl: "none",
6051 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006052 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006053}
Jiyong Park127b40b2019-09-30 16:04:35 +09006054
Liz Kammer5f108fa2023-05-11 14:33:17 -04006055func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6056 testApex(t, `
6057 apex {
6058 name: "myapex",
6059 key: "myapex.key",
6060 native_shared_libs: ["libfoo"],
6061 updatable: false,
6062 }
6063
6064 apex_key {
6065 name: "myapex.key",
6066 public_key: "testkey.avbpubkey",
6067 private_key: "testkey.pem",
6068 }
6069
6070 cc_library {
6071 name: "libfoo",
6072 stl: "none",
6073 static_libs: ["libbar"],
6074 system_shared_libs: [],
6075 apex_available: ["myapex"],
6076 }
6077
6078 cc_library {
6079 name: "libbar",
6080 stl: "none",
6081 shared_libs: ["libbaz"],
6082 system_shared_libs: [],
6083 apex_available: ["myapex"],
6084 }
6085
6086 cc_library {
6087 name: "libbaz",
6088 stl: "none",
6089 system_shared_libs: [],
6090 }`)
6091
6092 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6093 apex {
6094 name: "myapex",
6095 key: "myapex.key",
6096 native_shared_libs: ["libfoo"],
6097 updatable: false,
6098 }
6099
6100 apex_key {
6101 name: "myapex.key",
6102 public_key: "testkey.avbpubkey",
6103 private_key: "testkey.pem",
6104 }
6105
6106 cc_library {
6107 name: "libfoo",
6108 stl: "none",
6109 static_libs: ["libbar"],
6110 system_shared_libs: [],
6111 apex_available: ["myapex"],
6112 }
6113
6114 cc_library {
6115 name: "libbar",
6116 stl: "none",
6117 system_shared_libs: [],
6118 }`)
6119}
6120
Paul Duffine52e66f2020-03-30 17:54:29 +01006121func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006122 testApexError(t, "\"otherapex\" is not a valid module name", `
6123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006127 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006128 }
6129
6130 apex_key {
6131 name: "myapex.key",
6132 public_key: "testkey.avbpubkey",
6133 private_key: "testkey.pem",
6134 }
6135
6136 cc_library {
6137 name: "libfoo",
6138 stl: "none",
6139 system_shared_libs: [],
6140 apex_available: ["otherapex"],
6141 }`)
6142
Paul Duffine52e66f2020-03-30 17:54:29 +01006143 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006144 apex {
6145 name: "myapex",
6146 key: "myapex.key",
6147 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006148 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006149 }
6150
6151 apex_key {
6152 name: "myapex.key",
6153 public_key: "testkey.avbpubkey",
6154 private_key: "testkey.pem",
6155 }
6156
6157 cc_library {
6158 name: "libfoo",
6159 stl: "none",
6160 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006161 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006162 apex_available: ["myapex"],
6163 }
6164
6165 cc_library {
6166 name: "libbar",
6167 stl: "none",
6168 system_shared_libs: [],
6169 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006170 }
6171
6172 cc_library {
6173 name: "libbaz",
6174 stl: "none",
6175 system_shared_libs: [],
6176 stubs: {
6177 versions: ["10", "20", "30"],
6178 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006179 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006180}
Jiyong Park127b40b2019-09-30 16:04:35 +09006181
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006182func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6183 t.Run("negative variant_version produces error", func(t *testing.T) {
6184 testApexError(t, "expected an integer between 0-9; got -1", `
6185 apex {
6186 name: "myapex",
6187 key: "myapex.key",
6188 apex_available_name: "com.android.foo",
6189 variant_version: "-1",
6190 updatable: false,
6191 }
6192 apex_key {
6193 name: "myapex.key",
6194 public_key: "testkey.avbpubkey",
6195 private_key: "testkey.pem",
6196 }
6197 `)
6198 })
6199
6200 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6201 testApexError(t, "expected an integer between 0-9; got 10", `
6202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 apex_available_name: "com.android.foo",
6206 variant_version: "10",
6207 updatable: false,
6208 }
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214 `)
6215 })
6216}
6217
6218func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6219 context := android.GroupFixturePreparers(
6220 android.PrepareForIntegrationTestWithAndroid,
6221 PrepareForTestWithApexBuildComponents,
6222 android.FixtureMergeMockFs(android.MockFS{
6223 "system/sepolicy/apex/foo-file_contexts": nil,
6224 "system/sepolicy/apex/bar-file_contexts": nil,
6225 }),
6226 )
6227 result := context.RunTestWithBp(t, `
6228 apex {
6229 name: "foo",
6230 key: "myapex.key",
6231 apex_available_name: "com.android.foo",
6232 variant_version: "0",
6233 updatable: false,
6234 }
6235 apex {
6236 name: "bar",
6237 key: "myapex.key",
6238 apex_available_name: "com.android.foo",
6239 variant_version: "3",
6240 updatable: false,
6241 }
6242 apex_key {
6243 name: "myapex.key",
6244 public_key: "testkey.avbpubkey",
6245 private_key: "testkey.pem",
6246 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006247 override_apex {
6248 name: "myoverrideapex",
6249 base: "bar",
6250 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006251 `)
6252
Jooyung Hana0503a52023-08-23 13:12:50 +09006253 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006254 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6255 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6256 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6257 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6258 }
6259
Jooyung Hana0503a52023-08-23 13:12:50 +09006260 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006261 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6262 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6263 barActualDefaultVersion := barManifestRule.Args["default_version"]
6264 if barActualDefaultVersion != barExpectedDefaultVersion {
6265 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6266 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006267
Spandan Das50801e22024-05-13 18:29:45 +00006268 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006269 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6270 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6271 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6272 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006273}
6274
Sam Delmericoca816532023-06-02 14:09:50 -04006275func TestApexAvailable_ApexAvailableName(t *testing.T) {
6276 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6277 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6278 apex {
6279 name: "myapex_sminus",
6280 key: "myapex.key",
6281 apps: ["AppFoo"],
6282 apex_available_name: "myapex",
6283 updatable: false,
6284 }
6285 apex {
6286 name: "myapex",
6287 key: "myapex.key",
6288 apps: ["AppFoo"],
6289 updatable: false,
6290 }
6291 apex_key {
6292 name: "myapex.key",
6293 public_key: "testkey.avbpubkey",
6294 private_key: "testkey.pem",
6295 }
6296 android_app {
6297 name: "AppFoo",
6298 srcs: ["foo/bar/MyClass.java"],
6299 sdk_version: "none",
6300 system_modules: "none",
6301 apex_available: [ "myapex_sminus" ],
6302 }`,
6303 android.FixtureMergeMockFs(android.MockFS{
6304 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6305 }),
6306 )
6307 })
6308
6309 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6310 testApex(t, `
6311 apex {
6312 name: "myapex_sminus",
6313 key: "myapex.key",
6314 apps: ["AppFoo"],
6315 apex_available_name: "myapex",
6316 updatable: false,
6317 }
6318 apex {
6319 name: "myapex",
6320 key: "myapex.key",
6321 apps: ["AppFoo"],
6322 updatable: false,
6323 }
6324 apex_key {
6325 name: "myapex.key",
6326 public_key: "testkey.avbpubkey",
6327 private_key: "testkey.pem",
6328 }
6329 android_app {
6330 name: "AppFoo",
6331 srcs: ["foo/bar/MyClass.java"],
6332 sdk_version: "none",
6333 system_modules: "none",
6334 apex_available: [ "myapex" ],
6335 }`,
6336 android.FixtureMergeMockFs(android.MockFS{
6337 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6338 }),
6339 )
6340 })
6341
6342 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6343 testApex(t, `
6344 override_apex {
6345 name: "myoverrideapex_sminus",
6346 base: "myapex_sminus",
6347 key: "myapex.key",
6348 apps: ["AppFooOverride"],
6349 }
6350 override_apex {
6351 name: "myoverrideapex",
6352 base: "myapex",
6353 key: "myapex.key",
6354 apps: ["AppFooOverride"],
6355 }
6356 apex {
6357 name: "myapex_sminus",
6358 key: "myapex.key",
6359 apps: ["AppFoo"],
6360 apex_available_name: "myapex",
6361 updatable: false,
6362 }
6363 apex {
6364 name: "myapex",
6365 key: "myapex.key",
6366 apps: ["AppFoo"],
6367 updatable: false,
6368 }
6369 apex_key {
6370 name: "myapex.key",
6371 public_key: "testkey.avbpubkey",
6372 private_key: "testkey.pem",
6373 }
6374 android_app {
6375 name: "AppFooOverride",
6376 srcs: ["foo/bar/MyClass.java"],
6377 sdk_version: "none",
6378 system_modules: "none",
6379 apex_available: [ "myapex" ],
6380 }
6381 android_app {
6382 name: "AppFoo",
6383 srcs: ["foo/bar/MyClass.java"],
6384 sdk_version: "none",
6385 system_modules: "none",
6386 apex_available: [ "myapex" ],
6387 }`,
6388 android.FixtureMergeMockFs(android.MockFS{
6389 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6390 }),
6391 )
6392 })
6393}
6394
6395func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6396 context := android.GroupFixturePreparers(
6397 android.PrepareForIntegrationTestWithAndroid,
6398 PrepareForTestWithApexBuildComponents,
6399 java.PrepareForTestWithDexpreopt,
6400 android.FixtureMergeMockFs(android.MockFS{
6401 "system/sepolicy/apex/myapex-file_contexts": nil,
6402 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6403 }),
6404 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6405 variables.BuildId = proptools.StringPtr("buildid")
6406 }),
6407 )
6408 context.RunTestWithBp(t, `
6409 override_apex {
6410 name: "myoverrideapex_sminus",
6411 base: "myapex_sminus",
6412 }
6413 override_apex {
6414 name: "myoverrideapex",
6415 base: "myapex",
6416 }
6417 apex {
6418 name: "myapex",
6419 key: "myapex.key",
6420 apps: ["AppFoo"],
6421 updatable: false,
6422 }
6423 apex {
6424 name: "myapex_sminus",
6425 apex_available_name: "myapex",
6426 key: "myapex.key",
6427 apps: ["AppFoo_sminus"],
6428 updatable: false,
6429 }
6430 apex_key {
6431 name: "myapex.key",
6432 public_key: "testkey.avbpubkey",
6433 private_key: "testkey.pem",
6434 }
6435 android_app {
6436 name: "AppFoo",
6437 srcs: ["foo/bar/MyClass.java"],
6438 sdk_version: "none",
6439 system_modules: "none",
6440 apex_available: [ "myapex" ],
6441 }
6442 android_app {
6443 name: "AppFoo_sminus",
6444 srcs: ["foo/bar/MyClass.java"],
6445 sdk_version: "none",
6446 min_sdk_version: "29",
6447 system_modules: "none",
6448 apex_available: [ "myapex" ],
6449 }`)
6450}
6451
Jiyong Park89e850a2020-04-07 16:37:39 +09006452func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006453 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006454 apex {
6455 name: "myapex",
6456 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006457 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006458 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006459 }
6460
6461 apex_key {
6462 name: "myapex.key",
6463 public_key: "testkey.avbpubkey",
6464 private_key: "testkey.pem",
6465 }
6466
6467 cc_library {
6468 name: "libfoo",
6469 stl: "none",
6470 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006471 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006472 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006473 }
6474
6475 cc_library {
6476 name: "libfoo2",
6477 stl: "none",
6478 system_shared_libs: [],
6479 shared_libs: ["libbaz"],
6480 apex_available: ["//apex_available:platform"],
6481 }
6482
6483 cc_library {
6484 name: "libbar",
6485 stl: "none",
6486 system_shared_libs: [],
6487 apex_available: ["myapex"],
6488 }
6489
6490 cc_library {
6491 name: "libbaz",
6492 stl: "none",
6493 system_shared_libs: [],
6494 apex_available: ["myapex"],
6495 stubs: {
6496 versions: ["1"],
6497 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006498 }`)
6499
Jiyong Park89e850a2020-04-07 16:37:39 +09006500 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6501 // because it depends on libbar which isn't available to platform
6502 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6503 if libfoo.NotAvailableForPlatform() != true {
6504 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6505 }
6506
6507 // libfoo2 however can be available to platform because it depends on libbaz which provides
6508 // stubs
6509 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6510 if libfoo2.NotAvailableForPlatform() == true {
6511 t.Errorf("%q should be available to platform", libfoo2.String())
6512 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006513}
Jiyong Parka90ca002019-10-07 15:47:24 +09006514
Paul Duffine52e66f2020-03-30 17:54:29 +01006515func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006516 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006521 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006522 }
6523
6524 apex_key {
6525 name: "myapex.key",
6526 public_key: "testkey.avbpubkey",
6527 private_key: "testkey.pem",
6528 }
6529
6530 cc_library {
6531 name: "libfoo",
6532 stl: "none",
6533 system_shared_libs: [],
6534 apex_available: ["myapex"],
6535 static: {
6536 apex_available: ["//apex_available:platform"],
6537 },
6538 }`)
6539
Jiyong Park89e850a2020-04-07 16:37:39 +09006540 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6541 if libfooShared.NotAvailableForPlatform() != true {
6542 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6543 }
6544 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6545 if libfooStatic.NotAvailableForPlatform() != false {
6546 t.Errorf("%q should be available to platform", libfooStatic.String())
6547 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006548}
6549
Jooyung Han9a419e22024-08-16 17:14:21 +09006550func TestApexAvailable_PrefixMatch(t *testing.T) {
6551
6552 for _, tc := range []struct {
6553 name string
6554 apexAvailable string
6555 expectedError string
6556 }{
6557 {
6558 name: "prefix matches correctly",
6559 apexAvailable: "com.foo.*",
6560 },
6561 {
6562 name: "prefix doesn't match",
6563 apexAvailable: "com.bar.*",
6564 expectedError: `Consider .* "com.foo\.\*"`,
6565 },
6566 {
6567 name: "short prefix",
6568 apexAvailable: "com.*",
6569 expectedError: "requires two or more components",
6570 },
6571 {
6572 name: "wildcard not in the end",
6573 apexAvailable: "com.*.foo",
6574 expectedError: "should end with .*",
6575 },
6576 {
6577 name: "wildcard in the middle",
6578 apexAvailable: "com.foo*.*",
6579 expectedError: "not allowed in the middle",
6580 },
6581 {
6582 name: "hint with prefix pattern",
6583 apexAvailable: "//apex_available:platform",
6584 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6585 },
6586 } {
6587 t.Run(tc.name, func(t *testing.T) {
6588 errorHandler := android.FixtureExpectsNoErrors
6589 if tc.expectedError != "" {
6590 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6591 }
6592 context := android.GroupFixturePreparers(
6593 prepareForApexTest,
6594 android.FixtureMergeMockFs(android.MockFS{
6595 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6596 }),
6597 ).ExtendWithErrorHandler(errorHandler)
6598
6599 context.RunTestWithBp(t, `
6600 apex {
6601 name: "com.foo.bar",
6602 key: "myapex.key",
6603 native_shared_libs: ["libfoo"],
6604 updatable: false,
6605 }
6606
6607 apex_key {
6608 name: "myapex.key",
6609 public_key: "testkey.avbpubkey",
6610 private_key: "testkey.pem",
6611 }
6612
6613 cc_library {
6614 name: "libfoo",
6615 stl: "none",
6616 system_shared_libs: [],
6617 apex_available: ["`+tc.apexAvailable+`"],
6618 }`)
6619 })
6620 }
6621 testApexError(t, `Consider adding "com.foo" to`, `
6622 apex {
6623 name: "com.foo", // too short for a partner apex
6624 key: "myapex.key",
6625 native_shared_libs: ["libfoo"],
6626 updatable: false,
6627 }
6628
6629 apex_key {
6630 name: "myapex.key",
6631 public_key: "testkey.avbpubkey",
6632 private_key: "testkey.pem",
6633 }
6634
6635 cc_library {
6636 name: "libfoo",
6637 stl: "none",
6638 system_shared_libs: [],
6639 }
6640 `)
6641}
6642
Jiyong Park5d790c32019-11-15 18:40:32 +09006643func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006644 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006645 apex {
6646 name: "myapex",
6647 key: "myapex.key",
6648 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006649 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006650 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006651 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006652 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006653 }
6654
6655 override_apex {
6656 name: "override_myapex",
6657 base: "myapex",
6658 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006659 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006660 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006661 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006662 compile_multilib: "first",
6663 multilib: {
6664 lib32: {
6665 native_shared_libs: ["mylib32"],
6666 },
6667 lib64: {
6668 native_shared_libs: ["mylib64"],
6669 },
6670 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006671 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006672 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006673 key: "mynewapex.key",
6674 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006675 }
6676
6677 apex_key {
6678 name: "myapex.key",
6679 public_key: "testkey.avbpubkey",
6680 private_key: "testkey.pem",
6681 }
6682
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006683 apex_key {
6684 name: "mynewapex.key",
6685 public_key: "testkey2.avbpubkey",
6686 private_key: "testkey2.pem",
6687 }
6688
6689 android_app_certificate {
6690 name: "myapex.certificate",
6691 certificate: "testkey",
6692 }
6693
Jiyong Park5d790c32019-11-15 18:40:32 +09006694 android_app {
6695 name: "app",
6696 srcs: ["foo/bar/MyClass.java"],
6697 package_name: "foo",
6698 sdk_version: "none",
6699 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006700 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006701 }
6702
6703 override_android_app {
6704 name: "override_app",
6705 base: "app",
6706 package_name: "bar",
6707 }
markchien7c803b82021-08-26 22:10:06 +08006708
6709 bpf {
6710 name: "bpf",
6711 srcs: ["bpf.c"],
6712 }
6713
6714 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006715 name: "overrideBpf",
6716 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006717 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006718
6719 prebuilt_etc {
6720 name: "myetc",
6721 src: "myprebuilt",
6722 }
6723
6724 prebuilt_etc {
6725 name: "override_myetc",
6726 src: "override_myprebuilt",
6727 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006728
6729 cc_library {
6730 name: "mylib32",
6731 apex_available: [ "myapex" ],
6732 }
6733
6734 cc_library {
6735 name: "mylib64",
6736 apex_available: [ "myapex" ],
6737 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006738 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006739
Jooyung Hana0503a52023-08-23 13:12:50 +09006740 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006741 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006742 if originalVariant.GetOverriddenBy() != "" {
6743 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6744 }
6745 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6746 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6747 }
6748
Spandan Das50801e22024-05-13 18:29:45 +00006749 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006750 apexRule := module.Rule("apexRule")
6751 copyCmds := apexRule.Args["copy_commands"]
6752
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006753 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6754 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006755
markchien7c803b82021-08-26 22:10:06 +08006756 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006757 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006758
Daniel Norman5a3ce132021-08-26 15:44:43 -07006759 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6760 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6761
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006762 apexBundle := module.Module().(*apexBundle)
6763 name := apexBundle.Name()
6764 if name != "override_myapex" {
6765 t.Errorf("name should be \"override_myapex\", but was %q", name)
6766 }
6767
Baligh Uddin004d7172020-02-19 21:29:28 -08006768 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6769 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6770 }
6771
Jiyong Park20bacab2020-03-03 11:45:41 +09006772 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006773 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006774 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6775
6776 signApkRule := module.Rule("signapk")
6777 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006778
Colin Crossaa255532020-07-03 13:18:24 -07006779 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006780 var builder strings.Builder
6781 data.Custom(&builder, name, "TARGET_", "", data)
6782 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006783 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6784 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006785 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006786 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006787 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006788 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006789 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006790 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006791}
6792
Albert Martineefabcf2022-03-21 20:11:16 +00006793func TestMinSdkVersionOverride(t *testing.T) {
6794 // Override from 29 to 31
6795 minSdkOverride31 := "31"
6796 ctx := testApex(t, `
6797 apex {
6798 name: "myapex",
6799 key: "myapex.key",
6800 native_shared_libs: ["mylib"],
6801 updatable: true,
6802 min_sdk_version: "29"
6803 }
6804
6805 override_apex {
6806 name: "override_myapex",
6807 base: "myapex",
6808 logging_parent: "com.foo.bar",
6809 package_name: "test.overridden.package"
6810 }
6811
6812 apex_key {
6813 name: "myapex.key",
6814 public_key: "testkey.avbpubkey",
6815 private_key: "testkey.pem",
6816 }
6817
6818 cc_library {
6819 name: "mylib",
6820 srcs: ["mylib.cpp"],
6821 runtime_libs: ["libbar"],
6822 system_shared_libs: [],
6823 stl: "none",
6824 apex_available: [ "myapex" ],
6825 min_sdk_version: "apex_inherit"
6826 }
6827
6828 cc_library {
6829 name: "libbar",
6830 srcs: ["mylib.cpp"],
6831 system_shared_libs: [],
6832 stl: "none",
6833 apex_available: [ "myapex" ],
6834 min_sdk_version: "apex_inherit"
6835 }
6836
6837 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6838
Jooyung Hana0503a52023-08-23 13:12:50 +09006839 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006840 copyCmds := apexRule.Args["copy_commands"]
6841
6842 // Ensure that direct non-stubs dep is always included
6843 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6844
6845 // Ensure that runtime_libs dep in included
6846 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6847
6848 // Ensure libraries target overridden min_sdk_version value
6849 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6850}
6851
6852func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6853 // Attempt to override from 31 to 29, should be a NOOP
6854 minSdkOverride29 := "29"
6855 ctx := testApex(t, `
6856 apex {
6857 name: "myapex",
6858 key: "myapex.key",
6859 native_shared_libs: ["mylib"],
6860 updatable: true,
6861 min_sdk_version: "31"
6862 }
6863
6864 override_apex {
6865 name: "override_myapex",
6866 base: "myapex",
6867 logging_parent: "com.foo.bar",
6868 package_name: "test.overridden.package"
6869 }
6870
6871 apex_key {
6872 name: "myapex.key",
6873 public_key: "testkey.avbpubkey",
6874 private_key: "testkey.pem",
6875 }
6876
6877 cc_library {
6878 name: "mylib",
6879 srcs: ["mylib.cpp"],
6880 runtime_libs: ["libbar"],
6881 system_shared_libs: [],
6882 stl: "none",
6883 apex_available: [ "myapex" ],
6884 min_sdk_version: "apex_inherit"
6885 }
6886
6887 cc_library {
6888 name: "libbar",
6889 srcs: ["mylib.cpp"],
6890 system_shared_libs: [],
6891 stl: "none",
6892 apex_available: [ "myapex" ],
6893 min_sdk_version: "apex_inherit"
6894 }
6895
6896 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6897
Jooyung Hana0503a52023-08-23 13:12:50 +09006898 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006899 copyCmds := apexRule.Args["copy_commands"]
6900
6901 // Ensure that direct non-stubs dep is always included
6902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6903
6904 // Ensure that runtime_libs dep in included
6905 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6906
6907 // Ensure libraries target the original min_sdk_version value rather than the overridden
6908 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6909}
6910
Jooyung Han214bf372019-11-12 13:03:50 +09006911func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006912 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006913 apex {
6914 name: "myapex",
6915 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006916 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006917 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006918 }
6919
6920 apex_key {
6921 name: "myapex.key",
6922 public_key: "testkey.avbpubkey",
6923 private_key: "testkey.pem",
6924 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006925
6926 cc_library {
6927 name: "mylib",
6928 srcs: ["mylib.cpp"],
6929 stl: "libc++",
6930 system_shared_libs: [],
6931 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006932 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006933 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006934 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006935
Jooyung Hana0503a52023-08-23 13:12:50 +09006936 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09006937 args := module.Rule("apexRule").Args
6938 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006939 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006940
6941 // The copies of the libraries in the apex should have one more dependency than
6942 // the ones outside the apex, namely the unwinder. Ideally we should check
6943 // the dependency names directly here but for some reason the names are blank in
6944 // this test.
6945 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006946 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006947 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6948 if len(apexImplicits) != len(nonApexImplicits)+1 {
6949 t.Errorf("%q missing unwinder dep", lib)
6950 }
6951 }
Jooyung Han214bf372019-11-12 13:03:50 +09006952}
6953
Paul Duffine05480a2021-03-08 15:07:14 +00006954var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006955 "api/current.txt": nil,
6956 "api/removed.txt": nil,
6957 "api/system-current.txt": nil,
6958 "api/system-removed.txt": nil,
6959 "api/test-current.txt": nil,
6960 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006961
Anton Hanssondff2c782020-12-21 17:10:01 +00006962 "100/public/api/foo.txt": nil,
6963 "100/public/api/foo-removed.txt": nil,
6964 "100/system/api/foo.txt": nil,
6965 "100/system/api/foo-removed.txt": nil,
6966
Paul Duffineedc5d52020-06-12 17:46:39 +01006967 // For java_sdk_library_import
6968 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006969}
6970
Jooyung Han58f26ab2019-12-18 15:34:32 +09006971func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006972 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006973 apex {
6974 name: "myapex",
6975 key: "myapex.key",
6976 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006977 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006978 }
6979
6980 apex_key {
6981 name: "myapex.key",
6982 public_key: "testkey.avbpubkey",
6983 private_key: "testkey.pem",
6984 }
6985
6986 java_sdk_library {
6987 name: "foo",
6988 srcs: ["a.java"],
6989 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006990 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006991 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006992
6993 prebuilt_apis {
6994 name: "sdk",
6995 api_dirs: ["100"],
6996 }
Paul Duffin9b879592020-05-26 13:21:35 +01006997 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006998
6999 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007000 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007001 "javalib/foo.jar",
7002 "etc/permissions/foo.xml",
7003 })
7004 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007005 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7006 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7007 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007008}
7009
Spandan Das3ee19692024-06-19 04:47:40 +00007010func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7011 ctx := testApex(t, `
7012 override_apex {
7013 name: "mycompanyapex",
7014 base: "myapex",
7015 }
7016 apex {
7017 name: "myapex",
7018 key: "myapex.key",
7019 java_libs: ["foo"],
7020 updatable: false,
7021 }
7022
7023 apex_key {
7024 name: "myapex.key",
7025 public_key: "testkey.avbpubkey",
7026 private_key: "testkey.pem",
7027 }
7028
7029 java_sdk_library {
7030 name: "foo",
7031 srcs: ["a.java"],
7032 api_packages: ["foo"],
7033 apex_available: [ "myapex" ],
7034 }
7035
7036 prebuilt_apis {
7037 name: "sdk",
7038 api_dirs: ["100"],
7039 }
7040 `, withFiles(filesForSdkLibrary))
7041
7042 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7043 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7044 // (com.android.foo), the filepath should not contain override apex name.
7045 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7046 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7047 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7048}
7049
Paul Duffin9b879592020-05-26 13:21:35 +01007050func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007051 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007052 apex {
7053 name: "myapex",
7054 key: "myapex.key",
7055 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007056 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007057 }
7058
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
7064
7065 java_sdk_library {
7066 name: "foo",
7067 srcs: ["a.java"],
7068 api_packages: ["foo"],
7069 apex_available: ["myapex"],
7070 sdk_version: "none",
7071 system_modules: "none",
7072 }
7073
7074 java_library {
7075 name: "bar",
7076 srcs: ["a.java"],
7077 libs: ["foo"],
7078 apex_available: ["myapex"],
7079 sdk_version: "none",
7080 system_modules: "none",
7081 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007082
7083 prebuilt_apis {
7084 name: "sdk",
7085 api_dirs: ["100"],
7086 }
Paul Duffin9b879592020-05-26 13:21:35 +01007087 `, withFiles(filesForSdkLibrary))
7088
7089 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007090 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007091 "javalib/bar.jar",
7092 "javalib/foo.jar",
7093 "etc/permissions/foo.xml",
7094 })
7095
7096 // The bar library should depend on the implementation jar.
7097 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007098 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007099 t.Errorf("expected %q, found %#q", expected, actual)
7100 }
7101}
7102
7103func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007104 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007105 apex {
7106 name: "myapex",
7107 key: "myapex.key",
7108 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007109 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007110 }
7111
7112 apex_key {
7113 name: "myapex.key",
7114 public_key: "testkey.avbpubkey",
7115 private_key: "testkey.pem",
7116 }
7117
7118 java_sdk_library {
7119 name: "foo",
7120 srcs: ["a.java"],
7121 api_packages: ["foo"],
7122 apex_available: ["myapex"],
7123 sdk_version: "none",
7124 system_modules: "none",
7125 }
7126
7127 java_library {
7128 name: "bar",
7129 srcs: ["a.java"],
7130 libs: ["foo"],
7131 sdk_version: "none",
7132 system_modules: "none",
7133 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007134
7135 prebuilt_apis {
7136 name: "sdk",
7137 api_dirs: ["100"],
7138 }
Paul Duffin9b879592020-05-26 13:21:35 +01007139 `, withFiles(filesForSdkLibrary))
7140
7141 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007142 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007143 "javalib/foo.jar",
7144 "etc/permissions/foo.xml",
7145 })
7146
7147 // The bar library should depend on the stubs jar.
7148 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007149 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007150 t.Errorf("expected %q, found %#q", expected, actual)
7151 }
7152}
7153
Paul Duffineedc5d52020-06-12 17:46:39 +01007154func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007155 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007156 prebuilt_apis {
7157 name: "sdk",
7158 api_dirs: ["100"],
7159 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007160 withFiles(map[string][]byte{
7161 "apex/a.java": nil,
7162 "apex/apex_manifest.json": nil,
7163 "apex/Android.bp": []byte(`
7164 package {
7165 default_visibility: ["//visibility:private"],
7166 }
7167
7168 apex {
7169 name: "myapex",
7170 key: "myapex.key",
7171 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007172 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007173 }
7174
7175 apex_key {
7176 name: "myapex.key",
7177 public_key: "testkey.avbpubkey",
7178 private_key: "testkey.pem",
7179 }
7180
7181 java_library {
7182 name: "bar",
7183 srcs: ["a.java"],
7184 libs: ["foo"],
7185 apex_available: ["myapex"],
7186 sdk_version: "none",
7187 system_modules: "none",
7188 }
7189`),
7190 "source/a.java": nil,
7191 "source/api/current.txt": nil,
7192 "source/api/removed.txt": nil,
7193 "source/Android.bp": []byte(`
7194 package {
7195 default_visibility: ["//visibility:private"],
7196 }
7197
7198 java_sdk_library {
7199 name: "foo",
7200 visibility: ["//apex"],
7201 srcs: ["a.java"],
7202 api_packages: ["foo"],
7203 apex_available: ["myapex"],
7204 sdk_version: "none",
7205 system_modules: "none",
7206 public: {
7207 enabled: true,
7208 },
7209 }
7210`),
7211 "prebuilt/a.jar": nil,
7212 "prebuilt/Android.bp": []byte(`
7213 package {
7214 default_visibility: ["//visibility:private"],
7215 }
7216
7217 java_sdk_library_import {
7218 name: "foo",
7219 visibility: ["//apex", "//source"],
7220 apex_available: ["myapex"],
7221 prefer: true,
7222 public: {
7223 jars: ["a.jar"],
7224 },
7225 }
7226`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007227 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007228 )
7229
7230 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007231 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007232 "javalib/bar.jar",
7233 "javalib/foo.jar",
7234 "etc/permissions/foo.xml",
7235 })
7236
7237 // The bar library should depend on the implementation jar.
7238 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007239 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007240 t.Errorf("expected %q, found %#q", expected, actual)
7241 }
7242}
7243
7244func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7245 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7246 apex {
7247 name: "myapex",
7248 key: "myapex.key",
7249 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007250 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007251 }
7252
7253 apex_key {
7254 name: "myapex.key",
7255 public_key: "testkey.avbpubkey",
7256 private_key: "testkey.pem",
7257 }
7258
7259 java_sdk_library_import {
7260 name: "foo",
7261 apex_available: ["myapex"],
7262 prefer: true,
7263 public: {
7264 jars: ["a.jar"],
7265 },
7266 }
7267
7268 `, withFiles(filesForSdkLibrary))
7269}
7270
atrost6e126252020-01-27 17:01:16 +00007271func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007272 result := android.GroupFixturePreparers(
7273 prepareForApexTest,
7274 java.PrepareForTestWithPlatformCompatConfig,
7275 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007276 apex {
7277 name: "myapex",
7278 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007279 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007280 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007281 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007282 }
7283
7284 apex_key {
7285 name: "myapex.key",
7286 public_key: "testkey.avbpubkey",
7287 private_key: "testkey.pem",
7288 }
7289
7290 platform_compat_config {
7291 name: "myjar-platform-compat-config",
7292 src: ":myjar",
7293 }
7294
7295 java_library {
7296 name: "myjar",
7297 srcs: ["foo/bar/MyClass.java"],
7298 sdk_version: "none",
7299 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007300 apex_available: [ "myapex" ],
7301 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007302
7303 // Make sure that a preferred prebuilt does not affect the apex contents.
7304 prebuilt_platform_compat_config {
7305 name: "myjar-platform-compat-config",
7306 metadata: "compat-config/metadata.xml",
7307 prefer: true,
7308 }
atrost6e126252020-01-27 17:01:16 +00007309 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007310 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007311 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007312 "etc/compatconfig/myjar-platform-compat-config.xml",
7313 "javalib/myjar.jar",
7314 })
7315}
7316
Jooyung Han862c0d62022-12-21 10:15:37 +09007317func TestNoDupeApexFiles(t *testing.T) {
7318 android.GroupFixturePreparers(
7319 android.PrepareForTestWithAndroidBuildComponents,
7320 PrepareForTestWithApexBuildComponents,
7321 prepareForTestWithMyapex,
7322 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7323 ).
7324 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7325 RunTestWithBp(t, `
7326 apex {
7327 name: "myapex",
7328 key: "myapex.key",
7329 prebuilts: ["foo", "bar"],
7330 updatable: false,
7331 }
7332
7333 apex_key {
7334 name: "myapex.key",
7335 public_key: "testkey.avbpubkey",
7336 private_key: "testkey.pem",
7337 }
7338
7339 prebuilt_etc {
7340 name: "foo",
7341 src: "myprebuilt",
7342 filename_from_src: true,
7343 }
7344
7345 prebuilt_etc {
7346 name: "bar",
7347 src: "myprebuilt",
7348 filename_from_src: true,
7349 }
7350 `)
7351}
7352
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007353func TestApexUnwantedTransitiveDeps(t *testing.T) {
7354 bp := `
7355 apex {
7356 name: "myapex",
7357 key: "myapex.key",
7358 native_shared_libs: ["libfoo"],
7359 updatable: false,
7360 unwanted_transitive_deps: ["libbar"],
7361 }
7362
7363 apex_key {
7364 name: "myapex.key",
7365 public_key: "testkey.avbpubkey",
7366 private_key: "testkey.pem",
7367 }
7368
7369 cc_library {
7370 name: "libfoo",
7371 srcs: ["foo.cpp"],
7372 shared_libs: ["libbar"],
7373 apex_available: ["myapex"],
7374 }
7375
7376 cc_library {
7377 name: "libbar",
7378 srcs: ["bar.cpp"],
7379 apex_available: ["myapex"],
7380 }`
7381 ctx := testApex(t, bp)
7382 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7383 "*/libc++.so",
7384 "*/libfoo.so",
7385 // not libbar.so
7386 })
7387}
7388
Jiyong Park479321d2019-12-16 11:47:12 +09007389func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7390 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7391 apex {
7392 name: "myapex",
7393 key: "myapex.key",
7394 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007395 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007396 }
7397
7398 apex_key {
7399 name: "myapex.key",
7400 public_key: "testkey.avbpubkey",
7401 private_key: "testkey.pem",
7402 }
7403
7404 java_library {
7405 name: "myjar",
7406 srcs: ["foo/bar/MyClass.java"],
7407 sdk_version: "none",
7408 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007409 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007410 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007411 }
7412 `)
7413}
7414
Jiyong Park7afd1072019-12-30 16:56:33 +09007415func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007416 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007417 apex {
7418 name: "myapex",
7419 key: "myapex.key",
7420 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007421 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007422 }
7423
7424 apex_key {
7425 name: "myapex.key",
7426 public_key: "testkey.avbpubkey",
7427 private_key: "testkey.pem",
7428 }
7429
7430 cc_library {
7431 name: "mylib",
7432 srcs: ["mylib.cpp"],
7433 system_shared_libs: [],
7434 stl: "none",
7435 required: ["a", "b"],
7436 host_required: ["c", "d"],
7437 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007438 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007439 }
7440 `)
7441
Jooyung Hana0503a52023-08-23 13:12:50 +09007442 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007443 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007444 name := apexBundle.BaseModuleName()
7445 prefix := "TARGET_"
7446 var builder strings.Builder
7447 data.Custom(&builder, name, prefix, "", data)
7448 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007449 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007450 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7451 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007452}
7453
Jiyong Park7cd10e32020-01-14 09:22:18 +09007454func TestSymlinksFromApexToSystem(t *testing.T) {
7455 bp := `
7456 apex {
7457 name: "myapex",
7458 key: "myapex.key",
7459 native_shared_libs: ["mylib"],
7460 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007461 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007462 }
7463
Jiyong Park9d677202020-02-19 16:29:35 +09007464 apex {
7465 name: "myapex.updatable",
7466 key: "myapex.key",
7467 native_shared_libs: ["mylib"],
7468 java_libs: ["myjar"],
7469 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007470 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007471 }
7472
Jiyong Park7cd10e32020-01-14 09:22:18 +09007473 apex_key {
7474 name: "myapex.key",
7475 public_key: "testkey.avbpubkey",
7476 private_key: "testkey.pem",
7477 }
7478
7479 cc_library {
7480 name: "mylib",
7481 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007482 shared_libs: [
7483 "myotherlib",
7484 "myotherlib_ext",
7485 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007486 system_shared_libs: [],
7487 stl: "none",
7488 apex_available: [
7489 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007490 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007491 "//apex_available:platform",
7492 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007493 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007494 }
7495
7496 cc_library {
7497 name: "myotherlib",
7498 srcs: ["mylib.cpp"],
7499 system_shared_libs: [],
7500 stl: "none",
7501 apex_available: [
7502 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007503 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007504 "//apex_available:platform",
7505 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007506 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007507 }
7508
Jiyong Parkce243632023-02-17 18:22:25 +09007509 cc_library {
7510 name: "myotherlib_ext",
7511 srcs: ["mylib.cpp"],
7512 system_shared_libs: [],
7513 system_ext_specific: true,
7514 stl: "none",
7515 apex_available: [
7516 "myapex",
7517 "myapex.updatable",
7518 "//apex_available:platform",
7519 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007520 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007521 }
7522
Jiyong Park7cd10e32020-01-14 09:22:18 +09007523 java_library {
7524 name: "myjar",
7525 srcs: ["foo/bar/MyClass.java"],
7526 sdk_version: "none",
7527 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007528 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007529 apex_available: [
7530 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007531 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007532 "//apex_available:platform",
7533 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007534 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007535 }
7536
7537 java_library {
7538 name: "myotherjar",
7539 srcs: ["foo/bar/MyClass.java"],
7540 sdk_version: "none",
7541 system_modules: "none",
7542 apex_available: [
7543 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007544 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007545 "//apex_available:platform",
7546 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007547 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007548 }
7549 `
7550
7551 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7552 for _, f := range files {
7553 if f.path == file {
7554 if f.isLink {
7555 t.Errorf("%q is not a real file", file)
7556 }
7557 return
7558 }
7559 }
7560 t.Errorf("%q is not found", file)
7561 }
7562
Jiyong Parkce243632023-02-17 18:22:25 +09007563 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007564 for _, f := range files {
7565 if f.path == file {
7566 if !f.isLink {
7567 t.Errorf("%q is not a symlink", file)
7568 }
Jiyong Parkce243632023-02-17 18:22:25 +09007569 if f.src != target {
7570 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7571 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007572 return
7573 }
7574 }
7575 t.Errorf("%q is not found", file)
7576 }
7577
Jiyong Park9d677202020-02-19 16:29:35 +09007578 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7579 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007580 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007581 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007582 ensureRealfileExists(t, files, "javalib/myjar.jar")
7583 ensureRealfileExists(t, files, "lib64/mylib.so")
7584 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007585 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007586
Jooyung Hana0503a52023-08-23 13:12:50 +09007587 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007588 ensureRealfileExists(t, files, "javalib/myjar.jar")
7589 ensureRealfileExists(t, files, "lib64/mylib.so")
7590 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007591 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007592
7593 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007594 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007595 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007596 ensureRealfileExists(t, files, "javalib/myjar.jar")
7597 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007598 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7599 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007600
Jooyung Hana0503a52023-08-23 13:12:50 +09007601 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007602 ensureRealfileExists(t, files, "javalib/myjar.jar")
7603 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007604 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7605 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007606}
7607
Yo Chiange8128052020-07-23 20:09:18 +08007608func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007609 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007610 apex {
7611 name: "myapex",
7612 key: "myapex.key",
7613 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007614 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007615 }
7616
7617 apex_key {
7618 name: "myapex.key",
7619 public_key: "testkey.avbpubkey",
7620 private_key: "testkey.pem",
7621 }
7622
7623 cc_library_shared {
7624 name: "mylib",
7625 srcs: ["mylib.cpp"],
7626 shared_libs: ["myotherlib"],
7627 system_shared_libs: [],
7628 stl: "none",
7629 apex_available: [
7630 "myapex",
7631 "//apex_available:platform",
7632 ],
7633 }
7634
7635 cc_prebuilt_library_shared {
7636 name: "myotherlib",
7637 srcs: ["prebuilt.so"],
7638 system_shared_libs: [],
7639 stl: "none",
7640 apex_available: [
7641 "myapex",
7642 "//apex_available:platform",
7643 ],
7644 }
7645 `)
7646
Jooyung Hana0503a52023-08-23 13:12:50 +09007647 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007648 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007649 var builder strings.Builder
7650 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7651 androidMk := builder.String()
7652 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007653 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007654 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7655 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7656 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007657 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007658}
7659
Jooyung Han643adc42020-02-27 13:50:06 +09007660func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007661 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007662 apex {
7663 name: "myapex",
7664 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007665 binaries: ["mybin"],
7666 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007667 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007668 }
7669
7670 apex_key {
7671 name: "myapex.key",
7672 public_key: "testkey.avbpubkey",
7673 private_key: "testkey.pem",
7674 }
7675
7676 cc_library {
7677 name: "mylib",
7678 srcs: ["mylib.cpp"],
7679 shared_libs: ["mylib2"],
7680 system_shared_libs: [],
7681 stl: "none",
7682 apex_available: [ "myapex" ],
7683 }
7684
7685 cc_library {
7686 name: "mylib2",
7687 srcs: ["mylib.cpp"],
7688 system_shared_libs: [],
7689 stl: "none",
7690 apex_available: [ "myapex" ],
7691 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007692
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007693 // Used as both a JNI library and a regular shared library.
7694 cc_library {
7695 name: "mylib3",
7696 srcs: ["mylib.cpp"],
7697 system_shared_libs: [],
7698 stl: "none",
7699 apex_available: [ "myapex" ],
7700 }
7701
7702 cc_binary {
7703 name: "mybin",
7704 srcs: ["mybin.cpp"],
7705 shared_libs: ["mylib3"],
7706 system_shared_libs: [],
7707 stl: "none",
7708 apex_available: [ "myapex" ],
7709 }
7710
Jiyong Park34d5c332022-02-24 18:02:44 +09007711 rust_ffi_shared {
7712 name: "libfoo.rust",
7713 crate_name: "foo",
7714 srcs: ["foo.rs"],
7715 shared_libs: ["libfoo.shared_from_rust"],
7716 prefer_rlib: true,
7717 apex_available: ["myapex"],
7718 }
7719
7720 cc_library_shared {
7721 name: "libfoo.shared_from_rust",
7722 srcs: ["mylib.cpp"],
7723 system_shared_libs: [],
7724 stl: "none",
7725 stubs: {
7726 versions: ["10", "11", "12"],
7727 },
7728 }
7729
Jooyung Han643adc42020-02-27 13:50:06 +09007730 `)
7731
Jooyung Hana0503a52023-08-23 13:12:50 +09007732 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007733 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007734 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007735 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007736 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007737 "lib64/mylib.so",
7738 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007739 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007740 "lib64/libfoo.rust.so",
7741 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7742 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007743 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007744
7745 // b/220397949
7746 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007747}
7748
Jooyung Han49f67012020-04-17 13:43:10 +09007749func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007750 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007751 apex {
7752 name: "myapex",
7753 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007754 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007755 }
7756 apex_key {
7757 name: "myapex.key",
7758 public_key: "testkey.avbpubkey",
7759 private_key: "testkey.pem",
7760 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007761 `,
7762 android.FixtureModifyConfig(func(config android.Config) {
7763 delete(config.Targets, android.Android)
7764 config.AndroidCommonTarget = android.Target{}
7765 }),
7766 )
Jooyung Han49f67012020-04-17 13:43:10 +09007767
7768 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7769 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7770 }
7771}
7772
Jiyong Parkbd159612020-02-28 15:22:21 +09007773func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007774 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007775 apex {
7776 name: "myapex",
7777 key: "myapex.key",
7778 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007779 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007780 }
7781
7782 apex_key {
7783 name: "myapex.key",
7784 public_key: "testkey.avbpubkey",
7785 private_key: "testkey.pem",
7786 }
7787
7788 android_app {
7789 name: "AppFoo",
7790 srcs: ["foo/bar/MyClass.java"],
7791 sdk_version: "none",
7792 system_modules: "none",
7793 apex_available: [ "myapex" ],
7794 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007795 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007796
Jooyung Hana0503a52023-08-23 13:12:50 +09007797 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007798 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007799
7800 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007801 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 +09007802}
7803
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007804func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007805 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007806 apex {
7807 name: "myapex",
7808 key: "myapex.key",
7809 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007810 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007811 }
7812
7813 apex_key {
7814 name: "myapex.key",
7815 public_key: "testkey.avbpubkey",
7816 private_key: "testkey.pem",
7817 }
7818
7819 android_app_set {
7820 name: "AppSet",
7821 set: "AppSet.apks",
7822 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007823 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007824 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007825 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007826 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7827 s := mod.Rule("apexRule").Args["copy_commands"]
7828 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007829 if len(copyCmds) != 4 {
7830 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007831 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007832 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7833 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007834 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7835 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007836
7837 // Ensure that canned_fs_config has an entry for the app set zip file
7838 generateFsRule := mod.Rule("generateFsConfig")
7839 cmd := generateFsRule.RuleParams.Command
7840 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007841}
7842
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007843func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007844 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007845 apex_set {
7846 name: "myapex",
7847 filename: "foo_v2.apex",
7848 sanitized: {
7849 none: { set: "myapex.apks", },
7850 hwaddress: { set: "myapex.hwasan.apks", },
7851 },
Paul Duffin24704672021-04-06 16:09:30 +01007852 }
7853 `
7854 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007855
Paul Duffin24704672021-04-06 16:09:30 +01007856 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00007857 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007858
Spandan Das3576e762024-01-03 18:57:03 +00007859 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01007860 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007861
Paul Duffin24704672021-04-06 16:09:30 +01007862 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7863
7864 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007865 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7866 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007867
7868 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007869}
7870
Pranav Guptaeba03b02022-09-27 00:27:08 +00007871func TestApexSetApksModuleAssignment(t *testing.T) {
7872 ctx := testApex(t, `
7873 apex_set {
7874 name: "myapex",
7875 set: ":myapex_apks_file",
7876 }
7877
7878 filegroup {
7879 name: "myapex_apks_file",
7880 srcs: ["myapex.apks"],
7881 }
7882 `)
7883
Spandan Das3576e762024-01-03 18:57:03 +00007884 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00007885
7886 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00007887 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00007888 extractedApex := m.Output(extractorOutput)
7889
7890 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7891}
7892
Paul Duffin89f570a2021-06-16 01:42:33 +01007893func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007894 t.Helper()
7895
Paul Duffin55607122021-03-30 23:32:51 +01007896 fs := android.MockFS{
7897 "a.java": nil,
7898 "a.jar": nil,
7899 "apex_manifest.json": nil,
7900 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007901 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007902 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7903 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7904 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007905 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007906 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007907
Paul Duffin55607122021-03-30 23:32:51 +01007908 errorHandler := android.FixtureExpectsNoErrors
7909 if errmsg != "" {
7910 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007911 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007912
Paul Duffin55607122021-03-30 23:32:51 +01007913 result := android.GroupFixturePreparers(
7914 cc.PrepareForTestWithCcDefaultModules,
7915 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007916 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01007917 java.PrepareForTestWithJavaSdkLibraryFiles,
7918 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007919 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007920 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007921 android.FixtureModifyMockFS(func(fs android.MockFS) {
7922 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7923 insert := ""
7924 for _, fragment := range fragments {
7925 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7926 }
7927 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7928 platform_bootclasspath {
7929 name: "platform-bootclasspath",
7930 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007931 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01007932 %s
7933 ],
7934 }
7935 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007936 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007937 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007938 // Dexpreopt for boot jars requires the ART boot image profile.
7939 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
7940 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007941 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007942 ).
7943 ExtendWithErrorHandler(errorHandler).
7944 RunTestWithBp(t, bp)
7945
7946 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007947}
7948
Jooyung Han548640b2020-04-27 12:10:30 +09007949func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7950 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7951 apex {
7952 name: "myapex",
7953 key: "myapex.key",
7954 updatable: true,
7955 }
7956
7957 apex_key {
7958 name: "myapex.key",
7959 public_key: "testkey.avbpubkey",
7960 private_key: "testkey.pem",
7961 }
7962 `)
7963}
7964
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007965func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7966 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7967 apex {
7968 name: "myapex",
7969 key: "myapex.key",
7970 }
7971
7972 apex_key {
7973 name: "myapex.key",
7974 public_key: "testkey.avbpubkey",
7975 private_key: "testkey.pem",
7976 }
7977 `)
7978}
7979
satayevb98371c2021-06-15 16:49:50 +01007980func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7981 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7982 apex {
7983 name: "myapex",
7984 key: "myapex.key",
7985 systemserverclasspath_fragments: [
7986 "mysystemserverclasspathfragment",
7987 ],
7988 min_sdk_version: "29",
7989 updatable: true,
7990 }
7991
7992 apex_key {
7993 name: "myapex.key",
7994 public_key: "testkey.avbpubkey",
7995 private_key: "testkey.pem",
7996 }
7997
7998 java_library {
7999 name: "foo",
8000 srcs: ["b.java"],
8001 min_sdk_version: "29",
8002 installable: true,
8003 apex_available: [
8004 "myapex",
8005 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008006 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008007 }
8008
8009 systemserverclasspath_fragment {
8010 name: "mysystemserverclasspathfragment",
8011 generate_classpaths_proto: false,
8012 contents: [
8013 "foo",
8014 ],
8015 apex_available: [
8016 "myapex",
8017 ],
8018 }
satayevabcd5972021-08-06 17:49:46 +01008019 `,
8020 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8021 )
satayevb98371c2021-06-15 16:49:50 +01008022}
8023
Paul Duffin064b70c2020-11-02 17:32:38 +00008024func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008025 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008026 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008027 fragment := java.ApexVariantReference{
8028 Apex: proptools.StringPtr("myapex"),
8029 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8030 }
8031
Paul Duffin064b70c2020-11-02 17:32:38 +00008032 testDexpreoptWithApexes(t, `
8033 prebuilt_apex {
8034 name: "myapex" ,
8035 arch: {
8036 arm64: {
8037 src: "myapex-arm64.apex",
8038 },
8039 arm: {
8040 src: "myapex-arm.apex",
8041 },
8042 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008043 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8044 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008045
Paul Duffin89f570a2021-06-16 01:42:33 +01008046 prebuilt_bootclasspath_fragment {
8047 name: "my-bootclasspath-fragment",
8048 contents: ["libfoo"],
8049 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008050 hidden_api: {
8051 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8052 metadata: "my-bootclasspath-fragment/metadata.csv",
8053 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008054 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8055 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8056 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008057 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008058 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008059
Paul Duffin89f570a2021-06-16 01:42:33 +01008060 java_import {
8061 name: "libfoo",
8062 jars: ["libfoo.jar"],
8063 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008064 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008065 }
8066 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008067 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008068}
8069
Spandan Dasf14e2542021-11-12 00:01:37 +00008070func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008071 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008072 bp += `
8073 apex_key {
8074 name: "myapex.key",
8075 public_key: "testkey.avbpubkey",
8076 private_key: "testkey.pem",
8077 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008078 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008079 "lib1/src/A.java": nil,
8080 "lib2/src/B.java": nil,
8081 "system/sepolicy/apex/myapex-file_contexts": nil,
8082 }
8083
Paul Duffin45338f02021-03-30 23:07:52 +01008084 errorHandler := android.FixtureExpectsNoErrors
8085 if errmsg != "" {
8086 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008087 }
Colin Crossae8600b2020-10-29 17:09:13 -07008088
Paul Duffin45338f02021-03-30 23:07:52 +01008089 android.GroupFixturePreparers(
8090 android.PrepareForTestWithAndroidBuildComponents,
8091 java.PrepareForTestWithJavaBuildComponents,
8092 PrepareForTestWithApexBuildComponents,
8093 android.PrepareForTestWithNeverallowRules(rules),
8094 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008095 apexBootJars := make([]string, 0, len(bootJars))
8096 for _, apexBootJar := range bootJars {
8097 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008098 }
satayevd604b212021-07-21 14:23:52 +01008099 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008100 }),
8101 fs.AddToFixture(),
8102 ).
8103 ExtendWithErrorHandler(errorHandler).
8104 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008105}
8106
8107func TestApexPermittedPackagesRules(t *testing.T) {
8108 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008109 name string
8110 expectedError string
8111 bp string
8112 bootJars []string
8113 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008114 }{
8115
8116 {
8117 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8118 expectedError: "",
8119 bp: `
8120 java_library {
8121 name: "bcp_lib1",
8122 srcs: ["lib1/src/*.java"],
8123 permitted_packages: ["foo.bar"],
8124 apex_available: ["myapex"],
8125 sdk_version: "none",
8126 system_modules: "none",
8127 }
8128 java_library {
8129 name: "nonbcp_lib2",
8130 srcs: ["lib2/src/*.java"],
8131 apex_available: ["myapex"],
8132 permitted_packages: ["a.b"],
8133 sdk_version: "none",
8134 system_modules: "none",
8135 }
8136 apex {
8137 name: "myapex",
8138 key: "myapex.key",
8139 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008140 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008141 }`,
8142 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008143 bcpPermittedPackages: map[string][]string{
8144 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008145 "foo.bar",
8146 },
8147 },
8148 },
8149 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008150 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008151 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 +01008152 bp: `
8153 java_library {
8154 name: "bcp_lib1",
8155 srcs: ["lib1/src/*.java"],
8156 apex_available: ["myapex"],
8157 permitted_packages: ["foo.bar"],
8158 sdk_version: "none",
8159 system_modules: "none",
8160 }
8161 java_library {
8162 name: "bcp_lib2",
8163 srcs: ["lib2/src/*.java"],
8164 apex_available: ["myapex"],
8165 permitted_packages: ["foo.bar", "bar.baz"],
8166 sdk_version: "none",
8167 system_modules: "none",
8168 }
8169 apex {
8170 name: "myapex",
8171 key: "myapex.key",
8172 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008173 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008174 }
8175 `,
8176 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008177 bcpPermittedPackages: map[string][]string{
8178 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008179 "foo.bar",
8180 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008181 "bcp_lib2": []string{
8182 "foo.bar",
8183 },
8184 },
8185 },
8186 {
8187 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8188 expectedError: "",
8189 bp: `
8190 java_library {
8191 name: "bcp_lib_restricted",
8192 srcs: ["lib1/src/*.java"],
8193 apex_available: ["myapex"],
8194 permitted_packages: ["foo.bar"],
8195 sdk_version: "none",
8196 min_sdk_version: "29",
8197 system_modules: "none",
8198 }
8199 java_library {
8200 name: "bcp_lib_unrestricted",
8201 srcs: ["lib2/src/*.java"],
8202 apex_available: ["myapex"],
8203 permitted_packages: ["foo.bar", "bar.baz"],
8204 sdk_version: "none",
8205 min_sdk_version: "29",
8206 system_modules: "none",
8207 }
8208 apex {
8209 name: "myapex",
8210 key: "myapex.key",
8211 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8212 updatable: true,
8213 min_sdk_version: "29",
8214 }
8215 `,
8216 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8217 bcpPermittedPackages: map[string][]string{
8218 "bcp_lib1_non_updateable": []string{
8219 "foo.bar",
8220 },
8221 // 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 +01008222 },
8223 },
8224 }
8225 for _, tc := range testcases {
8226 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008227 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8228 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008229 })
8230 }
8231}
8232
Jiyong Park62304bb2020-04-13 16:19:48 +09008233func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008234 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008235 apex {
8236 name: "myapex",
8237 key: "myapex.key",
8238 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008239 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008240 }
8241
8242 apex_key {
8243 name: "myapex.key",
8244 public_key: "testkey.avbpubkey",
8245 private_key: "testkey.pem",
8246 }
8247
8248 cc_library {
8249 name: "mylib",
8250 srcs: ["mylib.cpp"],
8251 system_shared_libs: [],
8252 stl: "none",
8253 stubs: {
8254 versions: ["1"],
8255 },
8256 apex_available: ["myapex"],
8257 }
8258
8259 cc_library {
8260 name: "myprivlib",
8261 srcs: ["mylib.cpp"],
8262 system_shared_libs: [],
8263 stl: "none",
8264 apex_available: ["myapex"],
8265 }
8266
8267
8268 cc_test {
8269 name: "mytest",
8270 gtest: false,
8271 srcs: ["mylib.cpp"],
8272 system_shared_libs: [],
8273 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008274 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008275 test_for: ["myapex"]
8276 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008277
8278 cc_library {
8279 name: "mytestlib",
8280 srcs: ["mylib.cpp"],
8281 system_shared_libs: [],
8282 shared_libs: ["mylib", "myprivlib"],
8283 stl: "none",
8284 test_for: ["myapex"],
8285 }
8286
8287 cc_benchmark {
8288 name: "mybench",
8289 srcs: ["mylib.cpp"],
8290 system_shared_libs: [],
8291 shared_libs: ["mylib", "myprivlib"],
8292 stl: "none",
8293 test_for: ["myapex"],
8294 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008295 `)
8296
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008297 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008298 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008299 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8300 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8301 }
8302
8303 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008304 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008305 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8306 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8307 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8308}
Jiyong Park46a512f2020-12-04 18:02:13 +09008309
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008310func TestIndirectTestFor(t *testing.T) {
8311 ctx := testApex(t, `
8312 apex {
8313 name: "myapex",
8314 key: "myapex.key",
8315 native_shared_libs: ["mylib", "myprivlib"],
8316 updatable: false,
8317 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008318
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008319 apex_key {
8320 name: "myapex.key",
8321 public_key: "testkey.avbpubkey",
8322 private_key: "testkey.pem",
8323 }
8324
8325 cc_library {
8326 name: "mylib",
8327 srcs: ["mylib.cpp"],
8328 system_shared_libs: [],
8329 stl: "none",
8330 stubs: {
8331 versions: ["1"],
8332 },
8333 apex_available: ["myapex"],
8334 }
8335
8336 cc_library {
8337 name: "myprivlib",
8338 srcs: ["mylib.cpp"],
8339 system_shared_libs: [],
8340 stl: "none",
8341 shared_libs: ["mylib"],
8342 apex_available: ["myapex"],
8343 }
8344
8345 cc_library {
8346 name: "mytestlib",
8347 srcs: ["mylib.cpp"],
8348 system_shared_libs: [],
8349 shared_libs: ["myprivlib"],
8350 stl: "none",
8351 test_for: ["myapex"],
8352 }
8353 `)
8354
8355 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008356 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008357 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8358 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8359 }
8360
8361 // The platform variant of mytestlib links to the platform variant of the
8362 // internal myprivlib.
8363 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8364
8365 // The platform variant of myprivlib links to the platform variant of mylib
8366 // and bypasses its stubs.
8367 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 +09008368}
8369
Martin Stjernholmec009002021-03-27 15:18:31 +00008370func TestTestForForLibInOtherApex(t *testing.T) {
8371 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8372 _ = testApex(t, `
8373 apex {
8374 name: "com.android.art",
8375 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008376 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008377 updatable: false,
8378 }
8379
8380 apex {
8381 name: "com.android.art.debug",
8382 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008383 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008384 updatable: false,
8385 }
8386
8387 apex_key {
8388 name: "myapex.key",
8389 public_key: "testkey.avbpubkey",
8390 private_key: "testkey.pem",
8391 }
8392
8393 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008394 name: "libnativebridge",
8395 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008396 system_shared_libs: [],
8397 stl: "none",
8398 stubs: {
8399 versions: ["1"],
8400 },
8401 apex_available: ["com.android.art", "com.android.art.debug"],
8402 }
8403
8404 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008405 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008406 srcs: ["mylib.cpp"],
8407 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008408 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008409 stl: "none",
8410 apex_available: ["com.android.art.debug"],
8411 test_for: ["com.android.art"],
8412 }
8413 `,
8414 android.MockFS{
8415 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8416 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8417 }.AddToFixture())
8418}
8419
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008420// TODO(jungjw): Move this to proptools
8421func intPtr(i int) *int {
8422 return &i
8423}
8424
8425func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008426 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008427 apex_set {
8428 name: "myapex",
8429 set: "myapex.apks",
8430 filename: "foo_v2.apex",
8431 overrides: ["foo"],
8432 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008433 `,
8434 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8435 variables.Platform_sdk_version = intPtr(30)
8436 }),
8437 android.FixtureModifyConfig(func(config android.Config) {
8438 config.Targets[android.Android] = []android.Target{
8439 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8440 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8441 }
8442 }),
8443 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008444
Spandan Das3576e762024-01-03 18:57:03 +00008445 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008446
8447 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008448 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008449 actual := extractedApex.Args["abis"]
8450 expected := "ARMEABI_V7A,ARM64_V8A"
8451 if actual != expected {
8452 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8453 }
8454 actual = extractedApex.Args["sdk-version"]
8455 expected = "30"
8456 if actual != expected {
8457 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8458 }
8459
Paul Duffin6717d882021-06-15 19:09:41 +01008460 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008461 a := m.Module().(*ApexSet)
8462 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008463 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008464 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8465 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8466 }
8467}
8468
Anton Hansson805e0a52022-11-25 14:06:46 +00008469func TestApexSet_NativeBridge(t *testing.T) {
8470 ctx := testApex(t, `
8471 apex_set {
8472 name: "myapex",
8473 set: "myapex.apks",
8474 filename: "foo_v2.apex",
8475 overrides: ["foo"],
8476 }
8477 `,
8478 android.FixtureModifyConfig(func(config android.Config) {
8479 config.Targets[android.Android] = []android.Target{
8480 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8481 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8482 }
8483 }),
8484 )
8485
Spandan Das3576e762024-01-03 18:57:03 +00008486 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008487
8488 // Check extract_apks tool parameters. No native bridge arch expected
8489 extractedApex := m.Output("extracted/myapex.apks")
8490 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8491}
8492
Jiyong Park7d95a512020-05-10 15:16:24 +09008493func TestNoStaticLinkingToStubsLib(t *testing.T) {
8494 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8495 apex {
8496 name: "myapex",
8497 key: "myapex.key",
8498 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008499 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008500 }
8501
8502 apex_key {
8503 name: "myapex.key",
8504 public_key: "testkey.avbpubkey",
8505 private_key: "testkey.pem",
8506 }
8507
8508 cc_library {
8509 name: "mylib",
8510 srcs: ["mylib.cpp"],
8511 static_libs: ["otherlib"],
8512 system_shared_libs: [],
8513 stl: "none",
8514 apex_available: [ "myapex" ],
8515 }
8516
8517 cc_library {
8518 name: "otherlib",
8519 srcs: ["mylib.cpp"],
8520 system_shared_libs: [],
8521 stl: "none",
8522 stubs: {
8523 versions: ["1", "2", "3"],
8524 },
8525 apex_available: [ "myapex" ],
8526 }
8527 `)
8528}
8529
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008530func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008531 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008532 apex {
8533 name: "myapex",
8534 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008535 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008536 custom_sign_tool: "sign_myapex",
8537 }
8538
8539 apex_key {
8540 name: "myapex.key",
8541 public_key: "testkey.avbpubkey",
8542 private_key: "testkey.pem",
8543 }
8544 `)
8545
Jooyung Han286957d2023-10-30 16:17:56 +09008546 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008547 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008548 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 +09008549}
8550
8551func TestApexKeysTxtOverrides(t *testing.T) {
8552 ctx := testApex(t, `
8553 apex {
8554 name: "myapex",
8555 key: "myapex.key",
8556 updatable: false,
8557 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008558 }
8559
8560 apex_key {
8561 name: "myapex.key",
8562 public_key: "testkey.avbpubkey",
8563 private_key: "testkey.pem",
8564 }
8565
8566 prebuilt_apex {
8567 name: "myapex",
8568 prefer: true,
8569 arch: {
8570 arm64: {
8571 src: "myapex-arm64.apex",
8572 },
8573 arm: {
8574 src: "myapex-arm.apex",
8575 },
8576 },
8577 }
8578
8579 apex_set {
8580 name: "myapex_set",
8581 set: "myapex.apks",
8582 filename: "myapex_set.apex",
8583 overrides: ["myapex"],
8584 }
8585 `)
8586
Colin Crossf61d03d2023-11-02 16:56:39 -07008587 content := android.ContentFromFileRuleForTests(t, ctx,
8588 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008589 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 -07008590 content = android.ContentFromFileRuleForTests(t, ctx,
8591 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008592 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 +09008593}
8594
Jooyung Han938b5932020-06-20 12:47:47 +09008595func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008596 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008597 apex {
8598 name: "myapex",
8599 key: "myapex.key",
8600 apps: ["app"],
8601 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008602 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008603 }
8604
8605 apex_key {
8606 name: "myapex.key",
8607 public_key: "testkey.avbpubkey",
8608 private_key: "testkey.pem",
8609 }
8610
8611 android_app {
8612 name: "app",
8613 srcs: ["foo/bar/MyClass.java"],
8614 package_name: "foo",
8615 sdk_version: "none",
8616 system_modules: "none",
8617 apex_available: [ "myapex" ],
8618 }
8619 `, withFiles(map[string][]byte{
8620 "sub/Android.bp": []byte(`
8621 override_apex {
8622 name: "override_myapex",
8623 base: "myapex",
8624 apps: ["override_app"],
8625 allowed_files: ":allowed",
8626 }
8627 // Overridable "path" property should be referenced indirectly
8628 filegroup {
8629 name: "allowed",
8630 srcs: ["allowed.txt"],
8631 }
8632 override_android_app {
8633 name: "override_app",
8634 base: "app",
8635 package_name: "bar",
8636 }
8637 `),
8638 }))
8639
Jooyung Hana0503a52023-08-23 13:12:50 +09008640 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008641 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8642 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8643 }
8644
Spandan Das50801e22024-05-13 18:29:45 +00008645 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008646 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8647 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8648 }
8649}
8650
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008651func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008652 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008653 apex {
8654 name: "myapex",
8655 key: "myapex.key",
8656 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008657 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008658 }
8659
8660 apex_key {
8661 name: "myapex.key",
8662 public_key: "testkey.avbpubkey",
8663 private_key: "testkey.pem",
8664 }
8665
8666 cc_library {
8667 name: "mylib",
8668 srcs: ["mylib.cpp"],
8669 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008670 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008671 },
8672 apex_available: ["myapex"],
8673 }
8674
8675 cc_prebuilt_library_shared {
8676 name: "mylib",
8677 prefer: false,
8678 srcs: ["prebuilt.so"],
8679 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008680 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008681 },
8682 apex_available: ["myapex"],
8683 }
8684 `)
8685}
8686
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008687func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008688 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008689 apex {
8690 name: "myapex",
8691 key: "myapex.key",
8692 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008693 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008694 }
8695 apex_key {
8696 name: "myapex.key",
8697 public_key: "testkey.avbpubkey",
8698 private_key: "testkey.pem",
8699 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008700 `,
8701 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8702 variables.CompressedApex = proptools.BoolPtr(true)
8703 }),
8704 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008705
Jooyung Hana0503a52023-08-23 13:12:50 +09008706 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008707 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8708
Jooyung Hana0503a52023-08-23 13:12:50 +09008709 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008710 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8711
8712 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008713 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008714 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8715
8716 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008717 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008718 var builder strings.Builder
8719 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8720 androidMk := builder.String()
8721 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8722}
8723
Jooyung Han26ec8482024-07-31 15:04:05 +09008724func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8725 for _, compressionEnabled := range []bool{true, false} {
8726 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8727 ctx := testApex(t, `
8728 apex_set {
8729 name: "com.company.android.myapex",
8730 apex_name: "com.android.myapex",
8731 set: "company-myapex.apks",
8732 }
8733 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8734 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8735 }),
8736 )
8737
8738 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8739 if compressionEnabled {
8740 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8741 } else {
8742 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8743 }
8744 })
8745 }
8746}
8747
Martin Stjernholm2856c662020-12-02 15:03:42 +00008748func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008749 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008750 apex {
8751 name: "myapex",
8752 key: "myapex.key",
8753 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008754 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008755 }
8756
8757 apex_key {
8758 name: "myapex.key",
8759 public_key: "testkey.avbpubkey",
8760 private_key: "testkey.pem",
8761 }
8762
8763 cc_library {
8764 name: "mylib",
8765 srcs: ["mylib.cpp"],
8766 apex_available: ["myapex"],
8767 shared_libs: ["otherlib"],
8768 system_shared_libs: [],
8769 }
8770
8771 cc_library {
8772 name: "otherlib",
8773 srcs: ["mylib.cpp"],
8774 stubs: {
8775 versions: ["current"],
8776 },
8777 }
8778
8779 cc_prebuilt_library_shared {
8780 name: "otherlib",
8781 prefer: true,
8782 srcs: ["prebuilt.so"],
8783 stubs: {
8784 versions: ["current"],
8785 },
8786 }
8787 `)
8788
Jooyung Hana0503a52023-08-23 13:12:50 +09008789 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008790 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008791 var builder strings.Builder
8792 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8793 androidMk := builder.String()
8794
8795 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8796 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008797 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00008798}
8799
Jiyong Parke3867542020-12-03 17:28:25 +09008800func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008801 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008802 apex {
8803 name: "myapex",
8804 key: "myapex.key",
8805 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008806 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008807 }
8808
8809 apex_key {
8810 name: "myapex.key",
8811 public_key: "testkey.avbpubkey",
8812 private_key: "testkey.pem",
8813 }
8814
8815 cc_library {
8816 name: "mylib",
8817 srcs: ["mylib.cpp"],
8818 system_shared_libs: [],
8819 stl: "none",
8820 apex_available: ["myapex"],
8821 shared_libs: ["mylib2"],
8822 target: {
8823 apex: {
8824 exclude_shared_libs: ["mylib2"],
8825 },
8826 },
8827 }
8828
8829 cc_library {
8830 name: "mylib2",
8831 srcs: ["mylib.cpp"],
8832 system_shared_libs: [],
8833 stl: "none",
8834 }
8835 `)
8836
8837 // Check if mylib is linked to mylib2 for the non-apex target
8838 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8839 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8840
8841 // Make sure that the link doesn't occur for the apex target
8842 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8843 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8844
8845 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09008846 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09008847 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8848}
8849
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008850func TestPrebuiltStubLibDep(t *testing.T) {
8851 bpBase := `
8852 apex {
8853 name: "myapex",
8854 key: "myapex.key",
8855 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008856 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008857 }
8858 apex_key {
8859 name: "myapex.key",
8860 public_key: "testkey.avbpubkey",
8861 private_key: "testkey.pem",
8862 }
8863 cc_library {
8864 name: "mylib",
8865 srcs: ["mylib.cpp"],
8866 apex_available: ["myapex"],
8867 shared_libs: ["stublib"],
8868 system_shared_libs: [],
8869 }
8870 apex {
8871 name: "otherapex",
8872 enabled: %s,
8873 key: "myapex.key",
8874 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008875 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008876 }
8877 `
8878
8879 stublibSourceBp := `
8880 cc_library {
8881 name: "stublib",
8882 srcs: ["mylib.cpp"],
8883 apex_available: ["otherapex"],
8884 system_shared_libs: [],
8885 stl: "none",
8886 stubs: {
8887 versions: ["1"],
8888 },
8889 }
8890 `
8891
8892 stublibPrebuiltBp := `
8893 cc_prebuilt_library_shared {
8894 name: "stublib",
8895 srcs: ["prebuilt.so"],
8896 apex_available: ["otherapex"],
8897 stubs: {
8898 versions: ["1"],
8899 },
8900 %s
8901 }
8902 `
8903
8904 tests := []struct {
8905 name string
8906 stublibBp string
8907 usePrebuilt bool
8908 modNames []string // Modules to collect AndroidMkEntries for
8909 otherApexEnabled []string
8910 }{
8911 {
8912 name: "only_source",
8913 stublibBp: stublibSourceBp,
8914 usePrebuilt: false,
8915 modNames: []string{"stublib"},
8916 otherApexEnabled: []string{"true", "false"},
8917 },
8918 {
8919 name: "source_preferred",
8920 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8921 usePrebuilt: false,
8922 modNames: []string{"stublib", "prebuilt_stublib"},
8923 otherApexEnabled: []string{"true", "false"},
8924 },
8925 {
8926 name: "prebuilt_preferred",
8927 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8928 usePrebuilt: true,
8929 modNames: []string{"stublib", "prebuilt_stublib"},
8930 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8931 },
8932 {
8933 name: "only_prebuilt",
8934 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8935 usePrebuilt: true,
8936 modNames: []string{"stublib"},
8937 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8938 },
8939 }
8940
8941 for _, test := range tests {
8942 t.Run(test.name, func(t *testing.T) {
8943 for _, otherApexEnabled := range test.otherApexEnabled {
8944 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008945 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008946
8947 type modAndMkEntries struct {
8948 mod *cc.Module
8949 mkEntries android.AndroidMkEntries
8950 }
8951 entries := []*modAndMkEntries{}
8952
8953 // Gather shared lib modules that are installable
8954 for _, modName := range test.modNames {
8955 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8956 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8957 continue
8958 }
8959 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07008960 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008961 continue
8962 }
Colin Crossaa255532020-07-03 13:18:24 -07008963 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008964 if ent.Disabled {
8965 continue
8966 }
8967 entries = append(entries, &modAndMkEntries{
8968 mod: mod,
8969 mkEntries: ent,
8970 })
8971 }
8972 }
8973 }
8974
8975 var entry *modAndMkEntries = nil
8976 for _, ent := range entries {
8977 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8978 if entry != nil {
8979 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8980 } else {
8981 entry = ent
8982 }
8983 }
8984 }
8985
8986 if entry == nil {
8987 t.Errorf("AndroidMk entry for \"stublib\" missing")
8988 } else {
8989 isPrebuilt := entry.mod.Prebuilt() != nil
8990 if isPrebuilt != test.usePrebuilt {
8991 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8992 }
8993 if !entry.mod.IsStubs() {
8994 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8995 }
8996 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8997 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8998 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008999 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009000 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009001 if !android.InList(expected, cflags) {
9002 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9003 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009004 }
9005 })
9006 }
9007 })
9008 }
9009}
9010
Colin Crossc33e5212021-05-25 18:16:02 -07009011func TestApexJavaCoverage(t *testing.T) {
9012 bp := `
9013 apex {
9014 name: "myapex",
9015 key: "myapex.key",
9016 java_libs: ["mylib"],
9017 bootclasspath_fragments: ["mybootclasspathfragment"],
9018 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9019 updatable: false,
9020 }
9021
9022 apex_key {
9023 name: "myapex.key",
9024 public_key: "testkey.avbpubkey",
9025 private_key: "testkey.pem",
9026 }
9027
9028 java_library {
9029 name: "mylib",
9030 srcs: ["mylib.java"],
9031 apex_available: ["myapex"],
9032 compile_dex: true,
9033 }
9034
9035 bootclasspath_fragment {
9036 name: "mybootclasspathfragment",
9037 contents: ["mybootclasspathlib"],
9038 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009039 hidden_api: {
9040 split_packages: ["*"],
9041 },
Colin Crossc33e5212021-05-25 18:16:02 -07009042 }
9043
9044 java_library {
9045 name: "mybootclasspathlib",
9046 srcs: ["mybootclasspathlib.java"],
9047 apex_available: ["myapex"],
9048 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009049 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009050 }
9051
9052 systemserverclasspath_fragment {
9053 name: "mysystemserverclasspathfragment",
9054 contents: ["mysystemserverclasspathlib"],
9055 apex_available: ["myapex"],
9056 }
9057
9058 java_library {
9059 name: "mysystemserverclasspathlib",
9060 srcs: ["mysystemserverclasspathlib.java"],
9061 apex_available: ["myapex"],
9062 compile_dex: true,
9063 }
9064 `
9065
9066 result := android.GroupFixturePreparers(
9067 PrepareForTestWithApexBuildComponents,
9068 prepareForTestWithMyapex,
9069 java.PrepareForTestWithJavaDefaultModules,
9070 android.PrepareForTestWithAndroidBuildComponents,
9071 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009072 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9073 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009074 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009075 ).RunTest(t)
9076
9077 // Make sure jacoco ran on both mylib and mybootclasspathlib
9078 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9079 t.Errorf("Failed to find jacoco rule for mylib")
9080 }
9081 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9082 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9083 }
9084 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9085 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9086 }
9087}
9088
Jiyong Park192600a2021-08-03 07:52:17 +00009089func TestProhibitStaticExecutable(t *testing.T) {
9090 testApexError(t, `executable mybin is static`, `
9091 apex {
9092 name: "myapex",
9093 key: "myapex.key",
9094 binaries: ["mybin"],
9095 min_sdk_version: "29",
9096 }
9097
9098 apex_key {
9099 name: "myapex.key",
9100 public_key: "testkey.avbpubkey",
9101 private_key: "testkey.pem",
9102 }
9103
9104 cc_binary {
9105 name: "mybin",
9106 srcs: ["mylib.cpp"],
9107 relative_install_path: "foo/bar",
9108 static_executable: true,
9109 system_shared_libs: [],
9110 stl: "none",
9111 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009112 min_sdk_version: "29",
9113 }
9114 `)
9115
9116 testApexError(t, `executable mybin.rust is static`, `
9117 apex {
9118 name: "myapex",
9119 key: "myapex.key",
9120 binaries: ["mybin.rust"],
9121 min_sdk_version: "29",
9122 }
9123
9124 apex_key {
9125 name: "myapex.key",
9126 public_key: "testkey.avbpubkey",
9127 private_key: "testkey.pem",
9128 }
9129
9130 rust_binary {
9131 name: "mybin.rust",
9132 srcs: ["foo.rs"],
9133 static_executable: true,
9134 apex_available: ["myapex"],
9135 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009136 }
9137 `)
9138}
9139
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009140func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9141 ctx := testApex(t, `
9142 apex {
9143 name: "myapex",
9144 key: "myapex.key",
9145 updatable: false,
9146 java_libs: ["foo"],
9147 }
9148
9149 apex_key {
9150 name: "myapex.key",
9151 public_key: "testkey.avbpubkey",
9152 private_key: "testkey.pem",
9153 }
9154
9155 java_library {
9156 name: "foo",
9157 srcs: ["foo.java"],
9158 apex_available: ["myapex"],
9159 installable: true,
9160 }
9161 `,
9162 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9163 )
9164
Jooyung Hana0503a52023-08-23 13:12:50 +09009165 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009166 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9167 var builder strings.Builder
9168 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9169 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009170 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 +00009171}
9172
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009173func TestAndroidMk_RequiredModules(t *testing.T) {
9174 ctx := testApex(t, `
9175 apex {
9176 name: "myapex",
9177 key: "myapex.key",
9178 updatable: false,
9179 java_libs: ["foo"],
9180 required: ["otherapex"],
9181 }
9182
9183 apex {
9184 name: "otherapex",
9185 key: "myapex.key",
9186 updatable: false,
9187 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009188 }
9189
9190 apex_key {
9191 name: "myapex.key",
9192 public_key: "testkey.avbpubkey",
9193 private_key: "testkey.pem",
9194 }
9195
9196 java_library {
9197 name: "foo",
9198 srcs: ["foo.java"],
9199 apex_available: ["myapex", "otherapex"],
9200 installable: true,
9201 }
9202 `)
9203
Jooyung Hana0503a52023-08-23 13:12:50 +09009204 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009205 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9206 var builder strings.Builder
9207 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9208 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009209 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009210}
9211
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009212func TestAndroidMk_RequiredDeps(t *testing.T) {
9213 ctx := testApex(t, `
9214 apex {
9215 name: "myapex",
9216 key: "myapex.key",
9217 updatable: false,
9218 }
9219
9220 apex_key {
9221 name: "myapex.key",
9222 public_key: "testkey.avbpubkey",
9223 private_key: "testkey.pem",
9224 }
9225 `)
9226
Jooyung Hana0503a52023-08-23 13:12:50 +09009227 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009228 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009229 data := android.AndroidMkDataForTest(t, ctx, bundle)
9230 var builder strings.Builder
9231 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9232 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009233 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009234}
9235
Jooyung Hana6d36672022-02-24 13:58:07 +09009236func TestApexOutputFileProducer(t *testing.T) {
9237 for _, tc := range []struct {
9238 name string
9239 ref string
9240 expected_data []string
9241 }{
9242 {
9243 name: "test_using_output",
9244 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009245 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009246 },
9247 {
9248 name: "test_using_apex",
9249 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009250 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009251 },
9252 } {
9253 t.Run(tc.name, func(t *testing.T) {
9254 ctx := testApex(t, `
9255 apex {
9256 name: "myapex",
9257 key: "myapex.key",
9258 compressible: true,
9259 updatable: false,
9260 }
9261
9262 apex_key {
9263 name: "myapex.key",
9264 public_key: "testkey.avbpubkey",
9265 private_key: "testkey.pem",
9266 }
9267
9268 java_test {
9269 name: "`+tc.name+`",
9270 srcs: ["a.java"],
9271 data: ["`+tc.ref+`"],
9272 }
9273 `,
9274 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9275 variables.CompressedApex = proptools.BoolPtr(true)
9276 }))
9277 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9278 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9279 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9280 })
9281 }
9282}
9283
satayev758968a2021-12-06 11:42:40 +00009284func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9285 preparer := android.GroupFixturePreparers(
9286 PrepareForTestWithApexBuildComponents,
9287 prepareForTestWithMyapex,
9288 java.PrepareForTestWithJavaSdkLibraryFiles,
9289 java.PrepareForTestWithJavaDefaultModules,
9290 android.PrepareForTestWithAndroidBuildComponents,
9291 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9292 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9293 )
9294
9295 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9296 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9297 preparer.RunTestWithBp(t, `
9298 apex {
9299 name: "myapex",
9300 key: "myapex.key",
9301 bootclasspath_fragments: ["mybootclasspathfragment"],
9302 min_sdk_version: "30",
9303 updatable: false,
9304 }
9305
9306 apex_key {
9307 name: "myapex.key",
9308 public_key: "testkey.avbpubkey",
9309 private_key: "testkey.pem",
9310 }
9311
9312 bootclasspath_fragment {
9313 name: "mybootclasspathfragment",
9314 contents: ["mybootclasspathlib"],
9315 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009316 hidden_api: {
9317 split_packages: ["*"],
9318 },
satayev758968a2021-12-06 11:42:40 +00009319 }
9320
9321 java_sdk_library {
9322 name: "mybootclasspathlib",
9323 srcs: ["mybootclasspathlib.java"],
9324 apex_available: ["myapex"],
9325 compile_dex: true,
9326 unsafe_ignore_missing_latest_api: true,
9327 min_sdk_version: "31",
9328 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009329 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009330 }
9331
9332 java_library {
9333 name: "util",
9334 srcs: ["a.java"],
9335 apex_available: ["myapex"],
9336 min_sdk_version: "31",
9337 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009338 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009339 }
9340
9341 java_library {
9342 name: "another_util",
9343 srcs: ["a.java"],
9344 min_sdk_version: "31",
9345 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009346 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009347 }
9348 `)
9349 })
9350
9351 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9352 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9353 preparer.RunTestWithBp(t, `
9354 apex {
9355 name: "myapex",
9356 key: "myapex.key",
9357 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9358 min_sdk_version: "30",
9359 updatable: false,
9360 }
9361
9362 apex_key {
9363 name: "myapex.key",
9364 public_key: "testkey.avbpubkey",
9365 private_key: "testkey.pem",
9366 }
9367
9368 systemserverclasspath_fragment {
9369 name: "mysystemserverclasspathfragment",
9370 contents: ["mysystemserverclasspathlib"],
9371 apex_available: ["myapex"],
9372 }
9373
9374 java_sdk_library {
9375 name: "mysystemserverclasspathlib",
9376 srcs: ["mysystemserverclasspathlib.java"],
9377 apex_available: ["myapex"],
9378 compile_dex: true,
9379 min_sdk_version: "32",
9380 unsafe_ignore_missing_latest_api: true,
9381 static_libs: ["util"],
9382 }
9383
9384 java_library {
9385 name: "util",
9386 srcs: ["a.java"],
9387 apex_available: ["myapex"],
9388 min_sdk_version: "31",
9389 static_libs: ["another_util"],
9390 }
9391
9392 java_library {
9393 name: "another_util",
9394 srcs: ["a.java"],
9395 min_sdk_version: "31",
9396 apex_available: ["myapex"],
9397 }
9398 `)
9399 })
9400
9401 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009402 preparer.
satayev758968a2021-12-06 11:42:40 +00009403 RunTestWithBp(t, `
9404 apex {
9405 name: "myapex",
9406 key: "myapex.key",
9407 bootclasspath_fragments: ["mybootclasspathfragment"],
9408 min_sdk_version: "30",
9409 updatable: false,
9410 }
9411
9412 apex_key {
9413 name: "myapex.key",
9414 public_key: "testkey.avbpubkey",
9415 private_key: "testkey.pem",
9416 }
9417
9418 bootclasspath_fragment {
9419 name: "mybootclasspathfragment",
9420 contents: ["mybootclasspathlib"],
9421 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009422 hidden_api: {
9423 split_packages: ["*"],
9424 },
satayev758968a2021-12-06 11:42:40 +00009425 }
9426
9427 java_sdk_library {
9428 name: "mybootclasspathlib",
9429 srcs: ["mybootclasspathlib.java"],
9430 apex_available: ["myapex"],
9431 compile_dex: true,
9432 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009433 sdk_version: "current",
9434 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009435 }
9436 `)
9437 })
9438
9439 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9440 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9441 RunTestWithBp(t, `
9442 apex {
9443 name: "myapex",
9444 key: "myapex.key",
9445 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9446 min_sdk_version: "30",
9447 updatable: false,
9448 }
9449
9450 apex_key {
9451 name: "myapex.key",
9452 public_key: "testkey.avbpubkey",
9453 private_key: "testkey.pem",
9454 }
9455
9456 systemserverclasspath_fragment {
9457 name: "mysystemserverclasspathfragment",
9458 contents: ["mysystemserverclasspathlib"],
9459 apex_available: ["myapex"],
9460 }
9461
9462 java_sdk_library {
9463 name: "mysystemserverclasspathlib",
9464 srcs: ["mysystemserverclasspathlib.java"],
9465 apex_available: ["myapex"],
9466 compile_dex: true,
9467 unsafe_ignore_missing_latest_api: true,
9468 }
9469 `)
9470 })
9471}
9472
Jiakai Zhang6decef92022-01-12 17:56:19 +00009473// Verifies that the APEX depends on all the Make modules in the list.
9474func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9475 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9476 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009477 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009478 }
9479}
9480
9481// Verifies that the APEX does not depend on any of the Make modules in the list.
9482func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9483 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9484 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009485 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009486 }
9487}
9488
Cole Faust24e25c02024-01-19 14:12:17 -08009489func TestApexStrictUpdtabilityLint(t *testing.T) {
9490 bpTemplate := `
9491 apex {
9492 name: "myapex",
9493 key: "myapex.key",
9494 java_libs: ["myjavalib"],
9495 updatable: %v,
9496 min_sdk_version: "29",
9497 }
9498 apex_key {
9499 name: "myapex.key",
9500 }
9501 java_library {
9502 name: "myjavalib",
9503 srcs: ["MyClass.java"],
9504 apex_available: [ "myapex" ],
9505 lint: {
9506 strict_updatability_linting: %v,
9507 %s
9508 },
9509 sdk_version: "current",
9510 min_sdk_version: "29",
9511 }
9512 `
9513 fs := android.MockFS{
9514 "lint-baseline.xml": nil,
9515 }
9516
9517 testCases := []struct {
9518 testCaseName string
9519 apexUpdatable bool
9520 javaStrictUpdtabilityLint bool
9521 lintFileExists bool
9522 disallowedFlagExpected bool
9523 }{
9524 {
9525 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9526 apexUpdatable: true,
9527 javaStrictUpdtabilityLint: true,
9528 lintFileExists: false,
9529 disallowedFlagExpected: false,
9530 },
9531 {
9532 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9533 apexUpdatable: false,
9534 javaStrictUpdtabilityLint: false,
9535 lintFileExists: true,
9536 disallowedFlagExpected: false,
9537 },
9538 {
9539 testCaseName: "non-updatable apex respects strict updatability of javalib",
9540 apexUpdatable: false,
9541 javaStrictUpdtabilityLint: true,
9542 lintFileExists: true,
9543 disallowedFlagExpected: true,
9544 },
9545 {
9546 testCaseName: "updatable apex sets strict updatability of javalib to true",
9547 apexUpdatable: true,
9548 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9549 lintFileExists: true,
9550 disallowedFlagExpected: true,
9551 },
9552 }
9553
9554 for _, testCase := range testCases {
9555 fixtures := []android.FixturePreparer{}
9556 baselineProperty := ""
9557 if testCase.lintFileExists {
9558 fixtures = append(fixtures, fs.AddToFixture())
9559 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9560 }
9561 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9562
9563 result := testApex(t, bp, fixtures...)
9564 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9565 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9566 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9567
9568 if disallowedFlagActual != testCase.disallowedFlagExpected {
9569 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9570 }
9571 }
9572}
9573
9574func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9575 bp := `
9576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 java_libs: ["myjavalib"],
9580 updatable: true,
9581 min_sdk_version: "29",
9582 }
9583 apex_key {
9584 name: "myapex.key",
9585 }
9586 java_library {
9587 name: "myjavalib",
9588 srcs: ["MyClass.java"],
9589 apex_available: [ "myapex" ],
9590 sdk_version: "current",
9591 min_sdk_version: "29",
9592 lint: {
9593 baseline_filename: "lint-baseline.xml",
9594 }
9595 }
9596 `
9597
9598 testCases := []struct {
9599 testCaseName string
9600 moduleDirectory string
9601 disallowedFlagExpected bool
9602 }{
9603 {
9604 testCaseName: "lintable module defined outside libcore",
9605 moduleDirectory: "",
9606 disallowedFlagExpected: true,
9607 },
9608 {
9609 testCaseName: "lintable module defined in libcore root directory",
9610 moduleDirectory: "libcore/",
9611 disallowedFlagExpected: false,
9612 },
9613 {
9614 testCaseName: "lintable module defined in libcore child directory",
9615 moduleDirectory: "libcore/childdir/",
9616 disallowedFlagExpected: true,
9617 },
9618 }
9619
9620 for _, testCase := range testCases {
9621 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9622 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9623 result := testApex(t, "", lintFileCreator, bpFileCreator)
9624 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9625 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9626 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9627 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9628
9629 if disallowedFlagActual != testCase.disallowedFlagExpected {
9630 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9631 }
9632 }
9633}
9634
9635// checks transtive deps of an apex coming from bootclasspath_fragment
9636func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9637 bp := `
9638 apex {
9639 name: "myapex",
9640 key: "myapex.key",
9641 bootclasspath_fragments: ["mybootclasspathfragment"],
9642 updatable: true,
9643 min_sdk_version: "29",
9644 }
9645 apex_key {
9646 name: "myapex.key",
9647 }
9648 bootclasspath_fragment {
9649 name: "mybootclasspathfragment",
9650 contents: ["myjavalib"],
9651 apex_available: ["myapex"],
9652 hidden_api: {
9653 split_packages: ["*"],
9654 },
9655 }
9656 java_library {
9657 name: "myjavalib",
9658 srcs: ["MyClass.java"],
9659 apex_available: [ "myapex" ],
9660 sdk_version: "current",
9661 min_sdk_version: "29",
9662 compile_dex: true,
9663 lint: {
9664 baseline_filename: "lint-baseline.xml",
9665 }
9666 }
9667 `
9668 fs := android.MockFS{
9669 "lint-baseline.xml": nil,
9670 }
9671
9672 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9673 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9674 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9675 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9676 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9677 }
9678}
Spandan Das66773252022-01-15 00:23:18 +00009679
Jihoon Kang784c0052024-06-25 22:15:39 +00009680func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9681 bp := `
9682 apex {
9683 name: "myapex",
9684 key: "myapex.key",
9685 bootclasspath_fragments: ["mybootclasspathfragment"],
9686 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009687 java_libs: [
9688 "jacocoagent",
9689 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009690 }
9691 apex_key {
9692 name: "myapex.key",
9693 }
9694 bootclasspath_fragment {
9695 name: "mybootclasspathfragment",
9696 contents: ["foo"],
9697 apex_available: ["myapex"],
9698 hidden_api: {
9699 split_packages: ["*"],
9700 },
9701 }
9702 java_sdk_library {
9703 name: "foo",
9704 srcs: ["MyClass.java"],
9705 apex_available: [ "myapex" ],
9706 sdk_version: "current",
9707 min_sdk_version: "29",
9708 compile_dex: true,
9709 }
9710 `
9711 fs := android.MockFS{
9712 "lint-baseline.xml": nil,
9713 }
9714
9715 result := android.GroupFixturePreparers(
9716 prepareForApexTest,
9717 java.PrepareForTestWithJavaSdkLibraryFiles,
9718 java.PrepareForTestWithJacocoInstrumentation,
9719 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009720 android.FixtureMergeMockFs(fs),
9721 ).RunTestWithBp(t, bp)
9722
9723 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9724 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9725 android.AssertStringDoesContain(t,
9726 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9727 lintReportInputs, "foo.impl")
9728}
9729
Spandan Das42e89502022-05-06 22:12:55 +00009730// updatable apexes should propagate updatable=true to its apps
9731func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9732 bp := `
9733 apex {
9734 name: "myapex",
9735 key: "myapex.key",
9736 updatable: %v,
9737 apps: [
9738 "myapp",
9739 ],
9740 min_sdk_version: "30",
9741 }
9742 apex_key {
9743 name: "myapex.key",
9744 }
9745 android_app {
9746 name: "myapp",
9747 updatable: %v,
9748 apex_available: [
9749 "myapex",
9750 ],
9751 sdk_version: "current",
9752 min_sdk_version: "30",
9753 }
9754 `
9755 testCases := []struct {
9756 name string
9757 apex_is_updatable_bp bool
9758 app_is_updatable_bp bool
9759 app_is_updatable_expected bool
9760 }{
9761 {
9762 name: "Non-updatable apex respects updatable property of non-updatable app",
9763 apex_is_updatable_bp: false,
9764 app_is_updatable_bp: false,
9765 app_is_updatable_expected: false,
9766 },
9767 {
9768 name: "Non-updatable apex respects updatable property of updatable app",
9769 apex_is_updatable_bp: false,
9770 app_is_updatable_bp: true,
9771 app_is_updatable_expected: true,
9772 },
9773 {
9774 name: "Updatable apex respects updatable property of updatable app",
9775 apex_is_updatable_bp: true,
9776 app_is_updatable_bp: true,
9777 app_is_updatable_expected: true,
9778 },
9779 {
9780 name: "Updatable apex sets updatable=true on non-updatable app",
9781 apex_is_updatable_bp: true,
9782 app_is_updatable_bp: false,
9783 app_is_updatable_expected: true,
9784 },
9785 }
9786 for _, testCase := range testCases {
9787 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9788 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9789 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9790 }
9791}
9792
Dennis Shend4f5d932023-01-31 20:27:21 +00009793func TestTrimmedApex(t *testing.T) {
9794 bp := `
9795 apex {
9796 name: "myapex",
9797 key: "myapex.key",
9798 native_shared_libs: ["libfoo","libbaz"],
9799 min_sdk_version: "29",
9800 trim_against: "mydcla",
9801 }
9802 apex {
9803 name: "mydcla",
9804 key: "myapex.key",
9805 native_shared_libs: ["libfoo","libbar"],
9806 min_sdk_version: "29",
9807 file_contexts: ":myapex-file_contexts",
9808 dynamic_common_lib_apex: true,
9809 }
9810 apex_key {
9811 name: "myapex.key",
9812 }
9813 cc_library {
9814 name: "libfoo",
9815 shared_libs: ["libc"],
9816 apex_available: ["myapex","mydcla"],
9817 min_sdk_version: "29",
9818 }
9819 cc_library {
9820 name: "libbar",
9821 shared_libs: ["libc"],
9822 apex_available: ["myapex","mydcla"],
9823 min_sdk_version: "29",
9824 }
9825 cc_library {
9826 name: "libbaz",
9827 shared_libs: ["libc"],
9828 apex_available: ["myapex","mydcla"],
9829 min_sdk_version: "29",
9830 }
Dennis Shend4f5d932023-01-31 20:27:21 +00009831 `
9832 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09009833 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +00009834 apexRule := module.MaybeRule("apexRule")
9835 if apexRule.Rule == nil {
9836 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
9837 }
9838
9839 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +09009840 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +00009841 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
9842 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
9843 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
9844 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
9845}
Jingwen Chendea7a642023-03-28 11:30:50 +00009846
9847func TestCannedFsConfig(t *testing.T) {
9848 ctx := testApex(t, `
9849 apex {
9850 name: "myapex",
9851 key: "myapex.key",
9852 updatable: false,
9853 }
9854
9855 apex_key {
9856 name: "myapex.key",
9857 public_key: "testkey.avbpubkey",
9858 private_key: "testkey.pem",
9859 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009860 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009861 generateFsRule := mod.Rule("generateFsConfig")
9862 cmd := generateFsRule.RuleParams.Command
9863
9864 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
9865}
9866
9867func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
9868 ctx := testApex(t, `
9869 apex {
9870 name: "myapex",
9871 key: "myapex.key",
9872 canned_fs_config: "my_config",
9873 updatable: false,
9874 }
9875
9876 apex_key {
9877 name: "myapex.key",
9878 public_key: "testkey.avbpubkey",
9879 private_key: "testkey.pem",
9880 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009881 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009882 generateFsRule := mod.Rule("generateFsConfig")
9883 cmd := generateFsRule.RuleParams.Command
9884
9885 // Ensure that canned_fs_config has "cat my_config" at the end
9886 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
9887}
Spandan Das20fce2d2023-04-12 17:21:39 +00009888
9889func TestStubLibrariesMultipleApexViolation(t *testing.T) {
9890 testCases := []struct {
9891 desc string
9892 hasStubs bool
9893 apexAvailable string
9894 expectedError string
9895 }{
9896 {
9897 desc: "non-stub library can have multiple apex_available",
9898 hasStubs: false,
9899 apexAvailable: `["myapex", "otherapex"]`,
9900 },
9901 {
9902 desc: "stub library should not be available to anyapex",
9903 hasStubs: true,
9904 apexAvailable: `["//apex_available:anyapex"]`,
9905 expectedError: "Stub libraries should have a single apex_available.*anyapex",
9906 },
9907 {
9908 desc: "stub library should not be available to multiple apexes",
9909 hasStubs: true,
9910 apexAvailable: `["myapex", "otherapex"]`,
9911 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
9912 },
9913 {
9914 desc: "stub library can be available to a core apex and a test apex",
9915 hasStubs: true,
9916 apexAvailable: `["myapex", "test_myapex"]`,
9917 },
9918 }
9919 bpTemplate := `
9920 cc_library {
9921 name: "libfoo",
9922 %v
9923 apex_available: %v,
9924 }
9925 apex {
9926 name: "myapex",
9927 key: "apex.key",
9928 updatable: false,
9929 native_shared_libs: ["libfoo"],
9930 }
9931 apex {
9932 name: "otherapex",
9933 key: "apex.key",
9934 updatable: false,
9935 }
9936 apex_test {
9937 name: "test_myapex",
9938 key: "apex.key",
9939 updatable: false,
9940 native_shared_libs: ["libfoo"],
9941 }
9942 apex_key {
9943 name: "apex.key",
9944 }
9945 `
9946 for _, tc := range testCases {
9947 stubs := ""
9948 if tc.hasStubs {
9949 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
9950 }
9951 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
9952 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
9953 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
9954 })
9955 if tc.expectedError == "" {
9956 testApex(t, bp, mockFsFixturePreparer)
9957 } else {
9958 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
9959 }
9960 }
9961}
Colin Crossbd3a16b2023-04-25 11:30:51 -07009962
9963func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
9964 context := android.GroupFixturePreparers(
9965 android.PrepareForIntegrationTestWithAndroid,
9966 cc.PrepareForIntegrationTestWithCc,
9967 PrepareForTestWithApexBuildComponents,
9968 prepareForTestWithMyapex,
9969 filesystem.PrepareForTestWithFilesystemBuildComponents,
9970 )
9971 result := context.RunTestWithBp(t, `
9972 android_system_image {
9973 name: "myfilesystem",
9974 deps: [
9975 "libfoo",
9976 ],
9977 linker_config_src: "linker.config.json",
9978 }
9979
9980 cc_library {
9981 name: "libfoo",
9982 shared_libs: [
9983 "libbar",
9984 ],
9985 stl: "none",
9986 }
9987
9988 cc_library {
9989 name: "libbar",
9990 stl: "none",
9991 apex_available: ["myapex"],
9992 }
9993
9994 apex {
9995 name: "myapex",
9996 native_shared_libs: ["libbar"],
9997 key: "myapex.key",
9998 updatable: false,
9999 }
10000
10001 apex_key {
10002 name: "myapex.key",
10003 public_key: "testkey.avbpubkey",
10004 private_key: "testkey.pem",
10005 }
10006 `)
10007
Cole Faust3b806d32024-03-11 15:15:03 -070010008 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010009 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10010 inputs.Strings(),
10011 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10012}
Yu Liueae7b362023-11-16 17:05:47 -080010013
10014var apex_default_bp = `
10015 apex_key {
10016 name: "myapex.key",
10017 public_key: "testkey.avbpubkey",
10018 private_key: "testkey.pem",
10019 }
10020
10021 filegroup {
10022 name: "myapex.manifest",
10023 srcs: ["apex_manifest.json"],
10024 }
10025
10026 filegroup {
10027 name: "myapex.androidmanifest",
10028 srcs: ["AndroidManifest.xml"],
10029 }
10030`
10031
10032func TestAconfigFilesJavaDeps(t *testing.T) {
10033 ctx := testApex(t, apex_default_bp+`
10034 apex {
10035 name: "myapex",
10036 manifest: ":myapex.manifest",
10037 androidManifest: ":myapex.androidmanifest",
10038 key: "myapex.key",
10039 java_libs: [
10040 "my_java_library_foo",
10041 "my_java_library_bar",
10042 ],
10043 updatable: false,
10044 }
10045
10046 java_library {
10047 name: "my_java_library_foo",
10048 srcs: ["foo/bar/MyClass.java"],
10049 sdk_version: "none",
10050 system_modules: "none",
10051 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010052 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010053 "myapex",
10054 ],
10055 }
10056
10057 java_library {
10058 name: "my_java_library_bar",
10059 srcs: ["foo/bar/MyClass.java"],
10060 sdk_version: "none",
10061 system_modules: "none",
10062 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010063 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010064 "myapex",
10065 ],
10066 }
10067
10068 aconfig_declarations {
10069 name: "my_aconfig_declarations_foo",
10070 package: "com.example.package",
10071 container: "myapex",
10072 srcs: ["foo.aconfig"],
10073 }
10074
10075 java_aconfig_library {
10076 name: "my_java_aconfig_library_foo",
10077 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010078 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010079 "myapex",
10080 ],
10081 }
10082
10083 aconfig_declarations {
10084 name: "my_aconfig_declarations_bar",
10085 package: "com.example.package",
10086 container: "myapex",
10087 srcs: ["bar.aconfig"],
10088 }
10089
10090 java_aconfig_library {
10091 name: "my_java_aconfig_library_bar",
10092 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010093 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010094 "myapex",
10095 ],
10096 }
10097 `)
10098
10099 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10100 s := mod.Rule("apexRule").Args["copy_commands"]
10101 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010102 if len(copyCmds) != 12 {
10103 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010104 }
10105
Jooyung Hana3fddf42024-09-03 13:22:21 +090010106 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10107 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10108 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10109 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010110
Yu Liubba555e2024-02-17 00:36:42 +000010111 inputs := []string{
10112 "my_aconfig_declarations_foo/intermediate.pb",
10113 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010114 }
Yu Liubba555e2024-02-17 00:36:42 +000010115 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10116 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10117 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10118 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010119}
10120
10121func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10122 ctx := testApex(t, apex_default_bp+`
10123 apex {
10124 name: "myapex",
10125 manifest: ":myapex.manifest",
10126 androidManifest: ":myapex.androidmanifest",
10127 key: "myapex.key",
10128 java_libs: [
10129 "my_java_library_foo",
10130 ],
10131 native_shared_libs: [
10132 "my_cc_library_bar",
10133 ],
10134 binaries: [
10135 "my_cc_binary_baz",
10136 ],
10137 updatable: false,
10138 }
10139
10140 java_library {
10141 name: "my_java_library_foo",
10142 srcs: ["foo/bar/MyClass.java"],
10143 sdk_version: "none",
10144 system_modules: "none",
10145 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010146 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010147 "myapex",
10148 ],
10149 }
10150
10151 cc_library {
10152 name: "my_cc_library_bar",
10153 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010154 static_libs: [
10155 "my_cc_aconfig_library_bar",
10156 "my_cc_aconfig_library_baz",
10157 ],
Yu Liueae7b362023-11-16 17:05:47 -080010158 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010159 "myapex",
10160 ],
10161 }
10162
10163 cc_binary {
10164 name: "my_cc_binary_baz",
10165 srcs: ["foo/bar/MyClass.cc"],
10166 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010167 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010168 "myapex",
10169 ],
10170 }
10171
10172 aconfig_declarations {
10173 name: "my_aconfig_declarations_foo",
10174 package: "com.example.package",
10175 container: "myapex",
10176 srcs: ["foo.aconfig"],
10177 }
10178
10179 java_aconfig_library {
10180 name: "my_java_aconfig_library_foo",
10181 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010182 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010183 "myapex",
10184 ],
10185 }
10186
10187 aconfig_declarations {
10188 name: "my_aconfig_declarations_bar",
10189 package: "com.example.package",
10190 container: "myapex",
10191 srcs: ["bar.aconfig"],
10192 }
10193
10194 cc_aconfig_library {
10195 name: "my_cc_aconfig_library_bar",
10196 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010197 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010198 "myapex",
10199 ],
10200 }
10201
10202 aconfig_declarations {
10203 name: "my_aconfig_declarations_baz",
10204 package: "com.example.package",
10205 container: "myapex",
10206 srcs: ["baz.aconfig"],
10207 }
10208
10209 cc_aconfig_library {
10210 name: "my_cc_aconfig_library_baz",
10211 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010212 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010213 "myapex",
10214 ],
10215 }
10216
10217 cc_library {
10218 name: "server_configurable_flags",
10219 srcs: ["server_configurable_flags.cc"],
10220 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010221 cc_library {
10222 name: "libbase",
10223 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010224 apex_available: [
10225 "myapex",
10226 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010227 }
10228 cc_library {
10229 name: "libaconfig_storage_read_api_cc",
10230 srcs: ["libaconfig_storage_read_api_cc.cc"],
10231 }
Yu Liueae7b362023-11-16 17:05:47 -080010232 `)
10233
10234 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10235 s := mod.Rule("apexRule").Args["copy_commands"]
10236 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010237 if len(copyCmds) != 16 {
10238 t.Fatalf("Expected 16 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010239 }
10240
Jooyung Hana3fddf42024-09-03 13:22:21 +090010241 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10242 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10243 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10244 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010245
Yu Liubba555e2024-02-17 00:36:42 +000010246 inputs := []string{
10247 "my_aconfig_declarations_foo/intermediate.pb",
10248 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10249 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010250 }
Yu Liubba555e2024-02-17 00:36:42 +000010251 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10252 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10253 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10254 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010255}
10256
Yu Liucec0e412023-11-30 16:45:50 -080010257func TestAconfigFilesRustDeps(t *testing.T) {
10258 ctx := testApex(t, apex_default_bp+`
10259 apex {
10260 name: "myapex",
10261 manifest: ":myapex.manifest",
10262 androidManifest: ":myapex.androidmanifest",
10263 key: "myapex.key",
10264 native_shared_libs: [
10265 "libmy_rust_library",
10266 ],
10267 binaries: [
10268 "my_rust_binary",
10269 ],
10270 rust_dyn_libs: [
10271 "libmy_rust_dylib",
10272 ],
10273 updatable: false,
10274 }
10275
10276 rust_library {
10277 name: "libflags_rust", // test mock
10278 crate_name: "flags_rust",
10279 srcs: ["lib.rs"],
10280 apex_available: [
10281 "myapex",
10282 ],
10283 }
10284
10285 rust_library {
10286 name: "liblazy_static", // test mock
10287 crate_name: "lazy_static",
10288 srcs: ["src/lib.rs"],
10289 apex_available: [
10290 "myapex",
10291 ],
10292 }
10293
Ted Bauer02d475c2024-03-27 20:56:26 +000010294 rust_library {
10295 name: "libaconfig_storage_read_api", // test mock
10296 crate_name: "aconfig_storage_read_api",
10297 srcs: ["src/lib.rs"],
10298 apex_available: [
10299 "myapex",
10300 ],
10301 }
10302
Ted Bauer6ef40db2024-03-29 14:04:10 +000010303 rust_library {
10304 name: "liblogger", // test mock
10305 crate_name: "logger",
10306 srcs: ["src/lib.rs"],
10307 apex_available: [
10308 "myapex",
10309 ],
10310 }
10311
10312 rust_library {
10313 name: "liblog_rust", // test mock
10314 crate_name: "log_rust",
10315 srcs: ["src/lib.rs"],
10316 apex_available: [
10317 "myapex",
10318 ],
10319 }
10320
Yu Liucec0e412023-11-30 16:45:50 -080010321 rust_ffi_shared {
10322 name: "libmy_rust_library",
10323 srcs: ["src/lib.rs"],
10324 rustlibs: ["libmy_rust_aconfig_library_foo"],
10325 crate_name: "my_rust_library",
10326 apex_available: [
10327 "myapex",
10328 ],
10329 }
10330
10331 rust_library_dylib {
10332 name: "libmy_rust_dylib",
10333 srcs: ["foo/bar/MyClass.rs"],
10334 rustlibs: ["libmy_rust_aconfig_library_bar"],
10335 crate_name: "my_rust_dylib",
10336 apex_available: [
10337 "myapex",
10338 ],
10339 }
10340
10341 rust_binary {
10342 name: "my_rust_binary",
10343 srcs: ["foo/bar/MyClass.rs"],
10344 rustlibs: [
10345 "libmy_rust_aconfig_library_baz",
10346 "libmy_rust_dylib",
10347 ],
10348 apex_available: [
10349 "myapex",
10350 ],
10351 }
10352
10353 aconfig_declarations {
10354 name: "my_aconfig_declarations_foo",
10355 package: "com.example.package",
10356 container: "myapex",
10357 srcs: ["foo.aconfig"],
10358 }
10359
10360 aconfig_declarations {
10361 name: "my_aconfig_declarations_bar",
10362 package: "com.example.package",
10363 container: "myapex",
10364 srcs: ["bar.aconfig"],
10365 }
10366
10367 aconfig_declarations {
10368 name: "my_aconfig_declarations_baz",
10369 package: "com.example.package",
10370 container: "myapex",
10371 srcs: ["baz.aconfig"],
10372 }
10373
10374 rust_aconfig_library {
10375 name: "libmy_rust_aconfig_library_foo",
10376 aconfig_declarations: "my_aconfig_declarations_foo",
10377 crate_name: "my_rust_aconfig_library_foo",
10378 apex_available: [
10379 "myapex",
10380 ],
10381 }
10382
10383 rust_aconfig_library {
10384 name: "libmy_rust_aconfig_library_bar",
10385 aconfig_declarations: "my_aconfig_declarations_bar",
10386 crate_name: "my_rust_aconfig_library_bar",
10387 apex_available: [
10388 "myapex",
10389 ],
10390 }
10391
10392 rust_aconfig_library {
10393 name: "libmy_rust_aconfig_library_baz",
10394 aconfig_declarations: "my_aconfig_declarations_baz",
10395 crate_name: "my_rust_aconfig_library_baz",
10396 apex_available: [
10397 "myapex",
10398 ],
10399 }
10400 `)
10401
10402 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10403 s := mod.Rule("apexRule").Args["copy_commands"]
10404 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010405 if len(copyCmds) != 36 {
10406 t.Fatalf("Expected 36 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010407 }
10408
Jooyung Hana3fddf42024-09-03 13:22:21 +090010409 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10410 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10411 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10412 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liucec0e412023-11-30 16:45:50 -080010413
Yu Liubba555e2024-02-17 00:36:42 +000010414 inputs := []string{
10415 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010416 "my_aconfig_declarations_bar/intermediate.pb",
10417 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010418 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10419 }
10420 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10421 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10422 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10423 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10424}
10425
10426func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10427 aconfigRule := mod.Description(desc)
10428 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010429 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010430 if len(aconfigArgs) != len(inputs) {
10431 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010432 }
Yu Liucec0e412023-11-30 16:45:50 -080010433
Yu Liubba555e2024-02-17 00:36:42 +000010434 ensureEquals(t, container, aconfigRule.Args["container"])
10435 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10436
10437 buildParams := aconfigRule.BuildParams
10438 for _, input := range inputs {
10439 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10440 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010441 }
Yu Liubba555e2024-02-17 00:36:42 +000010442
10443 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010444}
10445
Yu Liueae7b362023-11-16 17:05:47 -080010446func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10447 ctx := testApex(t, apex_default_bp+`
10448 apex {
10449 name: "myapex",
10450 manifest: ":myapex.manifest",
10451 androidManifest: ":myapex.androidmanifest",
10452 key: "myapex.key",
10453 java_libs: [
10454 "my_java_library_foo",
10455 "other_java_library_bar",
10456 ],
10457 updatable: false,
10458 }
10459
10460 java_library {
10461 name: "my_java_library_foo",
10462 srcs: ["foo/bar/MyClass.java"],
10463 sdk_version: "none",
10464 system_modules: "none",
10465 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010466 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010467 "myapex",
10468 ],
10469 }
10470
10471 java_library {
10472 name: "other_java_library_bar",
10473 srcs: ["foo/bar/MyClass.java"],
10474 sdk_version: "none",
10475 system_modules: "none",
10476 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010477 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010478 "myapex",
10479 ],
10480 }
10481
10482 aconfig_declarations {
10483 name: "my_aconfig_declarations_foo",
10484 package: "com.example.package",
10485 container: "myapex",
10486 srcs: ["foo.aconfig"],
10487 }
10488
10489 java_aconfig_library {
10490 name: "my_java_aconfig_library_foo",
10491 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010492 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010493 "myapex",
10494 ],
10495 }
10496
10497 aconfig_declarations {
10498 name: "other_aconfig_declarations_bar",
10499 package: "com.example.package",
10500 container: "otherapex",
10501 srcs: ["bar.aconfig"],
10502 }
10503
10504 java_aconfig_library {
10505 name: "other_java_aconfig_library_bar",
10506 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010507 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010508 "myapex",
10509 ],
10510 }
10511 `)
10512
10513 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10514 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10515 s := " " + combineAconfigRule.Args["cache_files"]
10516 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10517 if len(aconfigArgs) != 1 {
10518 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10519 }
10520 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10521
10522 buildParams := combineAconfigRule.BuildParams
10523 if len(buildParams.Inputs) != 1 {
10524 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10525 }
10526 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10527 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10528}
10529
10530func TestAconfigFilesRemoveDuplicates(t *testing.T) {
10531 ctx := testApex(t, apex_default_bp+`
10532 apex {
10533 name: "myapex",
10534 manifest: ":myapex.manifest",
10535 androidManifest: ":myapex.androidmanifest",
10536 key: "myapex.key",
10537 java_libs: [
10538 "my_java_library_foo",
10539 "my_java_library_bar",
10540 ],
10541 updatable: false,
10542 }
10543
10544 java_library {
10545 name: "my_java_library_foo",
10546 srcs: ["foo/bar/MyClass.java"],
10547 sdk_version: "none",
10548 system_modules: "none",
10549 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010550 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010551 "myapex",
10552 ],
10553 }
10554
10555 java_library {
10556 name: "my_java_library_bar",
10557 srcs: ["foo/bar/MyClass.java"],
10558 sdk_version: "none",
10559 system_modules: "none",
10560 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010561 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010562 "myapex",
10563 ],
10564 }
10565
10566 aconfig_declarations {
10567 name: "my_aconfig_declarations_foo",
10568 package: "com.example.package",
10569 container: "myapex",
10570 srcs: ["foo.aconfig"],
10571 }
10572
10573 java_aconfig_library {
10574 name: "my_java_aconfig_library_foo",
10575 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010576 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010577 "myapex",
10578 ],
10579 }
10580
10581 java_aconfig_library {
10582 name: "my_java_aconfig_library_bar",
10583 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010584 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010585 "myapex",
10586 ],
10587 }
10588 `)
10589
10590 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10591 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10592 s := " " + combineAconfigRule.Args["cache_files"]
10593 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10594 if len(aconfigArgs) != 1 {
10595 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10596 }
10597 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10598
10599 buildParams := combineAconfigRule.BuildParams
10600 if len(buildParams.Inputs) != 1 {
10601 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10602 }
10603 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10604 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10605}
Spandan Das5be63332023-12-13 00:06:32 +000010606
10607// Test that the boot jars come from the _selected_ apex prebuilt
10608// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10609func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10610 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10611 t.Helper()
10612 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10613 foundLibfooJar := false
10614 base := stem + ".jar"
10615 for _, output := range s.AllOutputs() {
10616 if filepath.Base(output) == base {
10617 foundLibfooJar = true
10618 buildRule := s.Output(output)
10619 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10620 }
10621 }
10622 if !foundLibfooJar {
10623 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10624 }
10625 }
10626
Spandan Das64c9e0c2023-12-20 20:13:34 +000010627 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10628 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10629 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10630 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10631 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10632 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)
10633 }
10634
10635 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10636 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10637 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10638 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10639 }
10640
Spandan Das5be63332023-12-13 00:06:32 +000010641 bp := `
10642 // Source APEX.
10643
10644 java_library {
10645 name: "framework-foo",
10646 srcs: ["foo.java"],
10647 installable: true,
10648 apex_available: [
10649 "com.android.foo",
10650 ],
10651 }
10652
10653 bootclasspath_fragment {
10654 name: "foo-bootclasspath-fragment",
10655 contents: ["framework-foo"],
10656 apex_available: [
10657 "com.android.foo",
10658 ],
10659 hidden_api: {
10660 split_packages: ["*"],
10661 },
10662 }
10663
10664 apex_key {
10665 name: "com.android.foo.key",
10666 public_key: "com.android.foo.avbpubkey",
10667 private_key: "com.android.foo.pem",
10668 }
10669
10670 apex {
10671 name: "com.android.foo",
10672 key: "com.android.foo.key",
10673 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10674 updatable: false,
10675 }
10676
10677 // Prebuilt APEX.
10678
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010679 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010680 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010681 public: {
10682 jars: ["foo.jar"],
10683 },
Spandan Das5be63332023-12-13 00:06:32 +000010684 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010685 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010686 }
10687
10688 prebuilt_bootclasspath_fragment {
10689 name: "foo-bootclasspath-fragment",
10690 contents: ["framework-foo"],
10691 hidden_api: {
10692 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10693 metadata: "my-bootclasspath-fragment/metadata.csv",
10694 index: "my-bootclasspath-fragment/index.csv",
10695 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10696 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10697 },
10698 apex_available: [
10699 "com.android.foo",
10700 ],
10701 }
10702
10703 prebuilt_apex {
10704 name: "com.android.foo",
10705 apex_name: "com.android.foo",
10706 src: "com.android.foo-arm.apex",
10707 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10708 }
10709
10710 // Another Prebuilt ART APEX
10711 prebuilt_apex {
10712 name: "com.android.foo.v2",
10713 apex_name: "com.android.foo", // Used to determine the API domain
10714 src: "com.android.foo-arm.apex",
10715 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10716 }
10717
10718 // APEX contribution modules
10719
10720 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010721 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010722 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010723 contents: ["com.android.foo"],
10724 }
10725
10726 apex_contributions {
10727 name: "foo.prebuilt.contributions",
10728 api_domain: "com.android.foo",
10729 contents: ["prebuilt_com.android.foo"],
10730 }
10731
10732 apex_contributions {
10733 name: "foo.prebuilt.v2.contributions",
10734 api_domain: "com.android.foo",
10735 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010736 }
10737 `
10738
10739 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010740 desc string
10741 selectedApexContributions string
10742 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010743 }{
10744 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010745 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10746 selectedApexContributions: "foo.source.contributions",
10747 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010748 },
10749 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010750 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10751 selectedApexContributions: "foo.prebuilt.contributions",
10752 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010753 },
10754 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010755 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10756 selectedApexContributions: "foo.prebuilt.v2.contributions",
10757 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010758 },
10759 }
10760
10761 fragment := java.ApexVariantReference{
10762 Apex: proptools.StringPtr("com.android.foo"),
10763 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10764 }
10765
10766 for _, tc := range testCases {
10767 preparer := android.GroupFixturePreparers(
10768 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10769 android.FixtureMergeMockFs(map[string][]byte{
10770 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10771 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010772 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10773 // file creation.
10774 java.FixtureConfigureBootJars("platform:foo"),
10775 android.FixtureModifyMockFS(func(fs android.MockFS) {
10776 fs["platform/Android.bp"] = []byte(`
10777 java_library {
10778 name: "foo",
10779 srcs: ["Test.java"],
10780 compile_dex: true,
10781 }
10782 `)
10783 fs["platform/Test.java"] = nil
10784 }),
10785
Colin Crossa66b4632024-08-08 15:50:47 -070010786 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010787 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010788 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010789 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010790 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10791 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010792 }
10793}
Spandan Das3576e762024-01-03 18:57:03 +000010794
10795// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10796// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10797func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000010798 // for a mainline module family, check that only the flagged soong module is visible to make
10799 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
10800 variation := func(moduleName string) string {
10801 ret := "android_common_com.android.foo"
10802 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000010803 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000010804 }
10805 return ret
10806 }
10807
10808 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10809 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10810
10811 for _, hiddenModuleName := range hiddenModuleNames {
10812 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10813 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10814
10815 }
10816 }
10817
10818 bp := `
10819 apex_key {
10820 name: "com.android.foo.key",
10821 public_key: "com.android.foo.avbpubkey",
10822 private_key: "com.android.foo.pem",
10823 }
10824
10825 // AOSP source apex
10826 apex {
10827 name: "com.android.foo",
10828 key: "com.android.foo.key",
10829 updatable: false,
10830 }
10831
10832 // Google source apex
10833 override_apex {
10834 name: "com.google.android.foo",
10835 base: "com.android.foo",
10836 key: "com.android.foo.key",
10837 }
10838
10839 // Prebuilt Google APEX.
10840
10841 prebuilt_apex {
10842 name: "com.google.android.foo",
10843 apex_name: "com.android.foo",
10844 src: "com.android.foo-arm.apex",
10845 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10846 }
10847
10848 // Another Prebuilt Google APEX
10849 prebuilt_apex {
10850 name: "com.google.android.foo.v2",
10851 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000010852 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000010853 src: "com.android.foo-arm.apex",
10854 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10855 }
10856
10857 // APEX contribution modules
10858
10859 apex_contributions {
10860 name: "foo.source.contributions",
10861 api_domain: "com.android.foo",
10862 contents: ["com.google.android.foo"],
10863 }
10864
10865 apex_contributions {
10866 name: "foo.prebuilt.contributions",
10867 api_domain: "com.android.foo",
10868 contents: ["prebuilt_com.google.android.foo"],
10869 }
10870
10871 apex_contributions {
10872 name: "foo.prebuilt.v2.contributions",
10873 api_domain: "com.android.foo",
10874 contents: ["prebuilt_com.google.android.foo.v2"],
10875 }
10876
10877 // This is an incompatible module because it selects multiple versions of the same mainline module
10878 apex_contributions {
10879 name: "foo.prebuilt.duplicate.contributions",
10880 api_domain: "com.android.foo",
10881 contents: [
10882 "prebuilt_com.google.android.foo",
10883 "prebuilt_com.google.android.foo.v2",
10884 ],
10885 }
10886 `
10887
10888 testCases := []struct {
10889 desc string
10890 selectedApexContributions string
10891 expectedVisibleModuleName string
10892 expectedHiddenModuleNames []string
10893 expectedError string
10894 }{
10895 {
10896 desc: "Source apex is selected, prebuilts should be hidden from make",
10897 selectedApexContributions: "foo.source.contributions",
10898 expectedVisibleModuleName: "com.google.android.foo",
10899 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
10900 },
10901 {
10902 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
10903 selectedApexContributions: "foo.prebuilt.contributions",
10904 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
10905 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
10906 },
10907 {
10908 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
10909 selectedApexContributions: "foo.prebuilt.v2.contributions",
10910 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
10911 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
10912 },
10913 {
10914 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
10915 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
10916 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
10917 },
10918 }
10919
10920 for _, tc := range testCases {
10921 preparer := android.GroupFixturePreparers(
10922 android.FixtureMergeMockFs(map[string][]byte{
10923 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10924 }),
Colin Crossa66b4632024-08-08 15:50:47 -070010925 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000010926 )
10927 if tc.expectedError != "" {
10928 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
10929 testApex(t, bp, preparer)
10930 return
10931 }
10932 ctx := testApex(t, bp, preparer)
10933
Spandan Das3576e762024-01-03 18:57:03 +000010934 // Check that
10935 // 1. The contents of the selected apex_contributions are visible to make
10936 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
10937 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
10938 }
10939}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000010940
Spandan Das85bd4622024-08-01 00:51:20 +000010941// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
10942func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
10943 // for a mainline module family, check that only the flagged soong module is visible to make
10944 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
10945 variation := func(moduleName string) string {
10946 ret := "android_common_com.android.adservices"
10947 if moduleName == "com.google.android.foo" {
10948 ret = "android_common_com.google.android.foo_com.google.android.foo"
10949 }
10950 return ret
10951 }
10952
10953 for _, visibleModuleName := range visibleModuleNames {
10954 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10955 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10956 }
10957
10958 for _, hiddenModuleName := range hiddenModuleNames {
10959 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10960 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10961
10962 }
10963 }
10964
10965 bp := `
10966 apex_key {
10967 name: "com.android.adservices.key",
10968 public_key: "com.android.adservices.avbpubkey",
10969 private_key: "com.android.adservices.pem",
10970 }
10971
10972 // AOSP source apex
10973 apex {
10974 name: "com.android.adservices",
10975 key: "com.android.adservices.key",
10976 updatable: false,
10977 }
10978
10979 // Prebuilt Google APEX.
10980
10981 prebuilt_apex {
10982 name: "com.google.android.adservices",
10983 apex_name: "com.android.adservices",
10984 src: "com.android.foo-arm.apex",
10985 }
10986
10987 // Another Prebuilt Google APEX
10988 prebuilt_apex {
10989 name: "com.google.android.adservices.v2",
10990 apex_name: "com.android.adservices",
10991 src: "com.android.foo-arm.apex",
10992 }
10993
10994 // APEX contribution modules
10995
10996
10997 apex_contributions {
10998 name: "adservices.prebuilt.contributions",
10999 api_domain: "com.android.adservices",
11000 contents: ["prebuilt_com.google.android.adservices"],
11001 }
11002
11003 apex_contributions {
11004 name: "adservices.prebuilt.v2.contributions",
11005 api_domain: "com.android.adservices",
11006 contents: ["prebuilt_com.google.android.adservices.v2"],
11007 }
11008 `
11009
11010 testCases := []struct {
11011 desc string
11012 selectedApexContributions string
11013 expectedVisibleModuleNames []string
11014 expectedHiddenModuleNames []string
11015 }{
11016 {
11017 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11018 selectedApexContributions: "",
11019 expectedVisibleModuleNames: []string{"com.android.adservices"},
11020 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11021 },
11022 {
11023 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11024 selectedApexContributions: "adservices.prebuilt.contributions",
11025 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11026 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11027 },
11028 {
11029 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11030 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11031 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11032 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11033 },
11034 }
11035
11036 for _, tc := range testCases {
11037 preparer := android.GroupFixturePreparers(
11038 android.FixtureMergeMockFs(map[string][]byte{
11039 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11040 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011041 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011042 )
11043 ctx := testApex(t, bp, preparer)
11044
11045 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11046 }
11047}
11048
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011049func TestAconfifDeclarationsValidation(t *testing.T) {
11050 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11051 for _, moduleName := range moduleNames {
11052 ret += fmt.Sprintf(`
11053 aconfig_declarations {
11054 name: "%[1]s",
11055 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011056 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011057 srcs: [
11058 "%[1]s.aconfig",
11059 ],
11060 }
11061 java_aconfig_library {
11062 name: "%[1]s-lib",
11063 aconfig_declarations: "%[1]s",
11064 }
11065 `, moduleName)
11066 }
11067 return ret
11068 }
11069
11070 result := android.GroupFixturePreparers(
11071 prepareForApexTest,
11072 java.PrepareForTestWithJavaSdkLibraryFiles,
11073 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011074 ).RunTestWithBp(t, `
11075 java_library {
11076 name: "baz-java-lib",
11077 static_libs: [
11078 "baz-lib",
11079 ],
11080 }
11081 filegroup {
11082 name: "qux-filegroup",
11083 srcs: [
11084 ":qux-lib{.generated_srcjars}",
11085 ],
11086 }
11087 filegroup {
11088 name: "qux-another-filegroup",
11089 srcs: [
11090 ":qux-filegroup",
11091 ],
11092 }
11093 java_library {
11094 name: "quux-java-lib",
11095 srcs: [
11096 "a.java",
11097 ],
11098 libs: [
11099 "quux-lib",
11100 ],
11101 }
11102 java_sdk_library {
11103 name: "foo",
11104 srcs: [
11105 ":qux-another-filegroup",
11106 ],
11107 api_packages: ["foo"],
11108 system: {
11109 enabled: true,
11110 },
11111 module_lib: {
11112 enabled: true,
11113 },
11114 test: {
11115 enabled: true,
11116 },
11117 static_libs: [
11118 "bar-lib",
11119 ],
11120 libs: [
11121 "baz-java-lib",
11122 "quux-java-lib",
11123 ],
11124 aconfig_declarations: [
11125 "bar",
11126 ],
11127 }
11128 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11129
11130 m := result.ModuleForTests("foo.stubs.source", "android_common")
11131 outDir := "out/soong/.intermediates"
11132
11133 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11134 // textproto files
11135 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11136
11137 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11138 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11139 // to aconfig.
11140 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11141 "passed as an input",
11142 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11143
11144 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11145 // to metalava as classpath. Thus the cache file provided by the associated
11146 // aconfig_declarations module "baz" should be passed to aconfig.
11147 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11148 "java_aconfig_library passed as an input",
11149 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11150
11151 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11152 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11153 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11154 "input",
11155 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11156
11157 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11158 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11159 // aconfig_declarations module "quux" should not be passed to aconfig.
11160 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11161 "depend on java_aconfig_library not passed as an input",
11162 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11163}
Cole Faust7c991b42024-05-15 11:17:55 -070011164
11165func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11166 ctx := testApex(t, `
11167 apex {
11168 name: "myapex",
11169 key: "myapex.key",
11170 prebuilts: ["myetc", "myetc2"],
11171 min_sdk_version: "29",
11172 }
11173 apex_key {
11174 name: "myapex.key",
11175 public_key: "testkey.avbpubkey",
11176 private_key: "testkey.pem",
11177 }
11178
11179 prebuilt_etc {
11180 name: "myetc",
11181 src: "myprebuilt",
11182 filename: "myfilename",
11183 }
11184 prebuilt_etc {
11185 name: "myetc2",
11186 sub_dir: "mysubdir",
11187 src: "myprebuilt",
11188 filename: "myfilename",
11189 }
11190 `, withFiles(android.MockFS{
11191 "packages/modules/common/build/allowed_deps.txt": nil,
11192 }))
11193
11194 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11195 data := android.AndroidMkDataForTest(t, ctx, ab)
11196 var builder strings.Builder
11197 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11198 androidMk := builder.String()
11199
11200 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11201 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11202}
Spandan Das50801e22024-05-13 18:29:45 +000011203
11204func TestApexMinSdkVersionOverride(t *testing.T) {
11205 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11206 args := module.Rule("apexRule").Args
11207 optFlags := args["opt_flags"]
11208 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11209 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11210 }
11211 }
11212
11213 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11214 t.Helper()
11215 found := false
11216 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11217 if dep == wantDep {
11218 found = true
11219 }
11220 })
11221 if !found {
11222 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11223 }
11224 }
11225
11226 ctx := testApex(t, `
11227 apex {
11228 name: "com.android.apex30",
11229 min_sdk_version: "30",
11230 key: "apex30.key",
11231 java_libs: ["javalib"],
11232 }
11233
11234 java_library {
11235 name: "javalib",
11236 srcs: ["A.java"],
11237 apex_available: ["com.android.apex30"],
11238 min_sdk_version: "30",
11239 sdk_version: "current",
11240 }
11241
11242 override_apex {
11243 name: "com.mycompany.android.apex30",
11244 base: "com.android.apex30",
11245 }
11246
11247 override_apex {
11248 name: "com.mycompany.android.apex31",
11249 base: "com.android.apex30",
11250 min_sdk_version: "31",
11251 }
11252
11253 apex_key {
11254 name: "apex30.key",
11255 public_key: "testkey.avbpubkey",
11256 private_key: "testkey.pem",
11257 }
11258
11259 `, android.FixtureMergeMockFs(android.MockFS{
11260 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11261 }),
11262 )
11263
11264 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11265 checkMinSdkVersion(t, baseModule, "30")
11266
11267 // Override module, but uses same min_sdk_version
11268 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11269 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11270 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11271 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11272
11273 // Override module, uses different min_sdk_version
11274 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11275 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11276 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11277 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11278}
Spandan Das0b28fa02024-05-28 23:40:17 +000011279
11280func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11281 context := android.GroupFixturePreparers(
11282 android.PrepareForIntegrationTestWithAndroid,
11283 PrepareForTestWithApexBuildComponents,
11284 android.FixtureMergeMockFs(android.MockFS{
11285 "system/sepolicy/apex/foo-file_contexts": nil,
11286 }),
11287 )
11288 res := context.RunTestWithBp(t, `
11289 apex {
11290 name: "foo",
11291 key: "myapex.key",
11292 apex_available_name: "com.android.foo",
11293 variant_version: "0",
11294 updatable: false,
11295 }
11296 apex_key {
11297 name: "myapex.key",
11298 public_key: "testkey.avbpubkey",
11299 private_key: "testkey.pem",
11300 }
11301 prebuilt_apex {
11302 name: "foo",
11303 src: "foo.apex",
11304 prefer: true,
11305 }
11306 override_apex {
11307 name: "myoverrideapex",
11308 base: "foo",
11309 }
11310 `)
11311
11312 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11313}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011314
11315func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11316 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`, `
11317 apex {
11318 name: "myapex",
11319 key: "myapex.key",
11320 updatable: true,
11321 min_sdk_version: "current",
11322 }
11323
11324 apex_key {
11325 name: "myapex.key",
11326 public_key: "testkey.avbpubkey",
11327 private_key: "testkey.pem",
11328 }
11329 `)
11330}
Spandan Das2f68f192024-07-22 19:25:50 +000011331
11332func TestPrebuiltStubNoinstall(t *testing.T) {
11333 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11334 result := android.GroupFixturePreparers(
11335 prepareForApexTest,
11336 android.PrepareForTestWithAndroidMk,
11337 android.PrepareForTestWithMakevars,
11338 android.FixtureMergeMockFs(fs),
11339 ).RunTest(t)
11340
11341 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011342 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011343
11344 installRules := result.InstallMakeRulesForTesting(t)
11345
11346 var installedlibRule *android.InstallMakeRule
11347 for i, rule := range installRules {
11348 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11349 if installedlibRule != nil {
11350 t.Errorf("Duplicate install rules for %s", rule.Target)
11351 }
11352 installedlibRule = &installRules[i]
11353 }
11354 }
11355 if installedlibRule == nil {
11356 t.Errorf("No install rule found for installedlib")
11357 return
11358 }
11359
11360 if expectLibfooOnSystemLib {
11361 android.AssertStringListContains(t,
11362 "installedlib doesn't have install dependency on libfoo impl",
11363 installedlibRule.OrderOnlyDeps,
11364 "out/target/product/test_device/system/lib/libfoo.so")
11365 } else {
11366 android.AssertStringListDoesNotContain(t,
11367 "installedlib has install dependency on libfoo stub",
11368 installedlibRule.Deps,
11369 "out/target/product/test_device/system/lib/libfoo.so")
11370 android.AssertStringListDoesNotContain(t,
11371 "installedlib has order-only install dependency on libfoo stub",
11372 installedlibRule.OrderOnlyDeps,
11373 "out/target/product/test_device/system/lib/libfoo.so")
11374 }
11375 }
11376
11377 prebuiltLibfooBp := []byte(`
11378 cc_prebuilt_library {
11379 name: "libfoo",
11380 prefer: true,
11381 srcs: ["libfoo.so"],
11382 stubs: {
11383 versions: ["1"],
11384 },
11385 apex_available: ["apexfoo"],
11386 }
11387 `)
11388
11389 apexfooBp := []byte(`
11390 apex {
11391 name: "apexfoo",
11392 key: "apexfoo.key",
11393 native_shared_libs: ["libfoo"],
11394 updatable: false,
11395 compile_multilib: "both",
11396 }
11397 apex_key {
11398 name: "apexfoo.key",
11399 public_key: "testkey.avbpubkey",
11400 private_key: "testkey.pem",
11401 }
11402 `)
11403
11404 installedlibBp := []byte(`
11405 cc_library {
11406 name: "installedlib",
11407 shared_libs: ["libfoo"],
11408 }
11409 `)
11410
11411 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11412 testFunc(
11413 t,
11414 /*expectLibfooOnSystemLib=*/ false,
11415 android.MockFS{
11416 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11417 "apexfoo/Android.bp": apexfooBp,
11418 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11419 "Android.bp": installedlibBp,
11420 },
11421 )
11422 })
11423
11424 disabledSourceLibfooBp := []byte(`
11425 cc_library {
11426 name: "libfoo",
11427 enabled: false,
11428 stubs: {
11429 versions: ["1"],
11430 },
11431 apex_available: ["apexfoo"],
11432 }
11433 `)
11434
11435 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11436 testFunc(
11437 t,
11438 /*expectLibfooOnSystemLib=*/ false,
11439 android.MockFS{
11440 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11441 "impl/Android.bp": disabledSourceLibfooBp,
11442 "apexfoo/Android.bp": apexfooBp,
11443 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11444 "Android.bp": installedlibBp,
11445 },
11446 )
11447 })
11448}
Jihoon Kange246bb72024-09-18 22:26:22 +000011449
11450func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11451 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11452 // in libs of android_app and java_library does not lead to class loader context device/host
11453 // path mismatch errors.
11454 android.GroupFixturePreparers(
11455 prepareForApexTest,
11456 android.PrepareForIntegrationTestWithAndroid,
11457 PrepareForTestWithApexBuildComponents,
11458 android.FixtureModifyEnv(func(env map[string]string) {
11459 env["DISABLE_CONTAINER_CHECK"] = "true"
11460 }),
11461 withFiles(filesForSdkLibrary),
11462 android.FixtureMergeMockFs(android.MockFS{
11463 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11464 }),
11465 ).RunTestWithBp(t, `
11466 apex {
11467 name: "com.android.foo30",
11468 key: "myapex.key",
11469 updatable: true,
11470 bootclasspath_fragments: [
11471 "foo-bootclasspath-fragment",
11472 ],
11473 java_libs: [
11474 "bar",
11475 ],
11476 apps: [
11477 "bar-app",
11478 ],
11479 min_sdk_version: "30",
11480 }
11481 apex_key {
11482 name: "myapex.key",
11483 public_key: "testkey.avbpubkey",
11484 private_key: "testkey.pem",
11485 }
11486 bootclasspath_fragment {
11487 name: "foo-bootclasspath-fragment",
11488 contents: [
11489 "framework-foo",
11490 ],
11491 apex_available: [
11492 "com.android.foo30",
11493 ],
11494 hidden_api: {
11495 split_packages: ["*"]
11496 },
11497 }
11498
11499 java_sdk_library {
11500 name: "framework-foo",
11501 srcs: [
11502 "A.java"
11503 ],
11504 unsafe_ignore_missing_latest_api: true,
11505 apex_available: [
11506 "com.android.foo30",
11507 ],
11508 compile_dex: true,
11509 sdk_version: "core_current",
11510 shared_library: false,
11511 }
11512
11513 java_library {
11514 name: "bar",
11515 srcs: [
11516 "A.java"
11517 ],
11518 libs: [
11519 "framework-foo.impl",
11520 ],
11521 apex_available: [
11522 "com.android.foo30",
11523 ],
11524 sdk_version: "core_current",
11525 }
11526
11527 java_library {
11528 name: "baz",
11529 srcs: [
11530 "A.java"
11531 ],
11532 libs: [
11533 "bar",
11534 ],
11535 sdk_version: "core_current",
11536 }
11537
11538 android_app {
11539 name: "bar-app",
11540 srcs: [
11541 "A.java"
11542 ],
11543 libs: [
11544 "baz",
11545 "framework-foo.impl",
11546 ],
11547 apex_available: [
11548 "com.android.foo30",
11549 ],
11550 sdk_version: "core_current",
11551 min_sdk_version: "30",
11552 manifest: "AndroidManifest.xml",
11553 }
11554 `)
11555}