blob: 8c17afe9f9c1c5ce7300aeec142ce05963f53058 [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"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Jooyung Han35155c42020-02-06 17:33:20 +090087// withNativeBridgeTargets sets configuration with targets including:
88// - X86_64 (primary)
89// - X86 (secondary)
90// - Arm64 on X86_64 (native bridge)
91// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000092var withNativeBridgeEnabled = android.FixtureModifyConfig(
93 func(config android.Config) {
94 config.Targets[android.Android] = []android.Target{
95 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
96 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
97 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
98 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
99 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
103 }
104 },
105)
106
107func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
108 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
109 variables.ManifestPackageNameOverrides = specs
110 })
Jooyung Han35155c42020-02-06 17:33:20 +0900111}
112
Albert Martineefabcf2022-03-21 20:11:16 +0000113func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
116 })
117}
118
Paul Duffin810f33d2021-03-09 14:12:32 +0000119var withBinder32bit = android.FixtureModifyProductVariables(
120 func(variables android.FixtureProductVariables) {
121 variables.Binder32bit = proptools.BoolPtr(true)
122 },
123)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withUnbundledBuild = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Unbundled_build = proptools.BoolPtr(true)
128 },
129)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900130
Paul Duffin284165a2021-03-29 01:50:31 +0100131// Legacy preparer used for running tests within the apex package.
132//
133// This includes everything that was needed to run any test in the apex package prior to the
134// introduction of the test fixtures. Tests that are being converted to use fixtures directly
135// rather than through the testApex...() methods should avoid using this and instead use the
136// various preparers directly, using android.GroupFixturePreparers(...) to group them when
137// necessary.
138//
139// deprecated
140var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000141 // General preparers in alphabetical order as test infrastructure will enforce correct
142 // registration order.
143 android.PrepareForTestWithAndroidBuildComponents,
144 bpf.PrepareForTestWithBpf,
145 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100146 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000147 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
148 rust.PrepareForTestWithRustDefaultModules,
149 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800150 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000151
152 PrepareForTestWithApexBuildComponents,
153
154 // Additional apex test specific preparers.
155 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
156 filegroup {
157 name: "myapex-file_contexts",
158 srcs: [
159 "apex/myapex-file_contexts",
160 ],
161 }
162 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000163 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000164 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 "a.java": nil,
166 "PrebuiltAppFoo.apk": nil,
167 "PrebuiltAppFooPriv.apk": nil,
168 "apex_manifest.json": nil,
169 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
171 "system/sepolicy/apex/myapex2-file_contexts": nil,
172 "system/sepolicy/apex/otherapex-file_contexts": nil,
173 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
174 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700175 "mylib.cpp": nil,
176 "mytest.cpp": nil,
177 "mytest1.cpp": nil,
178 "mytest2.cpp": nil,
179 "mytest3.cpp": nil,
180 "myprebuilt": nil,
181 "my_include": nil,
182 "foo/bar/MyClass.java": nil,
183 "prebuilt.jar": nil,
184 "prebuilt.so": nil,
185 "vendor/foo/devkeys/test.x509.pem": nil,
186 "vendor/foo/devkeys/test.pk8": nil,
187 "testkey.x509.pem": nil,
188 "testkey.pk8": nil,
189 "testkey.override.x509.pem": nil,
190 "testkey.override.pk8": nil,
191 "vendor/foo/devkeys/testkey.avbpubkey": nil,
192 "vendor/foo/devkeys/testkey.pem": nil,
193 "NOTICE": nil,
194 "custom_notice": nil,
195 "custom_notice_for_static_lib": nil,
196 "testkey2.avbpubkey": nil,
197 "testkey2.pem": nil,
198 "myapex-arm64.apex": nil,
199 "myapex-arm.apex": nil,
200 "myapex.apks": nil,
201 "frameworks/base/api/current.txt": nil,
202 "framework/aidl/a.aidl": nil,
203 "dummy.txt": nil,
204 "baz": nil,
205 "bar/baz": nil,
206 "testdata/baz": nil,
207 "AppSet.apks": nil,
208 "foo.rs": nil,
209 "libfoo.jar": nil,
210 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000211 },
212 ),
213
214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000215 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
216 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
217 variables.Platform_sdk_codename = proptools.StringPtr("Q")
218 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000219 // "Tiramisu" needs to be in the next line for compatibility with soong code,
220 // not because of these tests specifically (it's not used by the tests)
221 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000222 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000223 }),
224)
225
Paul Duffin52bfaa42021-03-23 23:40:12 +0000226var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
227 "system/sepolicy/apex/myapex-file_contexts": nil,
228})
229
Colin Crossb614cd42024-10-11 12:52:21 -0700230var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/otherapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900268 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jooyung Hana3fddf42024-09-03 13:22:21 +0900279func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
280 t.Helper()
281 p := regexp.MustCompile(expectedRex)
282 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
283 t.Errorf("%q is not found in %v", expectedRex, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !android.InList(expected, result) {
290 t.Errorf("%q is not found in %v", expected, result)
291 }
292}
293
294func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900295 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 if android.InList(notExpected, result) {
297 t.Errorf("%q is found in %v", notExpected, result)
298 }
299}
300
Jooyung Hane1633032019-08-01 17:41:43 +0900301func ensureListEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) > 0 {
304 t.Errorf("%q is expected to be empty", result)
305 }
306}
307
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000308func ensureListNotEmpty(t *testing.T, result []string) {
309 t.Helper()
310 if len(result) == 0 {
311 t.Errorf("%q is expected to be not empty", result)
312 }
313}
314
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315// Minimal test
316func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700317 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800318 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900319 apex_defaults {
320 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900321 manifest: ":myapex.manifest",
322 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900325 native_shared_libs: [
326 "mylib",
327 "libfoo.ffi",
328 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900329 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800330 multilib: {
331 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900332 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800333 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900334 },
Jiyong Park77acec62020-06-01 21:39:15 +0900335 java_libs: [
336 "myjar",
337 "myjar_dex",
338 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000339 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 }
341
Jiyong Park30ca9372019-02-07 16:27:23 +0900342 apex {
343 name: "myapex",
344 defaults: ["myapex-defaults"],
345 }
346
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347 apex_key {
348 name: "myapex.key",
349 public_key: "testkey.avbpubkey",
350 private_key: "testkey.pem",
351 }
352
Jiyong Park809bb722019-02-13 21:33:49 +0900353 filegroup {
354 name: "myapex.manifest",
355 srcs: ["apex_manifest.json"],
356 }
357
358 filegroup {
359 name: "myapex.androidmanifest",
360 srcs: ["AndroidManifest.xml"],
361 }
362
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 cc_library {
364 name: "mylib",
365 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900366 shared_libs: [
367 "mylib2",
368 "libbar.ffi",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 system_shared_libs: [],
371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000372 // TODO: remove //apex_available:platform
373 apex_available: [
374 "//apex_available:platform",
375 "myapex",
376 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900377 }
378
Alex Light3d673592019-01-18 14:37:31 -0800379 cc_binary {
380 name: "foo",
381 srcs: ["mylib.cpp"],
382 compile_multilib: "both",
383 multilib: {
384 lib32: {
385 suffix: "32",
386 },
387 lib64: {
388 suffix: "64",
389 },
390 },
391 symlinks: ["foo_link_"],
392 symlink_preferred_arch: true,
393 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800394 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900395 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700396 }
397
Jiyong Park99644e92020-11-17 22:21:02 +0900398 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700402 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900403 apex_available: ["myapex"],
404 }
405
406 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000407 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900408 srcs: ["foo.rs"],
409 crate_name: "foo",
410 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900411 shared_libs: ["libfoo.shared_from_rust"],
412 }
413
414 cc_library_shared {
415 name: "libfoo.shared_from_rust",
416 srcs: ["mylib.cpp"],
417 system_shared_libs: [],
418 stl: "none",
419 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900420 }
421
422 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000423 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
Colin Cross49f1a8f2024-10-23 13:04:15 -0700429 rust_library_dylib {
430 name: "libfoo.transitive.dylib.rust",
431 srcs: ["foo.rs"],
432 crate_name: "foo",
433 apex_available: ["myapex"],
434 }
435
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900436 rust_ffi_shared {
437 name: "libfoo.ffi",
438 srcs: ["foo.rs"],
439 crate_name: "foo",
440 apex_available: ["myapex"],
441 }
442
443 rust_ffi_shared {
444 name: "libbar.ffi",
445 srcs: ["foo.rs"],
446 crate_name: "bar",
447 apex_available: ["myapex"],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900451 name: "mylib2",
452 srcs: ["mylib.cpp"],
453 system_shared_libs: [],
454 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900455 static_libs: ["libstatic"],
456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
461 }
462
Paul Duffindddd5462020-04-07 15:25:44 +0100463 cc_prebuilt_library_shared {
464 name: "mylib2",
465 srcs: ["prebuilt.so"],
466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700471 }
Paul Duffindddd5462020-04-07 15:25:44 +0100472
Jiyong Park9918e1a2020-03-17 19:16:40 +0900473 cc_library_static {
474 name: "libstatic",
475 srcs: ["mylib.cpp"],
476 system_shared_libs: [],
477 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484
485 java_library {
486 name: "myjar",
487 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900488 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900492 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
499
Jiyong Park77acec62020-06-01 21:39:15 +0900500 dex_import {
501 name: "myjar_dex",
502 jars: ["prebuilt.jar"],
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
507 }
508
Jiyong Park7f7766d2019-07-25 22:02:35 +0900509 java_library {
510 name: "myotherjar",
511 srcs: ["foo/bar/MyClass.java"],
512 sdk_version: "none",
513 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900514 // TODO: remove //apex_available:platform
515 apex_available: [
516 "//apex_available:platform",
517 "myapex",
518 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900519 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900520
521 java_library {
522 name: "mysharedjar",
523 srcs: ["foo/bar/MyClass.java"],
524 sdk_version: "none",
525 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900526 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 `)
528
Jooyung Hana0503a52023-08-23 13:12:50 +0900529 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900530
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900532 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700533 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 var builder strings.Builder
535 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
536
537 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000538 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900539 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
540
Jiyong Park42cca6c2019-04-01 11:15:50 +0900541 optFlags := apexRule.Args["opt_flags"]
542 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700543 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900544 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900545
Jiyong Park25fc6a92018-11-18 18:02:45 +0900546 copyCmds := apexRule.Args["copy_commands"]
547
548 // Ensure that main rule creates an output
549 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
550
551 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700559 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
560 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900561 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
562 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700563 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900566
567 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800568 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
569 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900570 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900571 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900572 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700573 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
575 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900576 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 // .. but not for java libs
578 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800580
Colin Cross7113d202019-11-20 16:39:12 -0800581 // Ensure that the platform variant ends with _shared or _common
582 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
583 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900584 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
585 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900586 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
587
588 // Ensure that dynamic dependency to java libs are not included
589 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800590
591 // Ensure that all symlinks are present.
592 found_foo_link_64 := false
593 found_foo := false
594 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900595 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800596 if strings.HasSuffix(cmd, "bin/foo") {
597 found_foo = true
598 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
599 found_foo_link_64 = true
600 }
601 }
602 }
603 good := found_foo && found_foo_link_64
604 if !good {
605 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
606 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
612 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
613 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100614
Colin Crossf61d03d2023-11-02 16:56:39 -0700615 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
616 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100617 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100618 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
619 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
620 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800621}
622
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700624 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800625 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 apex_defaults {
627 name: "myapex-defaults",
628 key: "myapex.key",
629 prebuilts: ["myetc"],
630 native_shared_libs: ["mylib"],
631 java_libs: ["myjar"],
632 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900633 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800634 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000635 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900636 }
637
638 prebuilt_etc {
639 name: "myetc",
640 src: "myprebuilt",
641 }
642
643 apex {
644 name: "myapex",
645 defaults: ["myapex-defaults"],
646 }
647
648 apex_key {
649 name: "myapex.key",
650 public_key: "testkey.avbpubkey",
651 private_key: "testkey.pem",
652 }
653
654 cc_library {
655 name: "mylib",
656 system_shared_libs: [],
657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 java_library {
662 name: "myjar",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
668
669 android_app {
670 name: "AppFoo",
671 srcs: ["foo/bar/MyClass.java"],
672 sdk_version: "none",
673 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000674 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900676
677 runtime_resource_overlay {
678 name: "rro",
679 theme: "blue",
680 }
681
markchien2f59ec92020-09-02 16:23:38 +0800682 bpf {
683 name: "bpf",
684 srcs: ["bpf.c", "bpf2.c"],
685 }
686
Ken Chenfad7f9d2021-11-10 22:02:57 +0800687 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800688 name: "netdTest",
689 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800690 sub_dir: "netd",
691 }
692
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900694 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 "etc/myetc",
696 "javalib/myjar.jar",
697 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000698 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900699 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800700 "etc/bpf/bpf.o",
701 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800702 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900703 })
704}
705
Jooyung Han01a3ee22019-11-02 02:52:25 +0900706func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700707 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800708 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709 apex {
710 name: "myapex",
711 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000712 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713 }
714
715 apex_key {
716 name: "myapex.key",
717 public_key: "testkey.avbpubkey",
718 private_key: "testkey.pem",
719 }
720 `)
721
Jooyung Hana0503a52023-08-23 13:12:50 +0900722 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900723 args := module.Rule("apexRule").Args
724 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
725 t.Error("manifest should be apex_manifest.pb, but " + manifest)
726 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900727}
728
Liz Kammer4854a7d2021-05-27 14:28:27 -0400729func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700730 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400731 ctx := testApex(t, `
732 apex_defaults {
733 name: "my_defaults",
734 key: "myapex.key",
735 product_specific: true,
736 file_contexts: ":my-file-contexts",
737 updatable: false,
738 }
739 apex {
740 name: "myapex_30",
741 min_sdk_version: "30",
742 defaults: ["my_defaults"],
743 }
744
745 apex {
746 name: "myapex_current",
747 min_sdk_version: "current",
748 defaults: ["my_defaults"],
749 }
750
751 apex {
752 name: "myapex_none",
753 defaults: ["my_defaults"],
754 }
755
756 apex_key {
757 name: "myapex.key",
758 public_key: "testkey.avbpubkey",
759 private_key: "testkey.pem",
760 }
761
762 filegroup {
763 name: "my-file-contexts",
764 srcs: ["product_specific_file_contexts"],
765 }
766 `, withFiles(map[string][]byte{
767 "product_specific_file_contexts": nil,
768 }), android.FixtureModifyProductVariables(
769 func(variables android.FixtureProductVariables) {
770 variables.Unbundled_build = proptools.BoolPtr(true)
771 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
772 }), android.FixtureMergeEnv(map[string]string{
773 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
774 }))
775
776 testCases := []struct {
777 module string
778 minSdkVersion string
779 }{
780 {
781 module: "myapex_30",
782 minSdkVersion: "30",
783 },
784 {
785 module: "myapex_current",
786 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
787 },
788 {
789 module: "myapex_none",
790 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
791 },
792 }
793 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900794 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400795 args := module.Rule("apexRule").Args
796 optFlags := args["opt_flags"]
797 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
798 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
799 }
800 }
801}
802
Jihoon Kang842b9992024-02-08 01:41:51 +0000803func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700804 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000805 ctx := testApex(t, `
806 apex_defaults {
807 name: "my_defaults",
808 key: "myapex.key",
809 product_specific: true,
810 file_contexts: ":my-file-contexts",
811 updatable: false,
812 }
813 apex {
814 name: "myapex_30",
815 min_sdk_version: "30",
816 defaults: ["my_defaults"],
817 }
818
819 apex {
820 name: "myapex_current",
821 min_sdk_version: "current",
822 defaults: ["my_defaults"],
823 }
824
825 apex {
826 name: "myapex_none",
827 defaults: ["my_defaults"],
828 }
829
830 apex_key {
831 name: "myapex.key",
832 public_key: "testkey.avbpubkey",
833 private_key: "testkey.pem",
834 }
835
836 filegroup {
837 name: "my-file-contexts",
838 srcs: ["product_specific_file_contexts"],
839 }
840 `, withFiles(map[string][]byte{
841 "product_specific_file_contexts": nil,
842 }), android.FixtureModifyProductVariables(
843 func(variables android.FixtureProductVariables) {
844 variables.Unbundled_build = proptools.BoolPtr(true)
845 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
846 }), android.FixtureMergeEnv(map[string]string{
847 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
848 }))
849
850 testCases := []struct {
851 module string
852 minSdkVersion string
853 }{
854 {
855 module: "myapex_30",
856 minSdkVersion: "30",
857 },
858 {
859 module: "myapex_current",
860 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
861 },
862 {
863 module: "myapex_none",
864 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
865 },
866 }
867 for _, tc := range testCases {
868 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
869 args := module.Rule("apexRule").Args
870 optFlags := args["opt_flags"]
871 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
872 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
873 }
874 }
875}
876
Jooyung Hanaf730952023-02-28 14:13:38 +0900877func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700878 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900880 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900881 if vendor {
882 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900883 }
884 ctx := testApex(t, `
885 apex {
886 name: "myapex",
887 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900888 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900889 `+prop+`
890 }
891
892 apex_key {
893 name: "myapex.key",
894 public_key: "testkey.avbpubkey",
895 private_key: "testkey.pem",
896 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900897 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900898
Jooyung Hana0503a52023-08-23 13:12:50 +0900899 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900900 if vendor {
901 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
902 rule.RuleParams.Command,
903 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900904 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900905 android.AssertStringDoesContain(t, "should force-label as system_file",
906 rule.RuleParams.Command,
907 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900908 }
909 }
910}
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800914 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 apex {
916 name: "myapex",
917 key: "myapex.key",
918 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900919 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000920 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
922
923 apex_key {
924 name: "myapex.key",
925 public_key: "testkey.avbpubkey",
926 private_key: "testkey.pem",
927 }
928
929 cc_library {
930 name: "mylib",
931 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000932 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 system_shared_libs: [],
934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000935 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 }
937
938 cc_library {
939 name: "mylib2",
940 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900941 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000945 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900946 versions: ["1", "2", "3"],
947 },
948 }
949
950 cc_library {
951 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900952 srcs: ["mylib.cpp"],
953 shared_libs: ["mylib4"],
954 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900955 stl: "none",
956 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000957 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958 versions: ["10", "11", "12"],
959 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000960 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900962
963 cc_library {
964 name: "mylib4",
965 srcs: ["mylib.cpp"],
966 system_shared_libs: [],
967 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000968 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900969 }
Jiyong Park105dc322021-06-11 17:22:09 +0900970
Spandan Das357ffcc2024-07-24 18:07:48 +0000971 cc_prebuilt_library_shared {
972 name: "my_prebuilt_platform_lib",
973 stubs: {
974 symbol_file: "my_prebuilt_platform_lib.map.txt",
975 versions: ["1", "2", "3"],
976 },
977 srcs: ["foo.so"],
978 }
979
980 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
981 cc_prebuilt_library_shared {
982 name: "my_prebuilt_platform_stub_only_lib",
983 stubs: {
984 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
985 versions: ["1", "2", "3"],
986 }
987 }
988
Jiyong Park105dc322021-06-11 17:22:09 +0900989 rust_binary {
990 name: "foo.rust",
991 srcs: ["foo.rs"],
992 shared_libs: ["libfoo.shared_from_rust"],
993 prefer_rlib: true,
994 apex_available: ["myapex"],
995 }
996
997 cc_library_shared {
998 name: "libfoo.shared_from_rust",
999 srcs: ["mylib.cpp"],
1000 system_shared_libs: [],
1001 stl: "none",
1002 stubs: {
1003 versions: ["10", "11", "12"],
1004 },
1005 }
1006
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 `)
1008
Jooyung Hana0503a52023-08-23 13:12:50 +09001009 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010 copyCmds := apexRule.Args["copy_commands"]
1011
1012 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001013 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001014
1015 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001016 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001017
1018 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001019 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001020
Colin Crossaede88c2020-08-11 12:17:01 -07001021 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
1023 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001024 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001025 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001026 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027
1028 // 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 -07001029 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001030 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001031 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001032
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001033 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1034 // is replaced by sharing of "cFlags" in cc/builder.go.
1035 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1036 // module variable representing "cflags". So it was not detected by ensureNotContains.
1037 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1038 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1039 // including the original cflags's "-include mylib.h".
1040 //
Jiyong Park64379952018-12-13 18:37:29 +09001041 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001042 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1043 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001044
Jiyong Park85cc35a2022-07-17 11:30:47 +09001045 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1046 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1047 // Ensure that genstub for apex-provided lib is invoked with --apex
1048 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001049
Jooyung Hana0503a52023-08-23 13:12:50 +09001050 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051 "lib64/mylib.so",
1052 "lib64/mylib3.so",
1053 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001054 "bin/foo.rust",
1055 "lib64/libc++.so", // by the implicit dependency from foo.rust
1056 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001057 })
Jiyong Park105dc322021-06-11 17:22:09 +09001058
1059 // Ensure that stub dependency from a rust module is not included
1060 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1061 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001062 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001063 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1064 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001065
Jooyung Hana0503a52023-08-23 13:12:50 +09001066 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001067 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001068
1069 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1070 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1071 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1072 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1073 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1074 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1075
1076 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1077 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1078 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1079 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1080 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1081 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 +09001082}
1083
Jooyung Han20348752023-12-05 15:23:56 +09001084func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001085 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001086 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1087 apex {
1088 name: "myapex",
1089 key: "myapex.key",
1090 vendor: true,
1091 updatable: false,
1092 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 cc_library {
1102 name: "libbar",
1103 srcs: ["mylib.cpp"],
1104 llndk: {
1105 symbol_file: "libbar.map.txt",
1106 }
1107 }
1108 `)
1109}
1110
Jiyong Park1bc84122021-06-22 20:23:05 +09001111func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001112 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001113 ctx := testApex(t, `
1114 apex {
1115 name: "myapex",
1116 key: "myapex.key",
1117 native_shared_libs: ["mylib"],
1118 binaries: ["foo.rust"],
1119 updatable: false,
1120 platform_apis: true,
1121 }
1122
1123 apex_key {
1124 name: "myapex.key",
1125 public_key: "testkey.avbpubkey",
1126 private_key: "testkey.pem",
1127 }
1128
1129 cc_library {
1130 name: "mylib",
1131 srcs: ["mylib.cpp"],
1132 shared_libs: ["mylib2"],
1133 system_shared_libs: [],
1134 stl: "none",
1135 apex_available: [ "myapex" ],
1136 }
1137
1138 cc_library {
1139 name: "mylib2",
1140 srcs: ["mylib.cpp"],
1141 cflags: ["-include mylib.h"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["1", "2", "3"],
1146 },
1147 }
1148
1149 rust_binary {
1150 name: "foo.rust",
1151 srcs: ["foo.rs"],
1152 shared_libs: ["libfoo.shared_from_rust"],
1153 prefer_rlib: true,
1154 apex_available: ["myapex"],
1155 }
1156
1157 cc_library_shared {
1158 name: "libfoo.shared_from_rust",
1159 srcs: ["mylib.cpp"],
1160 system_shared_libs: [],
1161 stl: "none",
1162 stubs: {
1163 versions: ["10", "11", "12"],
1164 },
1165 }
1166 `)
1167
Jooyung Hana0503a52023-08-23 13:12:50 +09001168 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001169 copyCmds := apexRule.Args["copy_commands"]
1170
1171 // Ensure that indirect stubs dep is not included
1172 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1173 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1174
1175 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1176 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001177 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001178 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1179 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001180 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001181 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1182 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1183}
1184
Colin Cross7812fd32020-09-25 12:35:10 -07001185func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1186 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001187 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001188 apex {
1189 name: "myapex",
1190 key: "myapex.key",
1191 native_shared_libs: ["mylib", "mylib3"],
1192 min_sdk_version: "29",
1193 }
1194
1195 apex_key {
1196 name: "myapex.key",
1197 public_key: "testkey.avbpubkey",
1198 private_key: "testkey.pem",
1199 }
1200
1201 cc_library {
1202 name: "mylib",
1203 srcs: ["mylib.cpp"],
1204 shared_libs: ["mylib2", "mylib3"],
1205 system_shared_libs: [],
1206 stl: "none",
1207 apex_available: [ "myapex" ],
1208 min_sdk_version: "28",
1209 }
1210
1211 cc_library {
1212 name: "mylib2",
1213 srcs: ["mylib.cpp"],
1214 cflags: ["-include mylib.h"],
1215 system_shared_libs: [],
1216 stl: "none",
1217 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001218 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001219 versions: ["28", "29", "30", "current"],
1220 },
1221 min_sdk_version: "28",
1222 }
1223
1224 cc_library {
1225 name: "mylib3",
1226 srcs: ["mylib.cpp"],
1227 shared_libs: ["mylib4"],
1228 system_shared_libs: [],
1229 stl: "none",
1230 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001231 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001232 versions: ["28", "29", "30", "current"],
1233 },
1234 apex_available: [ "myapex" ],
1235 min_sdk_version: "28",
1236 }
1237
1238 cc_library {
1239 name: "mylib4",
1240 srcs: ["mylib.cpp"],
1241 system_shared_libs: [],
1242 stl: "none",
1243 apex_available: [ "myapex" ],
1244 min_sdk_version: "28",
1245 }
1246 `)
1247
Jooyung Hana0503a52023-08-23 13:12:50 +09001248 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001249 copyCmds := apexRule.Args["copy_commands"]
1250
1251 // Ensure that direct non-stubs dep is always included
1252 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1253
1254 // Ensure that indirect stubs dep is not included
1255 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1256
1257 // Ensure that direct stubs dep is included
1258 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1259
1260 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1261
Jiyong Park55549df2021-02-26 23:57:23 +09001262 // Ensure that mylib is linking with the latest version of stub for mylib2
1263 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001264 // ... and not linking to the non-stub (impl) variant of mylib2
1265 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1266
1267 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1268 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1269 // .. and not linking to the stubs variant of mylib3
1270 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1271
1272 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001273 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001274 ensureNotContains(t, mylib2Cflags, "-include ")
1275
Jiyong Park85cc35a2022-07-17 11:30:47 +09001276 // Ensure that genstub is invoked with --systemapi
1277 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001278
Jooyung Hana0503a52023-08-23 13:12:50 +09001279 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001280 "lib64/mylib.so",
1281 "lib64/mylib3.so",
1282 "lib64/mylib4.so",
1283 })
1284}
1285
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001286func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1287 t.Parallel()
1288 // myapex (Z)
1289 // mylib -----------------.
1290 // |
1291 // otherapex (29) |
1292 // libstub's versions: 29 Z current
1293 // |
1294 // <platform> |
1295 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001296 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297 apex {
1298 name: "myapex",
1299 key: "myapex.key",
1300 native_shared_libs: ["mylib"],
1301 min_sdk_version: "Z", // non-final
1302 }
1303
1304 cc_library {
1305 name: "mylib",
1306 srcs: ["mylib.cpp"],
1307 shared_libs: ["libstub"],
1308 apex_available: ["myapex"],
1309 min_sdk_version: "Z",
1310 }
1311
1312 apex_key {
1313 name: "myapex.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
1317
1318 apex {
1319 name: "otherapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["libstub"],
1322 min_sdk_version: "29",
1323 }
1324
1325 cc_library {
1326 name: "libstub",
1327 srcs: ["mylib.cpp"],
1328 stubs: {
1329 versions: ["29", "Z", "current"],
1330 },
1331 apex_available: ["otherapex"],
1332 min_sdk_version: "29",
1333 }
1334
1335 // platform module depending on libstub from otherapex should use the latest stub("current")
1336 cc_library {
1337 name: "libplatform",
1338 srcs: ["mylib.cpp"],
1339 shared_libs: ["libstub"],
1340 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001341 `,
1342 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1343 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1344 variables.Platform_sdk_final = proptools.BoolPtr(false)
1345 variables.Platform_version_active_codenames = []string{"Z"}
1346 }),
1347 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001348
Jiyong Park55549df2021-02-26 23:57:23 +09001349 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001350 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001351 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001352 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001353 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001354
1355 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1356 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1357 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1358 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1359 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1360}
1361
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001362func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001363 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001364 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001366 name: "myapex2",
1367 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001369 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 }
1371
1372 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001373 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001374 public_key: "testkey.avbpubkey",
1375 private_key: "testkey.pem",
1376 }
1377
1378 cc_library {
1379 name: "mylib",
1380 srcs: ["mylib.cpp"],
1381 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001382 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001383 system_shared_libs: [],
1384 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001385 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001386 }
1387
1388 cc_library {
1389 name: "libfoo",
1390 srcs: ["mylib.cpp"],
1391 shared_libs: ["libbar"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 stubs: {
1395 versions: ["10", "20", "30"],
1396 },
1397 }
1398
1399 cc_library {
1400 name: "libbar",
1401 srcs: ["mylib.cpp"],
1402 system_shared_libs: [],
1403 stl: "none",
1404 }
1405
Jiyong Park678c8812020-02-07 17:25:49 +09001406 cc_library_static {
1407 name: "libbaz",
1408 srcs: ["mylib.cpp"],
1409 system_shared_libs: [],
1410 stl: "none",
1411 apex_available: [ "myapex2" ],
1412 }
1413
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 `)
1415
Jooyung Hana0503a52023-08-23 13:12:50 +09001416 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001417 copyCmds := apexRule.Args["copy_commands"]
1418
1419 // Ensure that direct non-stubs dep is always included
1420 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1421
1422 // Ensure that indirect stubs dep is not included
1423 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1424
1425 // Ensure that dependency of stubs is not included
1426 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1427
Colin Crossaede88c2020-08-11 12:17:01 -07001428 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429
1430 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001431 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001432 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001433 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001434
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001436
1437 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1438 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001439
Colin Crossf61d03d2023-11-02 16:56:39 -07001440 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1441 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001442 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001443
Colin Crossf61d03d2023-11-02 16:56:39 -07001444 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1445 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001446 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001447}
1448
Jooyung Hand3639552019-08-09 12:57:43 +09001449func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001450 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001451 /*
1452 myapex
1453 |
1454 v (runtime_libs)
1455 mylib ------+------> libfoo [provides stub]
1456 |
1457 `------> libbar
1458 */
Colin Cross1c460562021-02-16 17:55:47 -08001459 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001460 apex {
1461 name: "myapex",
1462 key: "myapex.key",
1463 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001464 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001465 }
1466
1467 apex_key {
1468 name: "myapex.key",
1469 public_key: "testkey.avbpubkey",
1470 private_key: "testkey.pem",
1471 }
1472
1473 cc_library {
1474 name: "mylib",
1475 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001476 static_libs: ["libstatic"],
1477 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001478 runtime_libs: ["libfoo", "libbar"],
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
1484 cc_library {
1485 name: "libfoo",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 stubs: {
1490 versions: ["10", "20", "30"],
1491 },
1492 }
1493
1494 cc_library {
1495 name: "libbar",
1496 srcs: ["mylib.cpp"],
1497 system_shared_libs: [],
1498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001499 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001500 }
1501
Liz Kammer5f108fa2023-05-11 14:33:17 -04001502 cc_library {
1503 name: "libstatic",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 runtime_libs: ["libstatic_to_runtime"],
1509 }
1510
1511 cc_library {
1512 name: "libshared",
1513 srcs: ["mylib.cpp"],
1514 system_shared_libs: [],
1515 stl: "none",
1516 apex_available: [ "myapex" ],
1517 runtime_libs: ["libshared_to_runtime"],
1518 }
1519
1520 cc_library {
1521 name: "libstatic_to_runtime",
1522 srcs: ["mylib.cpp"],
1523 system_shared_libs: [],
1524 stl: "none",
1525 apex_available: [ "myapex" ],
1526 }
1527
1528 cc_library {
1529 name: "libshared_to_runtime",
1530 srcs: ["mylib.cpp"],
1531 system_shared_libs: [],
1532 stl: "none",
1533 apex_available: [ "myapex" ],
1534 }
Jooyung Hand3639552019-08-09 12:57:43 +09001535 `)
1536
Jooyung Hana0503a52023-08-23 13:12:50 +09001537 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001538 copyCmds := apexRule.Args["copy_commands"]
1539
1540 // Ensure that direct non-stubs dep is always included
1541 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1542
1543 // Ensure that indirect stubs dep is not included
1544 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1545
1546 // Ensure that runtime_libs dep in included
1547 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001548 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1549 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1550
1551 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001552
Jooyung Hana0503a52023-08-23 13:12:50 +09001553 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001554 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1555 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001556}
1557
Paul Duffina02cae32021-03-09 01:44:06 +00001558var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1559 cc.PrepareForTestWithCcBuildComponents,
1560 PrepareForTestWithApexBuildComponents,
1561 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 apex {
1563 name: "com.android.runtime",
1564 key: "com.android.runtime.key",
1565 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001566 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567 }
1568
1569 apex_key {
1570 name: "com.android.runtime.key",
1571 public_key: "testkey.avbpubkey",
1572 private_key: "testkey.pem",
1573 }
Paul Duffina02cae32021-03-09 01:44:06 +00001574 `),
1575 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1576)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001577
Paul Duffina02cae32021-03-09 01:44:06 +00001578func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001579 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001580 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001581 cc_library {
1582 name: "libc",
1583 no_libcrt: true,
1584 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001585 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001586 stl: "none",
1587 system_shared_libs: [],
1588 stubs: { versions: ["1"] },
1589 apex_available: ["com.android.runtime"],
1590
1591 sanitize: {
1592 hwaddress: true,
1593 }
1594 }
1595
1596 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001597 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598 no_libcrt: true,
1599 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001600 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001601 stl: "none",
1602 system_shared_libs: [],
1603 srcs: [""],
1604 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001605 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001606
1607 sanitize: {
1608 never: true,
1609 },
Spandan Das4de7b492023-05-05 21:13:01 +00001610 apex_available: [
1611 "//apex_available:anyapex",
1612 "//apex_available:platform",
1613 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001614 } `)
1615 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001616
Jooyung Hana0503a52023-08-23 13:12:50 +09001617 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001618 "lib64/bionic/libc.so",
1619 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1620 })
1621
Colin Cross4c4c1be2022-02-10 11:41:18 -08001622 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001623
1624 installed := hwasan.Description("install libclang_rt.hwasan")
1625 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1626
1627 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1628 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1629 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1630}
1631
1632func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001633 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001634 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001635 prepareForTestOfRuntimeApexWithHwasan,
1636 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1637 variables.SanitizeDevice = []string{"hwaddress"}
1638 }),
1639 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001640 cc_library {
1641 name: "libc",
1642 no_libcrt: true,
1643 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001644 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001645 stl: "none",
1646 system_shared_libs: [],
1647 stubs: { versions: ["1"] },
1648 apex_available: ["com.android.runtime"],
1649 }
1650
1651 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001652 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001653 no_libcrt: true,
1654 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001655 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 stl: "none",
1657 system_shared_libs: [],
1658 srcs: [""],
1659 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 sanitize: {
1663 never: true,
1664 },
Spandan Das4de7b492023-05-05 21:13:01 +00001665 apex_available: [
1666 "//apex_available:anyapex",
1667 "//apex_available:platform",
1668 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001669 }
Paul Duffina02cae32021-03-09 01:44:06 +00001670 `)
1671 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001672
Jooyung Hana0503a52023-08-23 13:12:50 +09001673 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001674 "lib64/bionic/libc.so",
1675 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1676 })
1677
Colin Cross4c4c1be2022-02-10 11:41:18 -08001678 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001679
1680 installed := hwasan.Description("install libclang_rt.hwasan")
1681 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1682
1683 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1684 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1685 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1686}
1687
Jooyung Han61b66e92020-03-21 14:21:46 +00001688func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001689 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001690 testcases := []struct {
1691 name string
1692 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001693 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001694 shouldLink string
1695 shouldNotLink []string
1696 }{
1697 {
Jiyong Park55549df2021-02-26 23:57:23 +09001698 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001699 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001700 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001701 shouldLink: "current",
1702 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 },
1704 {
Jiyong Park55549df2021-02-26 23:57:23 +09001705 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001706 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001707 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 shouldLink: "current",
1709 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 },
1711 }
1712 for _, tc := range testcases {
1713 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001714 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001715 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001716 apex {
1717 name: "myapex",
1718 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001720 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001721 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001722 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001723
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 apex_key {
1725 name: "myapex.key",
1726 public_key: "testkey.avbpubkey",
1727 private_key: "testkey.pem",
1728 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001729
Jooyung Han61b66e92020-03-21 14:21:46 +00001730 cc_library {
1731 name: "mylib",
1732 srcs: ["mylib.cpp"],
1733 vendor_available: true,
1734 shared_libs: ["libbar"],
1735 system_shared_libs: [],
1736 stl: "none",
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001740
Jooyung Han61b66e92020-03-21 14:21:46 +00001741 cc_library {
1742 name: "libbar",
1743 srcs: ["mylib.cpp"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001747 llndk: {
1748 symbol_file: "libbar.map.txt",
1749 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001750 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001751 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001752 withUnbundledBuild,
1753 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001754
Jooyung Han61b66e92020-03-21 14:21:46 +00001755 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001756 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001757 "lib64/mylib.so",
1758 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001759
Jooyung Han61b66e92020-03-21 14:21:46 +00001760 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001761 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1763 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001764
Steven Moreland2c4000c2021-04-27 02:08:49 +00001765 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1766 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001767 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001768 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001769 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001770
Steven Moreland2c4000c2021-04-27 02:08:49 +00001771 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001772 ver := tc.shouldLink
1773 if tc.shouldLink == "current" {
1774 ver = strconv.Itoa(android.FutureApiLevelInt)
1775 }
1776 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001777 })
1778 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001779}
1780
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001782 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001783 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 apex {
1785 name: "myapex",
1786 key: "myapex.key",
1787 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001788 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 }
1790
1791 apex_key {
1792 name: "myapex.key",
1793 public_key: "testkey.avbpubkey",
1794 private_key: "testkey.pem",
1795 }
1796
1797 cc_library {
1798 name: "mylib",
1799 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001800 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001801 shared_libs: ["libdl#27"],
1802 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001803 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804 }
1805
1806 cc_library_shared {
1807 name: "mylib_shared",
1808 srcs: ["mylib.cpp"],
1809 shared_libs: ["libdl#27"],
1810 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001811 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001812 }
1813
1814 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001815 name: "libBootstrap",
1816 srcs: ["mylib.cpp"],
1817 stl: "none",
1818 bootstrap: true,
1819 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001820 `)
1821
Jooyung Hana0503a52023-08-23 13:12:50 +09001822 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001823 copyCmds := apexRule.Args["copy_commands"]
1824
1825 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001826 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001827 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1828 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001829
1830 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001831 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001832
Colin Crossaede88c2020-08-11 12:17:01 -07001833 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1834 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1835 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001836
1837 // For dependency to libc
1838 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001839 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001842 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001843 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1844 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845
1846 // For dependency to libm
1847 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001848 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001849 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001850 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001851 // ... and is not compiling with the stub
1852 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1853 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1854
1855 // For dependency to libdl
1856 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001857 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001858 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001859 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1860 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001861 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001862 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001863 // ... Cflags from stub is correctly exported to mylib
1864 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1865 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001866
1867 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001868 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1869 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1870 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1871 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001872}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001873
Jooyung Han749dc692020-04-15 11:03:39 +09001874func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001875 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001876 // there are three links between liba --> libz.
1877 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001878 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001879 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001880 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001881 apex {
1882 name: "myapex",
1883 key: "myapex.key",
1884 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001885 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001886 }
1887
1888 apex {
1889 name: "otherapex",
1890 key: "myapex.key",
1891 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001892 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001893 }
1894
1895 apex_key {
1896 name: "myapex.key",
1897 public_key: "testkey.avbpubkey",
1898 private_key: "testkey.pem",
1899 }
1900
1901 cc_library {
1902 name: "libx",
1903 shared_libs: ["liba"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001907 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001908 }
1909
1910 cc_library {
1911 name: "liby",
1912 shared_libs: ["liba"],
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001916 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001917 }
1918
1919 cc_library {
1920 name: "liba",
1921 shared_libs: ["libz"],
1922 system_shared_libs: [],
1923 stl: "none",
1924 apex_available: [
1925 "//apex_available:anyapex",
1926 "//apex_available:platform",
1927 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001928 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001929 }
1930
1931 cc_library {
1932 name: "libz",
1933 system_shared_libs: [],
1934 stl: "none",
1935 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001936 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001937 },
1938 }
Jooyung Han749dc692020-04-15 11:03:39 +09001939 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001940
1941 expectLink := func(from, from_variant, to, to_variant string) {
1942 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1943 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1944 }
1945 expectNoLink := func(from, from_variant, to, to_variant string) {
1946 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1947 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1948 }
1949 // platform liba is linked to non-stub version
1950 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001951 // liba in myapex is linked to current
1952 expectLink("liba", "shared_apex29", "libz", "shared_current")
1953 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001954 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001955 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001956 // liba in otherapex is linked to current
1957 expectLink("liba", "shared_apex30", "libz", "shared_current")
1958 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001959 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1960 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001961}
1962
Jooyung Hanaed150d2020-04-02 01:41:41 +09001963func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001964 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001965 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001966 apex {
1967 name: "myapex",
1968 key: "myapex.key",
1969 native_shared_libs: ["libx"],
1970 min_sdk_version: "R",
1971 }
1972
1973 apex_key {
1974 name: "myapex.key",
1975 public_key: "testkey.avbpubkey",
1976 private_key: "testkey.pem",
1977 }
1978
1979 cc_library {
1980 name: "libx",
1981 shared_libs: ["libz"],
1982 system_shared_libs: [],
1983 stl: "none",
1984 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001985 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001986 }
1987
1988 cc_library {
1989 name: "libz",
1990 system_shared_libs: [],
1991 stl: "none",
1992 stubs: {
1993 versions: ["29", "R"],
1994 },
1995 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001996 `,
1997 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1998 variables.Platform_version_active_codenames = []string{"R"}
1999 }),
2000 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002001
2002 expectLink := func(from, from_variant, to, to_variant string) {
2003 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2004 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2005 }
2006 expectNoLink := func(from, from_variant, to, to_variant string) {
2007 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2008 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2009 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002010 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2011 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002012 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2013 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002014}
2015
Jooyung Han4c4da062021-06-23 10:23:16 +09002016func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002017 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002018 testApex(t, `
2019 apex {
2020 name: "myapex",
2021 key: "myapex.key",
2022 java_libs: ["libx"],
2023 min_sdk_version: "S",
2024 }
2025
2026 apex_key {
2027 name: "myapex.key",
2028 public_key: "testkey.avbpubkey",
2029 private_key: "testkey.pem",
2030 }
2031
2032 java_library {
2033 name: "libx",
2034 srcs: ["a.java"],
2035 apex_available: [ "myapex" ],
2036 sdk_version: "current",
2037 min_sdk_version: "S", // should be okay
2038 }
2039 `,
2040 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2041 variables.Platform_version_active_codenames = []string{"S"}
2042 variables.Platform_sdk_codename = proptools.StringPtr("S")
2043 }),
2044 )
2045}
2046
Jooyung Han749dc692020-04-15 11:03:39 +09002047func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002048 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002049 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002050 apex {
2051 name: "myapex",
2052 key: "myapex.key",
2053 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002054 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002055 }
2056
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }
2062
2063 cc_library {
2064 name: "libx",
2065 shared_libs: ["libz"],
2066 system_shared_libs: [],
2067 stl: "none",
2068 apex_available: [ "myapex" ],
2069 }
2070
2071 cc_library {
2072 name: "libz",
2073 system_shared_libs: [],
2074 stl: "none",
2075 stubs: {
2076 versions: ["1", "2"],
2077 },
2078 }
2079 `)
2080
2081 expectLink := func(from, from_variant, to, to_variant string) {
2082 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2083 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2084 }
2085 expectNoLink := func(from, from_variant, to, to_variant string) {
2086 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2087 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2088 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002089 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002090 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002091 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002092 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002093}
2094
Jooyung Handfc864c2023-03-20 18:19:07 +09002095func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002096 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002097 ctx := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002102 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002103 vendor: true,
2104 min_sdk_version: "29",
2105 }
2106
2107 apex_key {
2108 name: "myapex.key",
2109 public_key: "testkey.avbpubkey",
2110 private_key: "testkey.pem",
2111 }
2112
2113 cc_library {
2114 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002115 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002116 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002117 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002118 shared_libs: ["libbar"],
2119 }
2120
2121 cc_library {
2122 name: "libbar",
2123 stubs: { versions: ["29", "30"] },
2124 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002125 }
2126 `)
2127
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002128 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002129
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002130 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002131
2132 // Ensure that mylib links with "current" LLNDK
2133 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002134 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002135
2136 // Ensure that mylib is targeting 29
2137 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2138 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2139
2140 // Ensure that the correct variant of crtbegin_so is used.
2141 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2142 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002143
2144 // Ensure that the crtbegin_so used by the APEX is targeting 29
2145 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2146 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2147}
2148
Jooyung Han4495f842023-04-25 16:39:59 +09002149func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002150 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002151 ctx := testApex(t, `
2152 apex {
2153 name: "myapex",
2154 key: "myapex.key",
2155 updatable: true,
2156 native_shared_libs: [
2157 "mylib",
2158 "yourlib",
2159 ],
2160 min_sdk_version: "29",
2161 }
2162
2163 apex {
2164 name: "myapex2",
2165 key: "myapex.key",
2166 updatable: false,
2167 native_shared_libs: ["yourlib"],
2168 }
2169
2170 apex_key {
2171 name: "myapex.key",
2172 public_key: "testkey.avbpubkey",
2173 private_key: "testkey.pem",
2174 }
2175
2176 cc_library {
2177 name: "mylib",
2178 srcs: ["mylib.cpp"],
2179 shared_libs: ["libbar"],
2180 min_sdk_version: "29",
2181 apex_available: ["myapex"],
2182 }
2183
2184 cc_library {
2185 name: "libbar",
2186 stubs: { versions: ["29", "30"] },
2187 }
2188
2189 cc_library {
2190 name: "yourlib",
2191 srcs: ["mylib.cpp"],
2192 min_sdk_version: "29",
2193 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2194 }
2195 `, withFiles(android.MockFS{
2196 "packages/modules/common/build/allowed_deps.txt": nil,
2197 }))
2198
2199 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2200 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2201 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002202 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002203 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002204 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002205
Jooyung Hana0503a52023-08-23 13:12:50 +09002206 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002207 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2208 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002209 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2210 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2211 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2212 flatlist, "mylib:(minSdkVersion:29)")
2213 android.AssertStringListContains(t, "track platform-available lib",
2214 flatlist, "yourlib(minSdkVersion:29)")
2215}
2216
Nouby Mohamed8609a552024-09-04 22:19:51 +00002217func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002218 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002219 ctx := testApex(t, `
2220 apex {
2221 name: "myapex",
2222 key: "myapex.key",
2223 updatable: true,
2224 native_shared_libs: [
2225 "mylib",
2226 "yourlib",
2227 ],
2228 min_sdk_version: "29",
2229 }
2230
2231 apex {
2232 name: "myapex2",
2233 key: "myapex.key",
2234 updatable: false,
2235 native_shared_libs: ["yourlib"],
2236 }
2237
2238 apex_key {
2239 name: "myapex.key",
2240 public_key: "testkey.avbpubkey",
2241 private_key: "testkey.pem",
2242 }
2243
2244 cc_library {
2245 name: "mylib",
2246 srcs: ["mylib.cpp"],
2247 shared_libs: ["libbar"],
2248 min_sdk_version: "29",
2249 apex_available: ["myapex"],
2250 }
2251
2252 cc_library {
2253 name: "libbar",
2254 stubs: { versions: ["29", "30"] },
2255 }
2256
2257 cc_library {
2258 name: "yourlib",
2259 srcs: ["mylib.cpp"],
2260 min_sdk_version: "29",
2261 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2262 }
2263 `, withFiles(android.MockFS{
2264 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2265 }),
2266 android.FixtureModifyProductVariables(
2267 func(variables android.FixtureProductVariables) {
2268 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2269 },
2270 ))
2271
2272 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2273 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2274 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2275 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2276 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2277 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2278
2279 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2280 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2281 myapex.Output("depsinfo/flatlist.txt")), "\n")
2282 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2283 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2284 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2285 flatlist, "mylib:(minSdkVersion:29)")
2286 android.AssertStringListContains(t, "track platform-available lib",
2287 flatlist, "yourlib(minSdkVersion:29)")
2288}
2289
2290func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002291 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002292 ctx := testApex(t, `
2293 apex {
2294 name: "myapex",
2295 key: "myapex.key",
2296 updatable: true,
2297 native_shared_libs: [
2298 "mylib",
2299 "yourlib",
2300 ],
2301 min_sdk_version: "29",
2302 }
2303
2304 apex {
2305 name: "myapex2",
2306 key: "myapex.key",
2307 updatable: false,
2308 native_shared_libs: ["yourlib"],
2309 }
2310
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316
2317 cc_library {
2318 name: "mylib",
2319 srcs: ["mylib.cpp"],
2320 shared_libs: ["libbar"],
2321 min_sdk_version: "29",
2322 apex_available: ["myapex"],
2323 }
2324
2325 cc_library {
2326 name: "libbar",
2327 stubs: { versions: ["29", "30"] },
2328 }
2329
2330 cc_library {
2331 name: "yourlib",
2332 srcs: ["mylib.cpp"],
2333 min_sdk_version: "29",
2334 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2335 }
2336 `, withFiles(android.MockFS{
2337 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2338 "packages/modules/common/build/allowed_deps.txt": nil,
2339 }),
2340 android.FixtureModifyProductVariables(
2341 func(variables android.FixtureProductVariables) {
2342 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2343 },
2344 ))
2345
2346 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2347 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2348 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2349 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2350 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2351 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2352
2353 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2354 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2355 myapex.Output("depsinfo/flatlist.txt")), "\n")
2356 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2357 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2358 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2359 flatlist, "mylib:(minSdkVersion:29)")
2360 android.AssertStringListContains(t, "track platform-available lib",
2361 flatlist, "yourlib(minSdkVersion:29)")
2362}
2363
Jooyung Han4495f842023-04-25 16:39:59 +09002364func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002365 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002366 ctx := testApex(t, `
2367 apex {
2368 name: "myapex",
2369 key: "myapex.key",
2370 updatable: true,
2371 min_sdk_version: "29",
2372 }
2373
2374 apex_key {
2375 name: "myapex.key",
2376 public_key: "testkey.avbpubkey",
2377 private_key: "testkey.pem",
2378 }
2379 `)
2380 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2381 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2382 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2383 }
2384}
2385
Jooyung Han03b51852020-02-26 22:45:42 +09002386func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002387 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002388 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002389 apex {
2390 name: "myapex",
2391 key: "myapex.key",
2392 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002393 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002394 }
2395
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401
2402 cc_library {
2403 name: "libx",
2404 system_shared_libs: [],
2405 stl: "none",
2406 apex_available: [ "myapex" ],
2407 stubs: {
2408 versions: ["1", "2"],
2409 },
2410 }
2411
2412 cc_library {
2413 name: "libz",
2414 shared_libs: ["libx"],
2415 system_shared_libs: [],
2416 stl: "none",
2417 }
2418 `)
2419
2420 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002421 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002422 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2423 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2424 }
2425 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002426 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002427 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2428 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2429 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002430 expectLink("libz", "shared", "libx", "shared_current")
2431 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002432 expectNoLink("libz", "shared", "libz", "shared_1")
2433 expectNoLink("libz", "shared", "libz", "shared")
2434}
2435
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002436var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2437 func(variables android.FixtureProductVariables) {
2438 variables.SanitizeDevice = []string{"hwaddress"}
2439 },
2440)
2441
Jooyung Han75568392020-03-20 04:29:24 +09002442func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002443 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002444 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002445 apex {
2446 name: "myapex",
2447 key: "myapex.key",
2448 native_shared_libs: ["libx"],
2449 min_sdk_version: "29",
2450 }
2451
2452 apex_key {
2453 name: "myapex.key",
2454 public_key: "testkey.avbpubkey",
2455 private_key: "testkey.pem",
2456 }
2457
2458 cc_library {
2459 name: "libx",
2460 shared_libs: ["libbar"],
2461 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002462 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002463 }
2464
2465 cc_library {
2466 name: "libbar",
2467 stubs: {
2468 versions: ["29", "30"],
2469 },
2470 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002471 `,
2472 prepareForTestWithSantitizeHwaddress,
2473 )
Jooyung Han03b51852020-02-26 22:45:42 +09002474 expectLink := func(from, from_variant, to, to_variant string) {
2475 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2476 libFlags := ld.Args["libFlags"]
2477 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2478 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002479 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002480}
2481
Jooyung Han75568392020-03-20 04:29:24 +09002482func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002483 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002484 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002485 apex {
2486 name: "myapex",
2487 key: "myapex.key",
2488 native_shared_libs: ["libx"],
2489 min_sdk_version: "29",
2490 }
2491
2492 apex_key {
2493 name: "myapex.key",
2494 public_key: "testkey.avbpubkey",
2495 private_key: "testkey.pem",
2496 }
2497
2498 cc_library {
2499 name: "libx",
2500 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002501 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002502 }
Jooyung Han75568392020-03-20 04:29:24 +09002503 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002504
2505 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002506 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002507 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002508 // note that platform variant is not.
2509 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002510 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002511}
2512
Jooyung Han749dc692020-04-15 11:03:39 +09002513func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002514 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002515 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002516 apex {
2517 name: "myapex",
2518 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002519 native_shared_libs: ["mylib"],
2520 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002521 }
2522
2523 apex_key {
2524 name: "myapex.key",
2525 public_key: "testkey.avbpubkey",
2526 private_key: "testkey.pem",
2527 }
Jooyung Han749dc692020-04-15 11:03:39 +09002528
2529 cc_library {
2530 name: "mylib",
2531 srcs: ["mylib.cpp"],
2532 system_shared_libs: [],
2533 stl: "none",
2534 apex_available: [
2535 "myapex",
2536 ],
2537 min_sdk_version: "30",
2538 }
2539 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002540
2541 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 native_shared_libs: ["libfoo.ffi"],
2546 min_sdk_version: "29",
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 rust_ffi_shared {
2556 name: "libfoo.ffi",
2557 srcs: ["foo.rs"],
2558 crate_name: "foo",
2559 apex_available: [
2560 "myapex",
2561 ],
2562 min_sdk_version: "30",
2563 }
2564 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002565
2566 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2567 apex {
2568 name: "myapex",
2569 key: "myapex.key",
2570 java_libs: ["libfoo"],
2571 min_sdk_version: "29",
2572 }
2573
2574 apex_key {
2575 name: "myapex.key",
2576 public_key: "testkey.avbpubkey",
2577 private_key: "testkey.pem",
2578 }
2579
2580 java_import {
2581 name: "libfoo",
2582 jars: ["libfoo.jar"],
2583 apex_available: [
2584 "myapex",
2585 ],
2586 min_sdk_version: "30",
2587 }
2588 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002589
2590 // Skip check for modules compiling against core API surface
2591 testApex(t, `
2592 apex {
2593 name: "myapex",
2594 key: "myapex.key",
2595 java_libs: ["libfoo"],
2596 min_sdk_version: "29",
2597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 java_library {
2606 name: "libfoo",
2607 srcs: ["Foo.java"],
2608 apex_available: [
2609 "myapex",
2610 ],
2611 // Compile against core API surface
2612 sdk_version: "core_current",
2613 min_sdk_version: "30",
2614 }
2615 `)
2616
Jooyung Han749dc692020-04-15 11:03:39 +09002617}
2618
2619func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002620 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002621 testApex(t, `
2622 apex {
2623 name: "myapex",
2624 key: "myapex.key",
2625 native_shared_libs: ["libfoo"],
2626 java_libs: ["libbar"],
2627 min_sdk_version: "29",
2628 }
2629
2630 apex_key {
2631 name: "myapex.key",
2632 public_key: "testkey.avbpubkey",
2633 private_key: "testkey.pem",
2634 }
2635
2636 cc_library {
2637 name: "libfoo",
2638 srcs: ["mylib.cpp"],
2639 shared_libs: ["libfoo_dep"],
2640 apex_available: ["myapex"],
2641 min_sdk_version: "29",
2642 }
2643
2644 cc_library {
2645 name: "libfoo_dep",
2646 srcs: ["mylib.cpp"],
2647 apex_available: ["myapex"],
2648 min_sdk_version: "29",
2649 }
2650
2651 java_library {
2652 name: "libbar",
2653 sdk_version: "current",
2654 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002655 static_libs: [
2656 "libbar_dep",
2657 "libbar_import_dep",
2658 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002659 apex_available: ["myapex"],
2660 min_sdk_version: "29",
2661 }
2662
2663 java_library {
2664 name: "libbar_dep",
2665 sdk_version: "current",
2666 srcs: ["a.java"],
2667 apex_available: ["myapex"],
2668 min_sdk_version: "29",
2669 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002670
2671 java_import {
2672 name: "libbar_import_dep",
2673 jars: ["libbar.jar"],
2674 apex_available: ["myapex"],
2675 min_sdk_version: "29",
2676 }
Jooyung Han03b51852020-02-26 22:45:42 +09002677 `)
2678}
2679
Colin Cross8ca61c12022-10-06 21:00:14 -07002680func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002681 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002682 // Tests that an apex dependency with min_sdk_version higher than the
2683 // min_sdk_version of the apex is allowed as long as the dependency's
2684 // min_sdk_version is less than or equal to the api level that the
2685 // architecture was introduced in. In this case, arm64 didn't exist
2686 // until api level 21, so the arm64 code will never need to run on
2687 // an api level 20 device, even if other architectures of the apex
2688 // will.
2689 testApex(t, `
2690 apex {
2691 name: "myapex",
2692 key: "myapex.key",
2693 native_shared_libs: ["libfoo"],
2694 min_sdk_version: "20",
2695 }
2696
2697 apex_key {
2698 name: "myapex.key",
2699 public_key: "testkey.avbpubkey",
2700 private_key: "testkey.pem",
2701 }
2702
2703 cc_library {
2704 name: "libfoo",
2705 srcs: ["mylib.cpp"],
2706 apex_available: ["myapex"],
2707 min_sdk_version: "21",
2708 stl: "none",
2709 }
2710 `)
2711}
2712
Artur Satayev8cf899a2020-04-15 17:29:42 +01002713func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002714 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 testCases := []struct {
2716 name string
2717 expectedError string
2718 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002719 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002720 }{
2721 {
2722 name: "Non-updatable apex with non-stable dep",
2723 bp: `
2724 apex {
2725 name: "myapex",
2726 java_libs: ["myjar"],
2727 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002728 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002729 }
2730 apex_key {
2731 name: "myapex.key",
2732 public_key: "testkey.avbpubkey",
2733 private_key: "testkey.pem",
2734 }
2735 java_library {
2736 name: "myjar",
2737 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002738 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002739 apex_available: ["myapex"],
2740 }
2741 `,
2742 },
2743 {
2744 name: "Updatable apex with stable dep",
2745 bp: `
2746 apex {
2747 name: "myapex",
2748 java_libs: ["myjar"],
2749 key: "myapex.key",
2750 updatable: true,
2751 min_sdk_version: "29",
2752 }
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758 java_library {
2759 name: "myjar",
2760 srcs: ["foo/bar/MyClass.java"],
2761 sdk_version: "current",
2762 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002763 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002764 }
2765 `,
2766 },
2767 {
2768 name: "Updatable apex with non-stable dep",
2769 expectedError: "cannot depend on \"myjar\"",
2770 bp: `
2771 apex {
2772 name: "myapex",
2773 java_libs: ["myjar"],
2774 key: "myapex.key",
2775 updatable: true,
2776 }
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782 java_library {
2783 name: "myjar",
2784 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002785 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002786 apex_available: ["myapex"],
2787 }
2788 `,
2789 },
2790 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002791 name: "Updatable apex with non-stable legacy core platform dep",
2792 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2793 bp: `
2794 apex {
2795 name: "myapex",
2796 java_libs: ["myjar-uses-legacy"],
2797 key: "myapex.key",
2798 updatable: true,
2799 }
2800 apex_key {
2801 name: "myapex.key",
2802 public_key: "testkey.avbpubkey",
2803 private_key: "testkey.pem",
2804 }
2805 java_library {
2806 name: "myjar-uses-legacy",
2807 srcs: ["foo/bar/MyClass.java"],
2808 sdk_version: "core_platform",
2809 apex_available: ["myapex"],
2810 }
2811 `,
2812 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2813 },
2814 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002815 name: "Updatable apex with non-stable transitive dep",
2816 // This is not actually detecting that the transitive dependency is unstable, rather it is
2817 // detecting that the transitive dependency is building against a wider API surface than the
2818 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002819 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002820 bp: `
2821 apex {
2822 name: "myapex",
2823 java_libs: ["myjar"],
2824 key: "myapex.key",
2825 updatable: true,
2826 }
2827 apex_key {
2828 name: "myapex.key",
2829 public_key: "testkey.avbpubkey",
2830 private_key: "testkey.pem",
2831 }
2832 java_library {
2833 name: "myjar",
2834 srcs: ["foo/bar/MyClass.java"],
2835 sdk_version: "current",
2836 apex_available: ["myapex"],
2837 static_libs: ["transitive-jar"],
2838 }
2839 java_library {
2840 name: "transitive-jar",
2841 srcs: ["foo/bar/MyClass.java"],
2842 sdk_version: "core_platform",
2843 apex_available: ["myapex"],
2844 }
2845 `,
2846 },
2847 }
2848
2849 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2851 continue
2852 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002853 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002854 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002855 errorHandler := android.FixtureExpectsNoErrors
2856 if test.expectedError != "" {
2857 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002859 android.GroupFixturePreparers(
2860 java.PrepareForTestWithJavaDefaultModules,
2861 PrepareForTestWithApexBuildComponents,
2862 prepareForTestWithMyapex,
2863 android.OptionalFixturePreparer(test.preparer),
2864 ).
2865 ExtendWithErrorHandler(errorHandler).
2866 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002867 })
2868 }
2869}
2870
Jooyung Han749dc692020-04-15 11:03:39 +09002871func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2872 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2873 apex {
2874 name: "myapex",
2875 key: "myapex.key",
2876 native_shared_libs: ["mylib"],
2877 min_sdk_version: "29",
2878 }
2879
2880 apex_key {
2881 name: "myapex.key",
2882 public_key: "testkey.avbpubkey",
2883 private_key: "testkey.pem",
2884 }
2885
2886 cc_library {
2887 name: "mylib",
2888 srcs: ["mylib.cpp"],
2889 shared_libs: ["mylib2"],
2890 system_shared_libs: [],
2891 stl: "none",
2892 apex_available: [
2893 "myapex",
2894 ],
2895 min_sdk_version: "29",
2896 }
2897
2898 // indirect part of the apex
2899 cc_library {
2900 name: "mylib2",
2901 srcs: ["mylib.cpp"],
2902 system_shared_libs: [],
2903 stl: "none",
2904 apex_available: [
2905 "myapex",
2906 ],
2907 min_sdk_version: "30",
2908 }
2909 `)
2910}
2911
2912func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002913 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002914 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 apps: ["AppFoo"],
2919 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002920 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002921 }
2922
2923 apex_key {
2924 name: "myapex.key",
2925 public_key: "testkey.avbpubkey",
2926 private_key: "testkey.pem",
2927 }
2928
2929 android_app {
2930 name: "AppFoo",
2931 srcs: ["foo/bar/MyClass.java"],
2932 sdk_version: "current",
2933 min_sdk_version: "29",
2934 system_modules: "none",
2935 stl: "none",
2936 static_libs: ["bar"],
2937 apex_available: [ "myapex" ],
2938 }
2939
2940 java_library {
2941 name: "bar",
2942 sdk_version: "current",
2943 srcs: ["a.java"],
2944 apex_available: [ "myapex" ],
2945 }
2946 `)
2947}
2948
2949func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002950 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002952 apex {
2953 name: "myapex",
2954 key: "myapex.key",
2955 native_shared_libs: ["mylib"],
2956 min_sdk_version: "29",
2957 }
2958
2959 apex_key {
2960 name: "myapex.key",
2961 public_key: "testkey.avbpubkey",
2962 private_key: "testkey.pem",
2963 }
2964
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002965 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002966 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2967 cc_library {
2968 name: "mylib",
2969 srcs: ["mylib.cpp"],
2970 shared_libs: ["mylib2"],
2971 system_shared_libs: [],
2972 stl: "none",
2973 apex_available: ["myapex", "otherapex"],
2974 min_sdk_version: "29",
2975 }
2976
2977 cc_library {
2978 name: "mylib2",
2979 srcs: ["mylib.cpp"],
2980 system_shared_libs: [],
2981 stl: "none",
2982 apex_available: ["otherapex"],
2983 stubs: { versions: ["29", "30"] },
2984 min_sdk_version: "30",
2985 }
2986
2987 apex {
2988 name: "otherapex",
2989 key: "myapex.key",
2990 native_shared_libs: ["mylib", "mylib2"],
2991 min_sdk_version: "30",
2992 }
2993 `)
2994 expectLink := func(from, from_variant, to, to_variant string) {
2995 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2996 libFlags := ld.Args["libFlags"]
2997 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2998 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002999 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07003000 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09003001}
3002
Jooyung Haned124c32021-01-26 11:43:46 +09003003func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003004 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003005 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3006 func(variables android.FixtureProductVariables) {
3007 variables.Platform_sdk_codename = proptools.StringPtr("S")
3008 variables.Platform_version_active_codenames = []string{"S"}
3009 },
3010 )
Jooyung Haned124c32021-01-26 11:43:46 +09003011 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3012 apex {
3013 name: "myapex",
3014 key: "myapex.key",
3015 native_shared_libs: ["libfoo"],
3016 min_sdk_version: "S",
3017 }
3018 apex_key {
3019 name: "myapex.key",
3020 public_key: "testkey.avbpubkey",
3021 private_key: "testkey.pem",
3022 }
3023 cc_library {
3024 name: "libfoo",
3025 shared_libs: ["libbar"],
3026 apex_available: ["myapex"],
3027 min_sdk_version: "29",
3028 }
3029 cc_library {
3030 name: "libbar",
3031 apex_available: ["myapex"],
3032 }
3033 `, withSAsActiveCodeNames)
3034}
3035
3036func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003037 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003038 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3039 variables.Platform_sdk_codename = proptools.StringPtr("S")
3040 variables.Platform_version_active_codenames = []string{"S", "T"}
3041 })
Colin Cross1c460562021-02-16 17:55:47 -08003042 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003043 apex {
3044 name: "myapex",
3045 key: "myapex.key",
3046 native_shared_libs: ["libfoo"],
3047 min_sdk_version: "S",
3048 }
3049 apex_key {
3050 name: "myapex.key",
3051 public_key: "testkey.avbpubkey",
3052 private_key: "testkey.pem",
3053 }
3054 cc_library {
3055 name: "libfoo",
3056 shared_libs: ["libbar"],
3057 apex_available: ["myapex"],
3058 min_sdk_version: "S",
3059 }
3060 cc_library {
3061 name: "libbar",
3062 stubs: {
3063 symbol_file: "libbar.map.txt",
3064 versions: ["30", "S", "T"],
3065 },
3066 }
3067 `, withSAsActiveCodeNames)
3068
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003069 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003070 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3071 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003072 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003073}
3074
Jiyong Park7c2ee712018-12-07 00:42:25 +09003075func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003076 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003077 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003078 apex {
3079 name: "myapex",
3080 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003081 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003082 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003083 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003084 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003086 }
3087
3088 apex_key {
3089 name: "myapex.key",
3090 public_key: "testkey.avbpubkey",
3091 private_key: "testkey.pem",
3092 }
3093
3094 prebuilt_etc {
3095 name: "myetc",
3096 src: "myprebuilt",
3097 sub_dir: "foo/bar",
3098 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003099
3100 cc_library {
3101 name: "mylib",
3102 srcs: ["mylib.cpp"],
3103 relative_install_path: "foo/bar",
3104 system_shared_libs: [],
3105 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003106 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003107 }
3108
3109 cc_binary {
3110 name: "mybin",
3111 srcs: ["mylib.cpp"],
3112 relative_install_path: "foo/bar",
3113 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003114 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003115 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003116 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003117
3118 rust_binary {
3119 name: "mybin.rust",
3120 srcs: ["foo.rs"],
3121 relative_install_path: "rust_subdir",
3122 apex_available: [ "myapex" ],
3123 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003124 `)
3125
Jooyung Hana0503a52023-08-23 13:12:50 +09003126 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003127 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003128
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003129 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003130 ensureContains(t, cmd, "/etc ")
3131 ensureContains(t, cmd, "/etc/foo ")
3132 ensureContains(t, cmd, "/etc/foo/bar ")
3133 ensureContains(t, cmd, "/lib64 ")
3134 ensureContains(t, cmd, "/lib64/foo ")
3135 ensureContains(t, cmd, "/lib64/foo/bar ")
3136 ensureContains(t, cmd, "/lib ")
3137 ensureContains(t, cmd, "/lib/foo ")
3138 ensureContains(t, cmd, "/lib/foo/bar ")
3139 ensureContains(t, cmd, "/bin ")
3140 ensureContains(t, cmd, "/bin/foo ")
3141 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003142 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003143}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003144
Jooyung Han35155c42020-02-06 17:33:20 +09003145func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003146 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003147 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003148 apex {
3149 name: "myapex",
3150 key: "myapex.key",
3151 multilib: {
3152 both: {
3153 native_shared_libs: ["mylib"],
3154 binaries: ["mybin"],
3155 },
3156 },
3157 compile_multilib: "both",
3158 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003160 }
3161
3162 apex_key {
3163 name: "myapex.key",
3164 public_key: "testkey.avbpubkey",
3165 private_key: "testkey.pem",
3166 }
3167
3168 cc_library {
3169 name: "mylib",
3170 relative_install_path: "foo/bar",
3171 system_shared_libs: [],
3172 stl: "none",
3173 apex_available: [ "myapex" ],
3174 native_bridge_supported: true,
3175 }
3176
3177 cc_binary {
3178 name: "mybin",
3179 relative_install_path: "foo/bar",
3180 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003181 stl: "none",
3182 apex_available: [ "myapex" ],
3183 native_bridge_supported: true,
3184 compile_multilib: "both", // default is "first" for binary
3185 multilib: {
3186 lib64: {
3187 suffix: "64",
3188 },
3189 },
3190 }
3191 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003192 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003193 "bin/foo/bar/mybin",
3194 "bin/foo/bar/mybin64",
3195 "bin/arm/foo/bar/mybin",
3196 "bin/arm64/foo/bar/mybin64",
3197 "lib/foo/bar/mylib.so",
3198 "lib/arm/foo/bar/mylib.so",
3199 "lib64/foo/bar/mylib.so",
3200 "lib64/arm64/foo/bar/mylib.so",
3201 })
3202}
3203
Jooyung Han85d61762020-06-24 23:50:26 +09003204func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003205 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003206 result := android.GroupFixturePreparers(
3207 prepareForApexTest,
3208 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3209 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003210 apex {
3211 name: "myapex",
3212 key: "myapex.key",
3213 binaries: ["mybin"],
3214 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003215 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003216 }
3217 apex_key {
3218 name: "myapex.key",
3219 public_key: "testkey.avbpubkey",
3220 private_key: "testkey.pem",
3221 }
3222 cc_binary {
3223 name: "mybin",
3224 vendor: true,
3225 shared_libs: ["libfoo"],
3226 }
3227 cc_library {
3228 name: "libfoo",
3229 proprietary: true,
3230 }
3231 `)
3232
Jooyung Hana0503a52023-08-23 13:12:50 +09003233 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003234 "bin/mybin",
3235 "lib64/libfoo.so",
3236 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3237 "lib64/libc++.so",
3238 })
3239
Jooyung Hana0503a52023-08-23 13:12:50 +09003240 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003241 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003242 name := apexBundle.BaseModuleName()
3243 prefix := "TARGET_"
3244 var builder strings.Builder
3245 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003246 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003247 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003248 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003249
Jooyung Hana0503a52023-08-23 13:12:50 +09003250 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003251 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3252 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003253}
3254
Justin Yun13decfb2021-03-08 19:25:55 +09003255func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003256 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003257 ctx := testApex(t, `
3258 apex {
3259 name: "myapex",
3260 key: "myapex.key",
3261 updatable: false,
3262 product_specific: true,
3263 binaries: ["foo"],
3264 }
3265
3266 apex_key {
3267 name: "myapex.key",
3268 public_key: "testkey.avbpubkey",
3269 private_key: "testkey.pem",
3270 }
3271
3272 cc_binary {
3273 name: "foo",
3274 product_available: true,
3275 apex_available: ["myapex"],
3276 srcs: ["foo.cpp"],
3277 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003278 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003279
3280 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003281 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003282 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3283 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3284 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3285 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3286}
3287
Jooyung Han8e5685d2020-09-21 11:02:57 +09003288func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003289 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003290 testCases := []struct {
3291 name string
3292 additionalProp string
3293 }{
3294 {"system apex with prebuilt_firmware", ""},
3295 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3296 }
3297 for _, tc := range testCases {
3298 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003299 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003300 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003301 apex {
3302 name: "myapex",
3303 key: "myapex.key",
3304 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003305 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003306 `+tc.additionalProp+`
3307 }
3308 apex_key {
3309 name: "myapex.key",
3310 public_key: "testkey.avbpubkey",
3311 private_key: "testkey.pem",
3312 }
3313 prebuilt_firmware {
3314 name: "myfirmware",
3315 src: "myfirmware.bin",
3316 filename_from_src: true,
3317 `+tc.additionalProp+`
3318 }
3319 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003320 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003321 "etc/firmware/myfirmware.bin",
3322 })
3323 })
3324 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003325}
3326
Jooyung Hanefb184e2020-06-25 17:14:25 +09003327func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003328 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003329 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003330 apex {
3331 name: "myapex",
3332 key: "myapex.key",
3333 vendor: true,
3334 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003335 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003336 }
3337
3338 apex_key {
3339 name: "myapex.key",
3340 public_key: "testkey.avbpubkey",
3341 private_key: "testkey.pem",
3342 }
3343
3344 cc_library {
3345 name: "mylib",
3346 vendor_available: true,
3347 }
3348 `)
3349
Jooyung Hana0503a52023-08-23 13:12:50 +09003350 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003351 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003352 name := apexBundle.BaseModuleName()
3353 prefix := "TARGET_"
3354 var builder strings.Builder
3355 data.Custom(&builder, name, prefix, "", data)
3356 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003357 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 +09003358}
3359
Jooyung Han2ed99d02020-06-24 23:26:26 +09003360func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003361 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003362 apex {
3363 name: "myapex",
3364 key: "myapex.key",
3365 vintf_fragments: ["fragment.xml"],
3366 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003367 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003368 }
3369 apex_key {
3370 name: "myapex.key",
3371 public_key: "testkey.avbpubkey",
3372 private_key: "testkey.pem",
3373 }
3374 cc_binary {
3375 name: "mybin",
3376 }
3377 `)
3378
Jooyung Hana0503a52023-08-23 13:12:50 +09003379 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003380 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003381 name := apexBundle.BaseModuleName()
3382 prefix := "TARGET_"
3383 var builder strings.Builder
3384 data.Custom(&builder, name, prefix, "", data)
3385 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003386 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003387 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003388}
3389
Jiyong Park16e91a02018-12-20 18:18:08 +09003390func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003391 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003392 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003393 apex {
3394 name: "myapex",
3395 key: "myapex.key",
3396 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003397 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003398 }
3399
3400 apex_key {
3401 name: "myapex.key",
3402 public_key: "testkey.avbpubkey",
3403 private_key: "testkey.pem",
3404 }
3405
3406 cc_library {
3407 name: "mylib",
3408 srcs: ["mylib.cpp"],
3409 system_shared_libs: [],
3410 stl: "none",
3411 stubs: {
3412 versions: ["1", "2", "3"],
3413 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003414 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003415 }
3416
3417 cc_binary {
3418 name: "not_in_apex",
3419 srcs: ["mylib.cpp"],
3420 static_libs: ["mylib"],
3421 static_executable: true,
3422 system_shared_libs: [],
3423 stl: "none",
3424 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003425 `)
3426
Colin Cross7113d202019-11-20 16:39:12 -08003427 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003428
3429 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003430 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003431}
Jiyong Park9335a262018-12-24 11:31:58 +09003432
3433func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003434 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003435 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003436 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003437 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003438 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003439 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003440 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003441 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003442 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003443 }
3444
3445 cc_library {
3446 name: "mylib",
3447 srcs: ["mylib.cpp"],
3448 system_shared_libs: [],
3449 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003450 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003451 }
3452
3453 apex_key {
3454 name: "myapex.key",
3455 public_key: "testkey.avbpubkey",
3456 private_key: "testkey.pem",
3457 }
3458
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003459 android_app_certificate {
3460 name: "myapex.certificate",
3461 certificate: "testkey",
3462 }
3463
3464 android_app_certificate {
3465 name: "myapex.certificate.override",
3466 certificate: "testkey.override",
3467 }
3468
Jiyong Park9335a262018-12-24 11:31:58 +09003469 `)
3470
3471 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003472 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003473
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003474 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3475 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003476 "vendor/foo/devkeys/testkey.avbpubkey")
3477 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003478 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3479 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003480 "vendor/foo/devkeys/testkey.pem")
3481 }
3482
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003483 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003484 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003485 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003486 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003487 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003488 }
3489}
Jiyong Park58e364a2019-01-19 19:24:06 +09003490
Jooyung Hanf121a652019-12-17 14:30:11 +09003491func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003492 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003493 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003494 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003495 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003496 apex {
3497 name: "myapex",
3498 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003499 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003500 }
3501 apex_key {
3502 name: "myapex.key",
3503 public_key: "testkey.avbpubkey",
3504 private_key: "testkey.pem",
3505 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003506 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003507 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3508 if actual := rule.Args["certificates"]; actual != expected {
3509 t.Errorf("certificates should be %q, not %q", expected, actual)
3510 }
3511 })
3512 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003513 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003514 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003515 apex {
3516 name: "myapex_keytest",
3517 key: "myapex.key",
3518 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003519 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003520 }
3521 apex_key {
3522 name: "myapex.key",
3523 public_key: "testkey.avbpubkey",
3524 private_key: "testkey.pem",
3525 }
3526 android_app_certificate {
3527 name: "myapex.certificate.override",
3528 certificate: "testkey.override",
3529 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003530 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003531 expected := "testkey.override.x509.pem testkey.override.pk8"
3532 if actual := rule.Args["certificates"]; actual != expected {
3533 t.Errorf("certificates should be %q, not %q", expected, actual)
3534 }
3535 })
3536 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003537 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003538 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003539 apex {
3540 name: "myapex",
3541 key: "myapex.key",
3542 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003543 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003544 }
3545 apex_key {
3546 name: "myapex.key",
3547 public_key: "testkey.avbpubkey",
3548 private_key: "testkey.pem",
3549 }
3550 android_app_certificate {
3551 name: "myapex.certificate",
3552 certificate: "testkey",
3553 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003554 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003555 expected := "testkey.x509.pem testkey.pk8"
3556 if actual := rule.Args["certificates"]; actual != expected {
3557 t.Errorf("certificates should be %q, not %q", expected, actual)
3558 }
3559 })
3560 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003561 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003562 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003563 apex {
3564 name: "myapex_keytest",
3565 key: "myapex.key",
3566 file_contexts: ":myapex-file_contexts",
3567 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003568 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003569 }
3570 apex_key {
3571 name: "myapex.key",
3572 public_key: "testkey.avbpubkey",
3573 private_key: "testkey.pem",
3574 }
3575 android_app_certificate {
3576 name: "myapex.certificate.override",
3577 certificate: "testkey.override",
3578 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003579 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003580 expected := "testkey.override.x509.pem testkey.override.pk8"
3581 if actual := rule.Args["certificates"]; actual != expected {
3582 t.Errorf("certificates should be %q, not %q", expected, actual)
3583 }
3584 })
3585 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003586 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003587 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003588 apex {
3589 name: "myapex",
3590 key: "myapex.key",
3591 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003592 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003593 }
3594 apex_key {
3595 name: "myapex.key",
3596 public_key: "testkey.avbpubkey",
3597 private_key: "testkey.pem",
3598 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003599 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003600 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3601 if actual := rule.Args["certificates"]; actual != expected {
3602 t.Errorf("certificates should be %q, not %q", expected, actual)
3603 }
3604 })
3605 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003606 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003607 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003608 apex {
3609 name: "myapex_keytest",
3610 key: "myapex.key",
3611 file_contexts: ":myapex-file_contexts",
3612 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003613 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003614 }
3615 apex_key {
3616 name: "myapex.key",
3617 public_key: "testkey.avbpubkey",
3618 private_key: "testkey.pem",
3619 }
3620 android_app_certificate {
3621 name: "myapex.certificate.override",
3622 certificate: "testkey.override",
3623 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003624 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003625 expected := "testkey.override.x509.pem testkey.override.pk8"
3626 if actual := rule.Args["certificates"]; actual != expected {
3627 t.Errorf("certificates should be %q, not %q", expected, actual)
3628 }
3629 })
3630}
3631
Jiyong Park58e364a2019-01-19 19:24:06 +09003632func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003633 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003634 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003635 apex {
3636 name: "myapex",
3637 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003638 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003639 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003640 }
3641
3642 apex {
3643 name: "otherapex",
3644 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003645 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003646 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003647 }
3648
3649 apex_key {
3650 name: "myapex.key",
3651 public_key: "testkey.avbpubkey",
3652 private_key: "testkey.pem",
3653 }
3654
3655 cc_library {
3656 name: "mylib",
3657 srcs: ["mylib.cpp"],
3658 system_shared_libs: [],
3659 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003660 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003661 "myapex",
3662 "otherapex",
3663 ],
Jooyung Han24282772020-03-21 23:20:55 +09003664 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003665 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003666 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003667 cc_library {
3668 name: "mylib2",
3669 srcs: ["mylib.cpp"],
3670 system_shared_libs: [],
3671 stl: "none",
3672 apex_available: [
3673 "myapex",
3674 "otherapex",
3675 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003676 static_libs: ["mylib3"],
3677 recovery_available: true,
3678 min_sdk_version: "29",
3679 }
3680 cc_library {
3681 name: "mylib3",
3682 srcs: ["mylib.cpp"],
3683 system_shared_libs: [],
3684 stl: "none",
3685 apex_available: [
3686 "myapex",
3687 "otherapex",
3688 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003689 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003690 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003692 `)
3693
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003695 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003696 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003697
Vinh Tranf9754732023-01-19 22:41:46 -05003698 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003699 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003700 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003701
Vinh Tranf9754732023-01-19 22:41:46 -05003702 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003703 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003704 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003705
Colin Crossaede88c2020-08-11 12:17:01 -07003706 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3707 // each variant defines additional macros to distinguish which apex variant it is built for
3708
3709 // non-APEX variant does not have __ANDROID_APEX__ defined
3710 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3711 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3712
Vinh Tranf9754732023-01-19 22:41:46 -05003713 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003714 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3715 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003716
Jooyung Hanc87a0592020-03-02 17:44:33 +09003717 // non-APEX variant does not have __ANDROID_APEX__ defined
3718 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3719 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3720
Vinh Tranf9754732023-01-19 22:41:46 -05003721 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003722 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003723 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003724}
Jiyong Park7e636d02019-01-28 16:16:54 +09003725
3726func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003727 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003728 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003729 apex {
3730 name: "myapex",
3731 key: "myapex.key",
3732 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003733 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003734 }
3735
3736 apex_key {
3737 name: "myapex.key",
3738 public_key: "testkey.avbpubkey",
3739 private_key: "testkey.pem",
3740 }
3741
3742 cc_library_headers {
3743 name: "mylib_headers",
3744 export_include_dirs: ["my_include"],
3745 system_shared_libs: [],
3746 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003747 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003748 }
3749
3750 cc_library {
3751 name: "mylib",
3752 srcs: ["mylib.cpp"],
3753 system_shared_libs: [],
3754 stl: "none",
3755 header_libs: ["mylib_headers"],
3756 export_header_lib_headers: ["mylib_headers"],
3757 stubs: {
3758 versions: ["1", "2", "3"],
3759 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003760 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003761 }
3762
3763 cc_library {
3764 name: "otherlib",
3765 srcs: ["mylib.cpp"],
3766 system_shared_libs: [],
3767 stl: "none",
3768 shared_libs: ["mylib"],
3769 }
3770 `)
3771
Colin Cross7113d202019-11-20 16:39:12 -08003772 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003773
3774 // Ensure that the include path of the header lib is exported to 'otherlib'
3775 ensureContains(t, cFlags, "-Imy_include")
3776}
Alex Light9670d332019-01-29 18:07:33 -08003777
Jiyong Park7cd10e32020-01-14 09:22:18 +09003778type fileInApex struct {
3779 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003780 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003781 isLink bool
3782}
3783
Jooyung Han1724d582022-12-21 10:17:44 +09003784func (f fileInApex) String() string {
3785 return f.src + ":" + f.path
3786}
3787
3788func (f fileInApex) match(expectation string) bool {
3789 parts := strings.Split(expectation, ":")
3790 if len(parts) == 1 {
3791 match, _ := path.Match(parts[0], f.path)
3792 return match
3793 }
3794 if len(parts) == 2 {
3795 matchSrc, _ := path.Match(parts[0], f.src)
3796 matchDst, _ := path.Match(parts[1], f.path)
3797 return matchSrc && matchDst
3798 }
3799 panic("invalid expected file specification: " + expectation)
3800}
3801
Jooyung Hana57af4a2020-01-23 05:36:59 +00003802func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003804 module := ctx.ModuleForTests(moduleName, variant)
3805 apexRule := module.MaybeRule("apexRule")
3806 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003808 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003809 for _, cmd := range strings.Split(copyCmds, "&&") {
3810 cmd = strings.TrimSpace(cmd)
3811 if cmd == "" {
3812 continue
3813 }
3814 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003815 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003816 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 switch terms[0] {
3818 case "mkdir":
3819 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003820 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003821 t.Fatal("copyCmds contains invalid cp command", cmd)
3822 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003823 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003824 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003825 isLink = false
3826 case "ln":
3827 if len(terms) != 3 && len(terms) != 4 {
3828 // ln LINK TARGET or ln -s LINK TARGET
3829 t.Fatal("copyCmds contains invalid ln command", cmd)
3830 }
3831 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003832 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003833 isLink = true
3834 default:
3835 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3836 }
3837 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003838 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003840 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 }
Jooyung Han1724d582022-12-21 10:17:44 +09003842 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003843 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 }
3845 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003846 return ret
3847}
3848
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003849func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003850 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003851 var failed bool
3852 var surplus []string
3853 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003854 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003855 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003856 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003857 if file.match(expected) {
3858 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003859 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003860 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003861 }
3862 }
Jooyung Han1724d582022-12-21 10:17:44 +09003863 if !matchFound {
3864 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003865 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003866 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003867
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003870 t.Log("surplus files", surplus)
3871 failed = true
3872 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003873
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003874 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003875 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003876 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003877 if !filesMatched[expected] {
3878 missing = append(missing, expected)
3879 }
3880 }
3881 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 t.Log("missing files", missing)
3883 failed = true
3884 }
3885 if failed {
3886 t.Fail()
3887 }
3888}
3889
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003890func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3891 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3892}
3893
3894func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003895 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003896 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3897 if deapexer.Output != nil {
3898 outputs = append(outputs, deapexer.Output.String())
3899 }
3900 for _, output := range deapexer.ImplicitOutputs {
3901 outputs = append(outputs, output.String())
3902 }
3903 actualFiles := make([]fileInApex, 0, len(outputs))
3904 for _, output := range outputs {
3905 dir := "/deapexer/"
3906 pos := strings.LastIndex(output, dir)
3907 if pos == -1 {
3908 t.Fatal("Unknown deapexer output ", output)
3909 }
3910 path := output[pos+len(dir):]
3911 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3912 }
3913 assertFileListEquals(t, files, actualFiles)
3914}
3915
Jooyung Han39edb6c2019-11-06 16:53:07 +09003916func vndkLibrariesTxtFiles(vers ...string) (result string) {
3917 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003918 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003919 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003920 prebuilt_etc {
3921 name: "` + txt + `.libraries.` + v + `.txt",
3922 src: "dummy.txt",
3923 }
3924 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003925 }
3926 }
3927 return
3928}
3929
Jooyung Han344d5432019-08-23 11:17:39 +09003930func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003931 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003932 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003933 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003934 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003935 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003936 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003937 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003938 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003939 }
3940
3941 apex_key {
3942 name: "myapex.key",
3943 public_key: "testkey.avbpubkey",
3944 private_key: "testkey.pem",
3945 }
3946
Jooyung Han31c470b2019-10-18 16:26:59 +09003947 vndk_prebuilt_shared {
3948 name: "libvndk27",
3949 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003950 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003951 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003952 vndk: {
3953 enabled: true,
3954 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003955 target_arch: "arm64",
3956 arch: {
3957 arm: {
3958 srcs: ["libvndk27_arm.so"],
3959 },
3960 arm64: {
3961 srcs: ["libvndk27_arm64.so"],
3962 },
3963 },
Colin Cross2807f002021-03-02 10:15:29 -08003964 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003965 }
3966
3967 vndk_prebuilt_shared {
3968 name: "libvndk27",
3969 version: "27",
3970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003971 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003972 vndk: {
3973 enabled: true,
3974 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 target_arch: "x86_64",
3976 arch: {
3977 x86: {
3978 srcs: ["libvndk27_x86.so"],
3979 },
3980 x86_64: {
3981 srcs: ["libvndk27_x86_64.so"],
3982 },
3983 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003984 }
3985 `+vndkLibrariesTxtFiles("27"),
3986 withFiles(map[string][]byte{
3987 "libvndk27_arm.so": nil,
3988 "libvndk27_arm64.so": nil,
3989 "libvndk27_x86.so": nil,
3990 "libvndk27_x86_64.so": nil,
3991 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003992
Jooyung Hana0503a52023-08-23 13:12:50 +09003993 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003994 "lib/libvndk27_arm.so",
3995 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003996 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003997 })
Jooyung Han344d5432019-08-23 11:17:39 +09003998}
3999
Jooyung Han90eee022019-10-01 20:02:42 +09004000func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004001 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004002 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004003 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004004 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004005 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004006 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004007 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004008 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004009 }
4010 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004011 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004012 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004014 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004016 }
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004021 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004022
4023 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004024 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004025 apexManifestRule := module.Rule("apexManifestRule")
4026 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004027 }
4028
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004029 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004030 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004031}
4032
Jooyung Han344d5432019-08-23 11:17:39 +09004033func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004034 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004035 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004036 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004037 name: "com.android.vndk.v30",
4038 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004039 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004040 native_bridge_supported: true,
4041 }
4042
4043 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004044 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004045 public_key: "testkey.avbpubkey",
4046 private_key: "testkey.pem",
4047 }
4048
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004049 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004050 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004051 version: "30",
4052 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004053 srcs: ["mylib.cpp"],
4054 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004055 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004056 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004057 vndk: {
4058 enabled: true,
4059 },
Jooyung Han344d5432019-08-23 11:17:39 +09004060 }
4061 `)
4062}
4063
Jooyung Han31c470b2019-10-18 16:26:59 +09004064func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004065 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004066 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004067 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004068 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004069 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004070 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004071 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004072 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004073 }
4074
4075 apex_key {
4076 name: "myapex.key",
4077 public_key: "testkey.avbpubkey",
4078 private_key: "testkey.pem",
4079 }
4080
4081 vndk_prebuilt_shared {
4082 name: "libvndk27",
4083 version: "27",
4084 target_arch: "arm",
4085 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004086 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 vndk: {
4088 enabled: true,
4089 },
4090 arch: {
4091 arm: {
4092 srcs: ["libvndk27.so"],
4093 }
4094 },
4095 }
4096
4097 vndk_prebuilt_shared {
4098 name: "libvndk27",
4099 version: "27",
4100 target_arch: "arm",
4101 binder32bit: true,
4102 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004103 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004104 vndk: {
4105 enabled: true,
4106 },
4107 arch: {
4108 arm: {
4109 srcs: ["libvndk27binder32.so"],
4110 }
4111 },
Colin Cross2807f002021-03-02 10:15:29 -08004112 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004113 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004114 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004115 withFiles(map[string][]byte{
4116 "libvndk27.so": nil,
4117 "libvndk27binder32.so": nil,
4118 }),
4119 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004120 android.FixtureModifyConfig(func(config android.Config) {
4121 target := android.Target{
4122 Os: android.Android,
4123 Arch: android.Arch{
4124 ArchType: android.Arm,
4125 ArchVariant: "armv7-a-neon",
4126 Abi: []string{"armeabi-v7a"},
4127 },
4128 NativeBridge: android.NativeBridgeDisabled,
4129 NativeBridgeHostArchName: "",
4130 NativeBridgeRelativePath: "",
4131 }
4132 config.Targets[android.Android] = []android.Target{target}
4133 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 }),
4135 )
4136
Jooyung Hana0503a52023-08-23 13:12:50 +09004137 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004138 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004139 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004140 })
4141}
4142
Jooyung Hane1633032019-08-01 17:41:43 +09004143func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004144 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004145 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004146 apex {
4147 name: "myapex_nodep",
4148 key: "myapex.key",
4149 native_shared_libs: ["lib_nodep"],
4150 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004151 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004152 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004153 }
4154
4155 apex {
4156 name: "myapex_dep",
4157 key: "myapex.key",
4158 native_shared_libs: ["lib_dep"],
4159 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004160 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004161 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004162 }
4163
4164 apex {
4165 name: "myapex_provider",
4166 key: "myapex.key",
4167 native_shared_libs: ["libfoo"],
4168 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004169 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004170 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004171 }
4172
4173 apex {
4174 name: "myapex_selfcontained",
4175 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004176 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004177 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004178 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004179 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004180 }
4181
4182 apex_key {
4183 name: "myapex.key",
4184 public_key: "testkey.avbpubkey",
4185 private_key: "testkey.pem",
4186 }
4187
4188 cc_library {
4189 name: "lib_nodep",
4190 srcs: ["mylib.cpp"],
4191 system_shared_libs: [],
4192 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004193 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004194 }
4195
4196 cc_library {
4197 name: "lib_dep",
4198 srcs: ["mylib.cpp"],
4199 shared_libs: ["libfoo"],
4200 system_shared_libs: [],
4201 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004202 apex_available: [
4203 "myapex_dep",
4204 "myapex_provider",
4205 "myapex_selfcontained",
4206 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004207 }
4208
4209 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004210 name: "lib_dep_on_bar",
4211 srcs: ["mylib.cpp"],
4212 shared_libs: ["libbar"],
4213 system_shared_libs: [],
4214 stl: "none",
4215 apex_available: [
4216 "myapex_selfcontained",
4217 ],
4218 }
4219
4220
4221 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004222 name: "libfoo",
4223 srcs: ["mytest.cpp"],
4224 stubs: {
4225 versions: ["1"],
4226 },
4227 system_shared_libs: [],
4228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004229 apex_available: [
4230 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004231 ],
4232 }
4233
4234 cc_library {
4235 name: "libbar",
4236 srcs: ["mytest.cpp"],
4237 stubs: {
4238 versions: ["1"],
4239 },
4240 system_shared_libs: [],
4241 stl: "none",
4242 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004243 "myapex_selfcontained",
4244 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004245 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004246
Jooyung Hane1633032019-08-01 17:41:43 +09004247 `)
4248
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004249 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004250 var provideNativeLibs, requireNativeLibs []string
4251
Jooyung Hana0503a52023-08-23 13:12:50 +09004252 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004253 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4254 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004255 ensureListEmpty(t, provideNativeLibs)
4256 ensureListEmpty(t, requireNativeLibs)
4257
Jooyung Hana0503a52023-08-23 13:12:50 +09004258 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4260 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004261 ensureListEmpty(t, provideNativeLibs)
4262 ensureListContains(t, requireNativeLibs, "libfoo.so")
4263
Jooyung Hana0503a52023-08-23 13:12:50 +09004264 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004265 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4266 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004267 ensureListContains(t, provideNativeLibs, "libfoo.so")
4268 ensureListEmpty(t, requireNativeLibs)
4269
Jooyung Hana0503a52023-08-23 13:12:50 +09004270 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004271 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4272 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004273 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004274 ensureListEmpty(t, requireNativeLibs)
4275}
4276
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004277func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004278 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004279 ctx := testApex(t, `
4280 apex {
4281 name: "myapex",
4282 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004283 native_shared_libs: ["mylib"],
4284 updatable: false,
4285 }
4286
4287 apex_key {
4288 name: "myapex.key",
4289 public_key: "testkey.avbpubkey",
4290 private_key: "testkey.pem",
4291 }
4292
4293 cc_library {
4294 name: "mylib",
4295 srcs: ["mylib.cpp"],
4296 system_shared_libs: [],
4297 stl: "none",
4298 apex_available: [
4299 "//apex_available:platform",
4300 "myapex",
4301 ],
4302 }
4303 `, android.FixtureMergeEnv(map[string]string{
4304 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4305 }))
4306
Jooyung Hana0503a52023-08-23 13:12:50 +09004307 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004308 apexManifestRule := module.Rule("apexManifestRule")
4309 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4310}
4311
Vinh Tran8f5310f2022-10-07 18:16:47 -04004312func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004313 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004314 testCases := []struct {
4315 compileMultiLibProp string
4316 containedLibs []string
4317 notContainedLibs []string
4318 }{
4319 {
4320 containedLibs: []string{
4321 "image.apex/lib64/mylib.so",
4322 "image.apex/lib/mylib.so",
4323 },
4324 compileMultiLibProp: `compile_multilib: "both",`,
4325 },
4326 {
4327 containedLibs: []string{"image.apex/lib64/mylib.so"},
4328 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4329 compileMultiLibProp: `compile_multilib: "first",`,
4330 },
4331 {
4332 containedLibs: []string{"image.apex/lib64/mylib.so"},
4333 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4334 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4335 },
4336 {
4337 containedLibs: []string{"image.apex/lib64/mylib.so"},
4338 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4339 compileMultiLibProp: `compile_multilib: "64",`,
4340 },
4341 {
4342 containedLibs: []string{"image.apex/lib/mylib.so"},
4343 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4344 compileMultiLibProp: `compile_multilib: "32",`,
4345 },
4346 }
4347 for _, testCase := range testCases {
4348 ctx := testApex(t, fmt.Sprintf(`
4349 apex {
4350 name: "myapex",
4351 key: "myapex.key",
4352 %s
4353 native_shared_libs: ["mylib"],
4354 updatable: false,
4355 }
4356 apex_key {
4357 name: "myapex.key",
4358 public_key: "testkey.avbpubkey",
4359 private_key: "testkey.pem",
4360 }
4361 cc_library {
4362 name: "mylib",
4363 srcs: ["mylib.cpp"],
4364 apex_available: [
4365 "//apex_available:platform",
4366 "myapex",
4367 ],
4368 }
4369 `, testCase.compileMultiLibProp),
4370 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004371 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004372 apexRule := module.Rule("apexRule")
4373 copyCmds := apexRule.Args["copy_commands"]
4374 for _, containedLib := range testCase.containedLibs {
4375 ensureContains(t, copyCmds, containedLib)
4376 }
4377 for _, notContainedLib := range testCase.notContainedLibs {
4378 ensureNotContains(t, copyCmds, notContainedLib)
4379 }
4380 }
4381}
4382
Alex Light0851b882019-02-07 13:20:53 -08004383func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004384 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004385 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004386 apex {
4387 name: "myapex",
4388 key: "myapex.key",
4389 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004390 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004391 }
4392
4393 apex_key {
4394 name: "myapex.key",
4395 public_key: "testkey.avbpubkey",
4396 private_key: "testkey.pem",
4397 }
4398
4399 cc_library {
4400 name: "mylib_common",
4401 srcs: ["mylib.cpp"],
4402 system_shared_libs: [],
4403 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004404 apex_available: [
4405 "//apex_available:platform",
4406 "myapex",
4407 ],
Alex Light0851b882019-02-07 13:20:53 -08004408 }
4409 `)
4410
Jooyung Hana0503a52023-08-23 13:12:50 +09004411 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004412 apexRule := module.Rule("apexRule")
4413 copyCmds := apexRule.Args["copy_commands"]
4414
4415 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4416 t.Log("Apex was a test apex!")
4417 t.Fail()
4418 }
4419 // Ensure that main rule creates an output
4420 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4421
4422 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004423 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004424
4425 // Ensure that both direct and indirect deps are copied into apex
4426 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4427
Colin Cross7113d202019-11-20 16:39:12 -08004428 // Ensure that the platform variant ends with _shared
4429 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004430
Colin Cross56a83212020-09-15 18:30:11 -07004431 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004432 t.Log("Found mylib_common not in any apex!")
4433 t.Fail()
4434 }
4435}
4436
4437func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004438 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004439 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004440 apex_test {
4441 name: "myapex",
4442 key: "myapex.key",
4443 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004444 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004445 }
4446
4447 apex_key {
4448 name: "myapex.key",
4449 public_key: "testkey.avbpubkey",
4450 private_key: "testkey.pem",
4451 }
4452
4453 cc_library {
4454 name: "mylib_common_test",
4455 srcs: ["mylib.cpp"],
4456 system_shared_libs: [],
4457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004458 // TODO: remove //apex_available:platform
4459 apex_available: [
4460 "//apex_available:platform",
4461 "myapex",
4462 ],
Alex Light0851b882019-02-07 13:20:53 -08004463 }
4464 `)
4465
Jooyung Hana0503a52023-08-23 13:12:50 +09004466 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004467 apexRule := module.Rule("apexRule")
4468 copyCmds := apexRule.Args["copy_commands"]
4469
4470 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4471 t.Log("Apex was not a test apex!")
4472 t.Fail()
4473 }
4474 // Ensure that main rule creates an output
4475 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4476
4477 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004479
4480 // Ensure that both direct and indirect deps are copied into apex
4481 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4482
Colin Cross7113d202019-11-20 16:39:12 -08004483 // Ensure that the platform variant ends with _shared
4484 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004485}
4486
Jooyung Han85707de2023-12-01 14:21:13 +09004487func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004488 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004489 ctx := testApex(t, `
4490 apex {
4491 name: "myapex",
4492 key: "myapex.key",
4493 updatable: false,
4494 binaries: ["mybin"],
4495 }
4496 apex {
4497 name: "myvendorapex",
4498 key: "myapex.key",
4499 file_contexts: "myvendorapex_file_contexts",
4500 vendor: true,
4501 updatable: false,
4502 binaries: ["mybin"],
4503 }
4504 apex_key {
4505 name: "myapex.key",
4506 public_key: "testkey.avbpubkey",
4507 private_key: "testkey.pem",
4508 }
4509 cc_binary {
4510 name: "mybin",
4511 vendor_available: true,
4512 system_shared_libs: [],
4513 stl: "none",
4514 shared_libs: ["libz"],
4515 apex_available: ["//apex_available:anyapex"],
4516 }
4517 cc_library {
4518 name: "libz",
4519 vendor_available: true,
4520 system_shared_libs: [],
4521 stl: "none",
4522 stubs: {
4523 versions: ["28", "30"],
4524 },
4525 target: {
4526 vendor: {
4527 no_stubs: true,
4528 },
4529 },
4530 }
4531 `, withFiles(map[string][]byte{
4532 "myvendorapex_file_contexts": nil,
4533 }))
4534
4535 // libz provides stubs for core variant.
4536 {
4537 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4538 "bin/mybin",
4539 })
4540 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4541 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4542 }
4543 // libz doesn't provide stubs for vendor variant.
4544 {
4545 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4546 "bin/mybin",
4547 "lib64/libz.so",
4548 })
4549 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4550 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4551 }
4552}
4553
Alex Light9670d332019-01-29 18:07:33 -08004554func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004555 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004556 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004557 apex {
4558 name: "myapex",
4559 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004560 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004561 multilib: {
4562 first: {
4563 native_shared_libs: ["mylib_common"],
4564 }
4565 },
4566 target: {
4567 android: {
4568 multilib: {
4569 first: {
4570 native_shared_libs: ["mylib"],
4571 }
4572 }
4573 },
4574 host: {
4575 multilib: {
4576 first: {
4577 native_shared_libs: ["mylib2"],
4578 }
4579 }
4580 }
4581 }
4582 }
4583
4584 apex_key {
4585 name: "myapex.key",
4586 public_key: "testkey.avbpubkey",
4587 private_key: "testkey.pem",
4588 }
4589
4590 cc_library {
4591 name: "mylib",
4592 srcs: ["mylib.cpp"],
4593 system_shared_libs: [],
4594 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004595 // TODO: remove //apex_available:platform
4596 apex_available: [
4597 "//apex_available:platform",
4598 "myapex",
4599 ],
Alex Light9670d332019-01-29 18:07:33 -08004600 }
4601
4602 cc_library {
4603 name: "mylib_common",
4604 srcs: ["mylib.cpp"],
4605 system_shared_libs: [],
4606 stl: "none",
4607 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004608 // TODO: remove //apex_available:platform
4609 apex_available: [
4610 "//apex_available:platform",
4611 "myapex",
4612 ],
Alex Light9670d332019-01-29 18:07:33 -08004613 }
4614
4615 cc_library {
4616 name: "mylib2",
4617 srcs: ["mylib.cpp"],
4618 system_shared_libs: [],
4619 stl: "none",
4620 compile_multilib: "first",
4621 }
4622 `)
4623
Jooyung Hana0503a52023-08-23 13:12:50 +09004624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004625 copyCmds := apexRule.Args["copy_commands"]
4626
4627 // Ensure that main rule creates an output
4628 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4629
4630 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004631 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4632 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4633 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004634
4635 // Ensure that both direct and indirect deps are copied into apex
4636 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4637 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4638 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4639
Colin Cross7113d202019-11-20 16:39:12 -08004640 // Ensure that the platform variant ends with _shared
4641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4643 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004644}
Jiyong Park04480cf2019-02-06 00:16:29 +09004645
Jiyong Park59140302020-12-14 18:44:04 +09004646func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004647 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004648 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004649 apex {
4650 name: "myapex",
4651 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004652 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004653 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004654 arch: {
4655 arm64: {
4656 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004657 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004658 },
4659 x86_64: {
4660 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004661 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004662 },
4663 }
4664 }
4665
4666 apex_key {
4667 name: "myapex.key",
4668 public_key: "testkey.avbpubkey",
4669 private_key: "testkey.pem",
4670 }
4671
4672 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004673 name: "mylib.generic",
4674 srcs: ["mylib.cpp"],
4675 system_shared_libs: [],
4676 stl: "none",
4677 // TODO: remove //apex_available:platform
4678 apex_available: [
4679 "//apex_available:platform",
4680 "myapex",
4681 ],
4682 }
4683
4684 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004685 name: "mylib.arm64",
4686 srcs: ["mylib.cpp"],
4687 system_shared_libs: [],
4688 stl: "none",
4689 // TODO: remove //apex_available:platform
4690 apex_available: [
4691 "//apex_available:platform",
4692 "myapex",
4693 ],
4694 }
4695
4696 cc_library {
4697 name: "mylib.x64",
4698 srcs: ["mylib.cpp"],
4699 system_shared_libs: [],
4700 stl: "none",
4701 // TODO: remove //apex_available:platform
4702 apex_available: [
4703 "//apex_available:platform",
4704 "myapex",
4705 ],
4706 }
4707 `)
4708
Jooyung Hana0503a52023-08-23 13:12:50 +09004709 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004710 copyCmds := apexRule.Args["copy_commands"]
4711
4712 // Ensure that apex variant is created for the direct dep
4713 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004714 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004715 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4716
4717 // Ensure that both direct and indirect deps are copied into apex
4718 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4719 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4720}
4721
Jiyong Park04480cf2019-02-06 00:16:29 +09004722func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004723 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004724 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004725 apex {
4726 name: "myapex",
4727 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004728 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004729 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004730 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004731 }
4732
4733 apex_key {
4734 name: "myapex.key",
4735 public_key: "testkey.avbpubkey",
4736 private_key: "testkey.pem",
4737 }
4738
4739 sh_binary {
4740 name: "myscript",
4741 src: "mylib.cpp",
4742 filename: "myscript.sh",
4743 sub_dir: "script",
4744 }
4745 `)
4746
Jooyung Hana0503a52023-08-23 13:12:50 +09004747 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004748 copyCmds := apexRule.Args["copy_commands"]
4749
4750 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4751}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004752
Jooyung Han91df2082019-11-20 01:49:42 +09004753func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004754 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004755 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004756 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004757 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004758 {"", "system"},
4759 {"product_specific: true", "product"},
4760 {"soc_specific: true", "vendor"},
4761 {"proprietary: true", "vendor"},
4762 {"vendor: true", "vendor"},
4763 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004764 }
4765 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004766 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004767 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004768 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004769 apex {
4770 name: "myapex",
4771 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004772 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004773 `+tc.propName+`
4774 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004775
Jooyung Han91df2082019-11-20 01:49:42 +09004776 apex_key {
4777 name: "myapex.key",
4778 public_key: "testkey.avbpubkey",
4779 private_key: "testkey.pem",
4780 }
4781 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004782
Jooyung Hana0503a52023-08-23 13:12:50 +09004783 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004784 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004785 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004786 if actual != expected {
4787 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4788 }
Jooyung Han91df2082019-11-20 01:49:42 +09004789 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004790 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004791}
Jiyong Park67882562019-03-21 01:11:21 +09004792
Jooyung Han580eb4f2020-06-24 19:33:06 +09004793func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004794 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004795 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004796 apex {
4797 name: "myapex",
4798 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004799 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801
Jooyung Han580eb4f2020-06-24 19:33:06 +09004802 apex_key {
4803 name: "myapex.key",
4804 public_key: "testkey.avbpubkey",
4805 private_key: "testkey.pem",
4806 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004807 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004808 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004809 rule := module.Output("file_contexts")
4810 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4811}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812
Jooyung Han580eb4f2020-06-24 19:33:06 +09004813func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004814 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004815 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816 apex {
4817 name: "myapex",
4818 key: "myapex.key",
4819 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004820 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823 apex_key {
4824 name: "myapex.key",
4825 public_key: "testkey.avbpubkey",
4826 private_key: "testkey.pem",
4827 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004828 `, withFiles(map[string][]byte{
4829 "my_own_file_contexts": nil,
4830 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004831}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004832
Jooyung Han580eb4f2020-06-24 19:33:06 +09004833func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004834 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004835 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004836 apex {
4837 name: "myapex",
4838 key: "myapex.key",
4839 product_specific: true,
4840 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004841 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004842 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004843
Jooyung Han580eb4f2020-06-24 19:33:06 +09004844 apex_key {
4845 name: "myapex.key",
4846 public_key: "testkey.avbpubkey",
4847 private_key: "testkey.pem",
4848 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004849 `)
4850
Colin Cross1c460562021-02-16 17:55:47 -08004851 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 apex {
4853 name: "myapex",
4854 key: "myapex.key",
4855 product_specific: true,
4856 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004857 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859
Jooyung Han580eb4f2020-06-24 19:33:06 +09004860 apex_key {
4861 name: "myapex.key",
4862 public_key: "testkey.avbpubkey",
4863 private_key: "testkey.pem",
4864 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004865 `, withFiles(map[string][]byte{
4866 "product_specific_file_contexts": nil,
4867 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004868 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004869 rule := module.Output("file_contexts")
4870 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4871}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004872
Jooyung Han580eb4f2020-06-24 19:33:06 +09004873func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004874 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004875 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004876 apex {
4877 name: "myapex",
4878 key: "myapex.key",
4879 product_specific: true,
4880 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004881 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004882 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004883
Jooyung Han580eb4f2020-06-24 19:33:06 +09004884 apex_key {
4885 name: "myapex.key",
4886 public_key: "testkey.avbpubkey",
4887 private_key: "testkey.pem",
4888 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004889
Jooyung Han580eb4f2020-06-24 19:33:06 +09004890 filegroup {
4891 name: "my-file-contexts",
4892 srcs: ["product_specific_file_contexts"],
4893 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004894 `, withFiles(map[string][]byte{
4895 "product_specific_file_contexts": nil,
4896 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004897 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004898 rule := module.Output("file_contexts")
4899 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004900}
4901
Jiyong Park67882562019-03-21 01:11:21 +09004902func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004903 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004904 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004905 apex_key {
4906 name: "myapex.key",
4907 public_key: ":my.avbpubkey",
4908 private_key: ":my.pem",
4909 product_specific: true,
4910 }
4911
4912 filegroup {
4913 name: "my.avbpubkey",
4914 srcs: ["testkey2.avbpubkey"],
4915 }
4916
4917 filegroup {
4918 name: "my.pem",
4919 srcs: ["testkey2.pem"],
4920 }
4921 `)
4922
4923 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4924 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004925 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004926 if actual_pubkey != expected_pubkey {
4927 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4928 }
4929 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004930 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004931 if actual_privkey != expected_privkey {
4932 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4933 }
4934}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004935
4936func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004937 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004938 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939 prebuilt_apex {
4940 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004941 arch: {
4942 arm64: {
4943 src: "myapex-arm64.apex",
4944 },
4945 arm: {
4946 src: "myapex-arm.apex",
4947 },
4948 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004949 }
4950 `)
4951
Wei Li340ee8e2022-03-18 17:33:24 -07004952 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4953 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004954
Jiyong Parkc95714e2019-03-29 14:23:10 +09004955 expectedInput := "myapex-arm64.apex"
4956 if prebuilt.inputApex.String() != expectedInput {
4957 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4958 }
Wei Li340ee8e2022-03-18 17:33:24 -07004959 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4960 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4961 rule := testingModule.Rule("genProvenanceMetaData")
4962 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4963 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4964 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4965 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004966
4967 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4968 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004969}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004970
Paul Duffinc0609c62021-03-01 17:27:16 +00004971func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004972 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004973 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004974 prebuilt_apex {
4975 name: "myapex",
4976 }
4977 `)
4978}
4979
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004980func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004981 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004982 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004983 prebuilt_apex {
4984 name: "myapex",
4985 src: "myapex-arm.apex",
4986 filename: "notmyapex.apex",
4987 }
4988 `)
4989
Wei Li340ee8e2022-03-18 17:33:24 -07004990 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4991 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004992
4993 expected := "notmyapex.apex"
4994 if p.installFilename != expected {
4995 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4996 }
Wei Li340ee8e2022-03-18 17:33:24 -07004997 rule := testingModule.Rule("genProvenanceMetaData")
4998 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4999 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5000 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5001 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005002}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005003
Samiul Islam7c02e262021-09-08 17:48:28 +01005004func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005005 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005006 testApex(t, `
5007 apex_set {
5008 name: "com.company.android.myapex",
5009 apex_name: "com.android.myapex",
5010 set: "company-myapex.apks",
5011 filename: "com.company.android.myapex.apex"
5012 }
5013 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5014
5015 testApex(t, `
5016 apex_set {
5017 name: "com.company.android.myapex",
5018 apex_name: "com.android.myapex",
5019 set: "company-myapex.apks",
5020 filename: "com.company.android.myapex.capex"
5021 }
5022 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5023
5024 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5025 apex_set {
5026 name: "com.company.android.myapex",
5027 apex_name: "com.android.myapex",
5028 set: "company-myapex.apks",
5029 filename: "some-random-suffix"
5030 }
5031 `)
5032}
5033
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005034func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005036 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005037 prebuilt_apex {
5038 name: "myapex.prebuilt",
5039 src: "myapex-arm.apex",
5040 overrides: [
5041 "myapex",
5042 ],
5043 }
5044 `)
5045
Wei Li340ee8e2022-03-18 17:33:24 -07005046 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5047 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005048
5049 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005050 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005051 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005052 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005053 }
Wei Li340ee8e2022-03-18 17:33:24 -07005054 rule := testingModule.Rule("genProvenanceMetaData")
5055 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5056 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5057 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5058 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005059}
5060
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005061func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005062 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005063 testApex(t, `
5064 prebuilt_apex {
5065 name: "com.company.android.myapex",
5066 apex_name: "com.android.myapex",
5067 src: "company-myapex-arm.apex",
5068 }
5069 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5070
5071 testApex(t, `
5072 apex_set {
5073 name: "com.company.android.myapex",
5074 apex_name: "com.android.myapex",
5075 set: "company-myapex.apks",
5076 }
5077 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5078}
5079
5080func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005081 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005082 _ = android.GroupFixturePreparers(
5083 java.PrepareForTestWithJavaDefaultModules,
5084 PrepareForTestWithApexBuildComponents,
5085 android.FixtureWithRootAndroidBp(`
5086 platform_bootclasspath {
5087 name: "platform-bootclasspath",
5088 fragments: [
5089 {
5090 apex: "com.android.art",
5091 module: "art-bootclasspath-fragment",
5092 },
5093 ],
5094 }
5095
5096 prebuilt_apex {
5097 name: "com.company.android.art",
5098 apex_name: "com.android.art",
5099 src: "com.company.android.art-arm.apex",
5100 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5101 }
5102
5103 prebuilt_bootclasspath_fragment {
5104 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005105 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005106 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005107 hidden_api: {
5108 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5109 metadata: "my-bootclasspath-fragment/metadata.csv",
5110 index: "my-bootclasspath-fragment/index.csv",
5111 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5112 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5113 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005114 }
5115
5116 java_import {
5117 name: "core-oj",
5118 jars: ["prebuilt.jar"],
5119 }
5120 `),
5121 ).RunTest(t)
5122}
5123
Spandan Das59a4a2b2024-01-09 21:35:56 +00005124// A minimal context object for use with DexJarBuildPath
5125type moduleErrorfTestCtx struct {
5126}
5127
5128func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5129}
5130
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005131func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005132 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005133 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005134 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005135 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5136 // is disabled.
5137 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005138
5139 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5140 // file creation.
5141 java.FixtureConfigureBootJars("platform:foo"),
5142 android.FixtureModifyMockFS(func(fs android.MockFS) {
5143 fs["platform/Android.bp"] = []byte(`
5144 java_library {
5145 name: "foo",
5146 srcs: ["Test.java"],
5147 compile_dex: true,
5148 }
5149 `)
5150 fs["platform/Test.java"] = nil
5151 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005152 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005153
Paul Duffin40a3f652021-07-19 13:11:24 +01005154 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005155 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005156 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005157 var rule android.TestingBuildParams
5158
5159 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5160 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005161 }
5162
Paul Duffin40a3f652021-07-19 13:11:24 +01005163 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5164 t.Helper()
5165 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5166 var rule android.TestingBuildParams
5167
5168 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5169 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5170 }
5171
Paul Duffin89f570a2021-06-16 01:42:33 +01005172 fragment := java.ApexVariantReference{
5173 Apex: proptools.StringPtr("myapex"),
5174 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5175 }
5176
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005177 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005178 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005179 bp := `
5180 prebuilt_apex {
5181 name: "myapex",
5182 arch: {
5183 arm64: {
5184 src: "myapex-arm64.apex",
5185 },
5186 arm: {
5187 src: "myapex-arm.apex",
5188 },
5189 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005190 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5191 }
5192
5193 prebuilt_bootclasspath_fragment {
5194 name: "my-bootclasspath-fragment",
5195 contents: ["libfoo", "libbar"],
5196 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005197 hidden_api: {
5198 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5199 metadata: "my-bootclasspath-fragment/metadata.csv",
5200 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005201 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5202 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5203 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005204 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 }
5206
Spandan Das52c01a12024-09-20 01:09:48 +00005207 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005208 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005209 public: {
5210 jars: ["libfoo.jar"],
5211 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005212 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005213 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005214 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 }
Paul Duffin37856732021-02-26 14:24:15 +00005216
5217 java_sdk_library_import {
5218 name: "libbar",
5219 public: {
5220 jars: ["libbar.jar"],
5221 },
5222 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005223 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005224 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005225 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005226 `
5227
Paul Duffin89f570a2021-06-16 01:42:33 +01005228 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005229
Paul Duffin537ea3d2021-05-14 10:38:00 +01005230 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005231 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005232 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005233 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005234 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005235 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 +01005236 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005237 })
5238
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005239 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005240 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005241 bp := `
5242 apex_set {
5243 name: "myapex",
5244 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005245 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005246 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5247 }
5248
Paul Duffin89f570a2021-06-16 01:42:33 +01005249 prebuilt_bootclasspath_fragment {
5250 name: "my-bootclasspath-fragment",
5251 contents: ["libfoo", "libbar"],
5252 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005253 hidden_api: {
5254 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5255 metadata: "my-bootclasspath-fragment/metadata.csv",
5256 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005257 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5258 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5259 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005260 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005261 }
5262
Liz Kammer2dc72442023-04-20 10:10:48 -04005263 prebuilt_systemserverclasspath_fragment {
5264 name: "my-systemserverclasspath-fragment",
5265 contents: ["libbaz"],
5266 apex_available: ["myapex"],
5267 }
5268
Spandan Das52c01a12024-09-20 01:09:48 +00005269 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005270 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005271 public: {
5272 jars: ["libfoo.jar"],
5273 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005275 shared_library: false,
5276 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005277 }
5278
Spandan Das52c01a12024-09-20 01:09:48 +00005279
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005280 java_sdk_library_import {
5281 name: "libbar",
5282 public: {
5283 jars: ["libbar.jar"],
5284 },
5285 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005286 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005287 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005288 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005289
5290 java_sdk_library_import {
5291 name: "libbaz",
5292 public: {
5293 jars: ["libbaz.jar"],
5294 },
5295 apex_available: ["myapex"],
5296 shared_library: false,
5297 permitted_packages: ["baz"],
5298 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005299 `
5300
Paul Duffin89f570a2021-06-16 01:42:33 +01005301 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005302
Paul Duffin537ea3d2021-05-14 10:38:00 +01005303 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005304 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005305 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005306 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005307 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005308 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 +01005309 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005310
5311 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5312
5313 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005314 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005315 "myjavalib.myapex",
5316 "libfoo.myapex",
5317 "libbar.myapex",
5318 "libbaz.myapex",
5319 }
5320 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5321 for i, e := range mkEntries {
5322 g := e.OverrideName
5323 if w := overrideNames[i]; w != g {
5324 t.Errorf("Expected override name %q, got %q", w, g)
5325 }
5326 }
5327
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005328 })
5329
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005330 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005331 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005332 bp := `
5333 prebuilt_apex {
5334 name: "myapex",
5335 arch: {
5336 arm64: {
5337 src: "myapex-arm64.apex",
5338 },
5339 arm: {
5340 src: "myapex-arm.apex",
5341 },
5342 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005343 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5344 }
5345
5346 prebuilt_bootclasspath_fragment {
5347 name: "my-bootclasspath-fragment",
5348 contents: ["libfoo", "libbar"],
5349 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005350 hidden_api: {
5351 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5352 metadata: "my-bootclasspath-fragment/metadata.csv",
5353 index: "my-bootclasspath-fragment/index.csv",
5354 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5355 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5356 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005357 }
5358
5359 java_import {
5360 name: "libfoo",
5361 jars: ["libfoo.jar"],
5362 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005363 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 java_library {
5367 name: "libfoo",
5368 srcs: ["foo/bar/MyClass.java"],
5369 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005370 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005371 }
Paul Duffin37856732021-02-26 14:24:15 +00005372
5373 java_sdk_library_import {
5374 name: "libbar",
5375 public: {
5376 jars: ["libbar.jar"],
5377 },
5378 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005379 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005380 }
5381
5382 java_sdk_library {
5383 name: "libbar",
5384 srcs: ["foo/bar/MyClass.java"],
5385 unsafe_ignore_missing_latest_api: true,
5386 apex_available: ["myapex"],
5387 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005388 `
5389
5390 // In this test the source (java_library) libfoo is active since the
5391 // prebuilt (java_import) defaults to prefer:false. However the
5392 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5393 // find the dex boot jar in it. We either need to disable the source libfoo
5394 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005395 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005396 // dexbootjar check is skipped if AllowMissingDependencies is true
5397 preparerAllowMissingDeps := android.GroupFixturePreparers(
5398 preparer,
5399 android.PrepareForTestWithAllowMissingDependencies,
5400 )
5401 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005402 })
5403
5404 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005405 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005406 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005407 apex {
5408 name: "myapex",
5409 key: "myapex.key",
5410 updatable: false,
5411 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5412 }
5413
5414 apex_key {
5415 name: "myapex.key",
5416 public_key: "testkey.avbpubkey",
5417 private_key: "testkey.pem",
5418 }
5419
5420 bootclasspath_fragment {
5421 name: "my-bootclasspath-fragment",
5422 contents: ["libfoo", "libbar"],
5423 apex_available: ["myapex"],
5424 hidden_api: {
5425 split_packages: ["*"],
5426 },
5427 }
5428
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005429 prebuilt_apex {
5430 name: "myapex",
5431 arch: {
5432 arm64: {
5433 src: "myapex-arm64.apex",
5434 },
5435 arm: {
5436 src: "myapex-arm.apex",
5437 },
5438 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5440 }
5441
5442 prebuilt_bootclasspath_fragment {
5443 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005444 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005445 contents: ["libfoo", "libbar"],
5446 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005447 hidden_api: {
5448 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5449 metadata: "my-bootclasspath-fragment/metadata.csv",
5450 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005451 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5452 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5453 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005454 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 }
5456
Spandan Das52c01a12024-09-20 01:09:48 +00005457 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005458 name: "libfoo",
5459 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005460 public: {
5461 jars: ["libfoo.jar"],
5462 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005463 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005464 shared_library: false,
5465 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466 }
5467
5468 java_library {
5469 name: "libfoo",
5470 srcs: ["foo/bar/MyClass.java"],
5471 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005472 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005473 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005474 }
Paul Duffin37856732021-02-26 14:24:15 +00005475
5476 java_sdk_library_import {
5477 name: "libbar",
5478 prefer: true,
5479 public: {
5480 jars: ["libbar.jar"],
5481 },
5482 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005483 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005484 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005485 }
5486
5487 java_sdk_library {
5488 name: "libbar",
5489 srcs: ["foo/bar/MyClass.java"],
5490 unsafe_ignore_missing_latest_api: true,
5491 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005492 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005493 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005494 `
5495
Paul Duffin89f570a2021-06-16 01:42:33 +01005496 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005497
Paul Duffin537ea3d2021-05-14 10:38:00 +01005498 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005499 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005500 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005501 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005502 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005503 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 +01005504 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 })
5506
5507 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005508 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 bp := `
5510 apex {
5511 name: "myapex",
5512 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005513 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005514 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 }
5516
5517 apex_key {
5518 name: "myapex.key",
5519 public_key: "testkey.avbpubkey",
5520 private_key: "testkey.pem",
5521 }
5522
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005523 bootclasspath_fragment {
5524 name: "my-bootclasspath-fragment",
5525 contents: ["libfoo", "libbar"],
5526 apex_available: ["myapex"],
5527 hidden_api: {
5528 split_packages: ["*"],
5529 },
5530 }
5531
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005532 prebuilt_apex {
5533 name: "myapex",
5534 arch: {
5535 arm64: {
5536 src: "myapex-arm64.apex",
5537 },
5538 arm: {
5539 src: "myapex-arm.apex",
5540 },
5541 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5543 }
5544
5545 prebuilt_bootclasspath_fragment {
5546 name: "my-bootclasspath-fragment",
5547 contents: ["libfoo", "libbar"],
5548 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005549 hidden_api: {
5550 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5551 metadata: "my-bootclasspath-fragment/metadata.csv",
5552 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005553 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5554 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5555 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005556 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005557 }
5558
5559 java_import {
5560 name: "libfoo",
5561 jars: ["libfoo.jar"],
5562 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005563 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005564 }
5565
5566 java_library {
5567 name: "libfoo",
5568 srcs: ["foo/bar/MyClass.java"],
5569 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005570 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005571 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005572 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 }
Paul Duffin37856732021-02-26 14:24:15 +00005574
5575 java_sdk_library_import {
5576 name: "libbar",
5577 public: {
5578 jars: ["libbar.jar"],
5579 },
5580 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005581 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005582 }
5583
5584 java_sdk_library {
5585 name: "libbar",
5586 srcs: ["foo/bar/MyClass.java"],
5587 unsafe_ignore_missing_latest_api: true,
5588 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005589 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005590 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005591 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005592 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005593 `
5594
Paul Duffin89f570a2021-06-16 01:42:33 +01005595 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005596
Paul Duffin537ea3d2021-05-14 10:38:00 +01005597 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005598 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005599 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5600 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005601 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5602 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 +01005603 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 })
5605
5606 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005607 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 bp := `
5609 apex {
5610 name: "myapex",
5611 enabled: false,
5612 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005613 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 }
5615
5616 apex_key {
5617 name: "myapex.key",
5618 public_key: "testkey.avbpubkey",
5619 private_key: "testkey.pem",
5620 }
5621
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005622 bootclasspath_fragment {
5623 name: "my-bootclasspath-fragment",
5624 enabled: false,
5625 contents: ["libfoo", "libbar"],
5626 apex_available: ["myapex"],
5627 hidden_api: {
5628 split_packages: ["*"],
5629 },
5630 }
5631
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005632 prebuilt_apex {
5633 name: "myapex",
5634 arch: {
5635 arm64: {
5636 src: "myapex-arm64.apex",
5637 },
5638 arm: {
5639 src: "myapex-arm.apex",
5640 },
5641 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005642 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5643 }
5644
5645 prebuilt_bootclasspath_fragment {
5646 name: "my-bootclasspath-fragment",
5647 contents: ["libfoo", "libbar"],
5648 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005649 hidden_api: {
5650 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5651 metadata: "my-bootclasspath-fragment/metadata.csv",
5652 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005653 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5654 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5655 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005656 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005657 }
5658
5659 java_import {
5660 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005661 jars: ["libfoo.jar"],
5662 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005663 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005664 }
5665
5666 java_library {
5667 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005668 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005669 srcs: ["foo/bar/MyClass.java"],
5670 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005671 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005672 }
Paul Duffin37856732021-02-26 14:24:15 +00005673
5674 java_sdk_library_import {
5675 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005676 public: {
5677 jars: ["libbar.jar"],
5678 },
5679 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005680 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005681 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005682 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005683 }
5684
5685 java_sdk_library {
5686 name: "libbar",
5687 srcs: ["foo/bar/MyClass.java"],
5688 unsafe_ignore_missing_latest_api: true,
5689 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005690 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005691 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005692 `
Cole Fausta963b942024-04-11 17:43:00 -07005693 // This test disables libbar, which causes the ComponentDepsMutator to add
5694 // deps on libbar.stubs and other sub-modules that don't exist. We can
5695 // enable AllowMissingDependencies to work around that, but enabling that
5696 // causes extra checks for missing source files to dex_bootjars, so add those
5697 // to the mock fs as well.
5698 preparer2 := android.GroupFixturePreparers(
5699 preparer,
5700 android.PrepareForTestWithAllowMissingDependencies,
5701 android.FixtureMergeMockFs(map[string][]byte{
5702 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005703 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005704 }),
5705 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706
Cole Fausta963b942024-04-11 17:43:00 -07005707 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005708
Paul Duffin537ea3d2021-05-14 10:38:00 +01005709 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005710 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005711 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005712 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005713 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005714 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 +01005715 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716 })
Spandan Das3a392012024-01-17 18:26:27 +00005717
Spandan Dasf2c10572024-02-27 04:49:52 +00005718 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005719 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005720 bp := `
5721 // Source
5722 apex {
5723 name: "myapex",
5724 enabled: false,
5725 key: "myapex.key",
5726 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5727 }
5728
5729 apex_key {
5730 name: "myapex.key",
5731 public_key: "testkey.avbpubkey",
5732 private_key: "testkey.pem",
5733 }
5734
5735 // Prebuilt
5736 prebuilt_apex {
5737 name: "myapex.v1",
5738 source_apex_name: "myapex",
5739 arch: {
5740 arm64: {
5741 src: "myapex-arm64.apex",
5742 },
5743 arm: {
5744 src: "myapex-arm.apex",
5745 },
5746 },
5747 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5748 prefer: true,
5749 }
5750 prebuilt_apex {
5751 name: "myapex.v2",
5752 source_apex_name: "myapex",
5753 arch: {
5754 arm64: {
5755 src: "myapex-arm64.apex",
5756 },
5757 arm: {
5758 src: "myapex-arm.apex",
5759 },
5760 },
5761 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5762 prefer: true,
5763 }
5764
5765 prebuilt_bootclasspath_fragment {
5766 name: "my-bootclasspath-fragment",
5767 contents: ["libfoo", "libbar"],
5768 apex_available: ["myapex"],
5769 hidden_api: {
5770 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5771 metadata: "my-bootclasspath-fragment/metadata.csv",
5772 index: "my-bootclasspath-fragment/index.csv",
5773 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5774 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5775 },
5776 prefer: true,
5777 }
5778
5779 java_import {
5780 name: "libfoo",
5781 jars: ["libfoo.jar"],
5782 apex_available: ["myapex"],
5783 prefer: true,
5784 }
5785 java_import {
5786 name: "libbar",
5787 jars: ["libbar.jar"],
5788 apex_available: ["myapex"],
5789 prefer: true,
5790 }
5791 `
5792
Spandan Dasf2c10572024-02-27 04:49:52 +00005793 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 +00005794 })
5795
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005796}
5797
Roland Levillain630846d2019-06-26 12:48:34 +01005798func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005799 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005800 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005801 apex_test {
5802 name: "myapex",
5803 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005804 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005805 tests: [
5806 "mytest",
5807 ],
5808 }
5809
5810 apex_key {
5811 name: "myapex.key",
5812 public_key: "testkey.avbpubkey",
5813 private_key: "testkey.pem",
5814 }
5815
Liz Kammer1c14a212020-05-12 15:26:55 -07005816 filegroup {
5817 name: "fg",
5818 srcs: [
5819 "baz",
5820 "bar/baz"
5821 ],
5822 }
5823
Roland Levillain630846d2019-06-26 12:48:34 +01005824 cc_test {
5825 name: "mytest",
5826 gtest: false,
5827 srcs: ["mytest.cpp"],
5828 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005829 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005830 system_shared_libs: [],
5831 static_executable: true,
5832 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005833 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005834 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005835
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005836 cc_library {
5837 name: "mylib",
5838 srcs: ["mylib.cpp"],
5839 system_shared_libs: [],
5840 stl: "none",
5841 }
5842
Liz Kammer5bd365f2020-05-27 15:15:11 -07005843 filegroup {
5844 name: "fg2",
5845 srcs: [
5846 "testdata/baz"
5847 ],
5848 }
Roland Levillain630846d2019-06-26 12:48:34 +01005849 `)
5850
Jooyung Hana0503a52023-08-23 13:12:50 +09005851 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005852 copyCmds := apexRule.Args["copy_commands"]
5853
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005854 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005855 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005856 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005857
Liz Kammer1c14a212020-05-12 15:26:55 -07005858 //Ensure that test data are copied into apex.
5859 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5860 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5861
Roland Levillainf89cd092019-07-29 16:22:59 +01005862 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005863 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005864 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005865 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005866 prefix := "TARGET_"
5867 var builder strings.Builder
5868 data.Custom(&builder, name, prefix, "", data)
5869 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005870 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005871 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005872}
5873
Jooyung Hand48f3c32019-08-23 11:18:57 +09005874func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005875 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005876 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5877 apex {
5878 name: "myapex",
5879 key: "myapex.key",
5880 native_shared_libs: ["libfoo"],
5881 }
5882
5883 apex_key {
5884 name: "myapex.key",
5885 public_key: "testkey.avbpubkey",
5886 private_key: "testkey.pem",
5887 }
5888
5889 cc_library {
5890 name: "libfoo",
5891 stl: "none",
5892 system_shared_libs: [],
5893 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005894 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005895 }
5896 `)
5897 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5898 apex {
5899 name: "myapex",
5900 key: "myapex.key",
5901 java_libs: ["myjar"],
5902 }
5903
5904 apex_key {
5905 name: "myapex.key",
5906 public_key: "testkey.avbpubkey",
5907 private_key: "testkey.pem",
5908 }
5909
5910 java_library {
5911 name: "myjar",
5912 srcs: ["foo/bar/MyClass.java"],
5913 sdk_version: "none",
5914 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005915 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005916 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005917 }
5918 `)
5919}
5920
Bill Peckhama41a6962021-01-11 10:58:54 -08005921func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005922 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005923 apex {
5924 name: "myapex",
5925 key: "myapex.key",
5926 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005927 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005928 }
5929
5930 apex_key {
5931 name: "myapex.key",
5932 public_key: "testkey.avbpubkey",
5933 private_key: "testkey.pem",
5934 }
5935
5936 java_import {
5937 name: "myjavaimport",
5938 apex_available: ["myapex"],
5939 jars: ["my.jar"],
5940 compile_dex: true,
5941 }
5942 `)
5943
Jooyung Hana0503a52023-08-23 13:12:50 +09005944 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005945 apexRule := module.Rule("apexRule")
5946 copyCmds := apexRule.Args["copy_commands"]
5947 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5948}
5949
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005950func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005951 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005952 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 apex {
5954 name: "myapex",
5955 key: "myapex.key",
5956 apps: [
5957 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005958 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005959 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005960 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005961 }
5962
5963 apex_key {
5964 name: "myapex.key",
5965 public_key: "testkey.avbpubkey",
5966 private_key: "testkey.pem",
5967 }
5968
5969 android_app {
5970 name: "AppFoo",
5971 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005972 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005973 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005974 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005975 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005976 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005977 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005978 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005979
5980 android_app {
5981 name: "AppFooPriv",
5982 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005983 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005984 system_modules: "none",
5985 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005986 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005988 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005989 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005990
5991 cc_library_shared {
5992 name: "libjni",
5993 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005994 shared_libs: ["libfoo"],
5995 stl: "none",
5996 system_shared_libs: [],
5997 apex_available: [ "myapex" ],
5998 sdk_version: "current",
5999 }
6000
6001 cc_library_shared {
6002 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006003 stl: "none",
6004 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006005 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006006 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006007 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006008 `)
6009
Jooyung Hana0503a52023-08-23 13:12:50 +09006010 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006011 apexRule := module.Rule("apexRule")
6012 copyCmds := apexRule.Args["copy_commands"]
6013
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006014 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6015 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006016 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006017
Colin Crossaede88c2020-08-11 12:17:01 -07006018 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006019 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006020 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006021 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006022 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006023 // JNI libraries including transitive deps are
6024 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006025 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006026 // ... embedded inside APK (jnilibs.zip)
6027 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6028 // ... and not directly inside the APEX
6029 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6030 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006031
6032 apexBundle := module.Module().(*apexBundle)
6033 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6034 var builder strings.Builder
6035 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6036 androidMk := builder.String()
6037 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6038 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6039 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6040 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6041 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6042 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 +01006043}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006044
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006045func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006046 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006047 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6048 for _, id := range invalidBuildIds {
6049 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6050 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6051 variables.BuildId = proptools.StringPtr(id)
6052 })
6053 testApexError(t, message, `apex {
6054 name: "myapex",
6055 key: "myapex.key",
6056 apps: ["AppFooPrebuilt"],
6057 updatable: false,
6058 }
6059
6060 apex_key {
6061 name: "myapex.key",
6062 public_key: "testkey.avbpubkey",
6063 private_key: "testkey.pem",
6064 }
6065
6066 android_app_import {
6067 name: "AppFooPrebuilt",
6068 apk: "PrebuiltAppFoo.apk",
6069 presigned: true,
6070 apex_available: ["myapex"],
6071 }
6072 `, fixture)
6073 }
6074}
6075
Dario Frenicde2a032019-10-27 00:29:22 +01006076func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006077 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006078 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006079 apex {
6080 name: "myapex",
6081 key: "myapex.key",
6082 apps: [
6083 "AppFooPrebuilt",
6084 "AppFooPrivPrebuilt",
6085 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006086 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006087 }
6088
6089 apex_key {
6090 name: "myapex.key",
6091 public_key: "testkey.avbpubkey",
6092 private_key: "testkey.pem",
6093 }
6094
6095 android_app_import {
6096 name: "AppFooPrebuilt",
6097 apk: "PrebuiltAppFoo.apk",
6098 presigned: true,
6099 dex_preopt: {
6100 enabled: false,
6101 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006102 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006103 }
6104
6105 android_app_import {
6106 name: "AppFooPrivPrebuilt",
6107 apk: "PrebuiltAppFooPriv.apk",
6108 privileged: true,
6109 presigned: true,
6110 dex_preopt: {
6111 enabled: false,
6112 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006113 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006114 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006115 }
6116 `)
6117
Jooyung Hana0503a52023-08-23 13:12:50 +09006118 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006119 apexRule := module.Rule("apexRule")
6120 copyCmds := apexRule.Args["copy_commands"]
6121
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006122 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6123 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006124}
6125
6126func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006128 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006129 apex {
6130 name: "myapex",
6131 key: "myapex.key",
6132 apps: [
6133 "AppFoo",
6134 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006135 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 android_app {
6145 name: "AppFoo",
6146 srcs: ["foo/bar/MyClass.java"],
6147 sdk_version: "none",
6148 system_modules: "none",
6149 apex_available: [ "myapex" ],
6150 }
6151
6152 android_app_import {
6153 name: "AppFoo",
6154 apk: "AppFooPrebuilt.apk",
6155 filename: "AppFooPrebuilt.apk",
6156 presigned: true,
6157 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006158 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006159 }
6160 `, withFiles(map[string][]byte{
6161 "AppFooPrebuilt.apk": nil,
6162 }))
6163
Jooyung Hana0503a52023-08-23 13:12:50 +09006164 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006165 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006166 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006167}
6168
Dario Freni6f3937c2019-12-20 22:58:03 +00006169func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006170 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006171 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006172 apex {
6173 name: "myapex",
6174 key: "myapex.key",
6175 apps: [
6176 "TesterHelpAppFoo",
6177 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006178 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006179 }
6180
6181 apex_key {
6182 name: "myapex.key",
6183 public_key: "testkey.avbpubkey",
6184 private_key: "testkey.pem",
6185 }
6186
6187 android_test_helper_app {
6188 name: "TesterHelpAppFoo",
6189 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006190 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006191 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006192 }
6193
6194 `)
6195
Jooyung Hana0503a52023-08-23 13:12:50 +09006196 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006197 apexRule := module.Rule("apexRule")
6198 copyCmds := apexRule.Args["copy_commands"]
6199
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006200 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006201}
6202
Jooyung Han18020ea2019-11-13 10:50:48 +09006203func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006204 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006205 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006206 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006207 apex {
6208 name: "myapex",
6209 key: "myapex.key",
6210 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006211 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006212 }
6213
6214 apex_key {
6215 name: "myapex.key",
6216 public_key: "testkey.avbpubkey",
6217 private_key: "testkey.pem",
6218 }
6219
6220 apex {
6221 name: "otherapex",
6222 key: "myapex.key",
6223 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006224 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006225 }
6226
6227 cc_defaults {
6228 name: "libfoo-defaults",
6229 apex_available: ["otherapex"],
6230 }
6231
6232 cc_library {
6233 name: "libfoo",
6234 defaults: ["libfoo-defaults"],
6235 stl: "none",
6236 system_shared_libs: [],
6237 }`)
6238}
6239
Paul Duffine52e66f2020-03-30 17:54:29 +01006240func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006241 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006242 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006243 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006244 apex {
6245 name: "myapex",
6246 key: "myapex.key",
6247 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006248 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006249 }
6250
6251 apex_key {
6252 name: "myapex.key",
6253 public_key: "testkey.avbpubkey",
6254 private_key: "testkey.pem",
6255 }
6256
6257 apex {
6258 name: "otherapex",
6259 key: "otherapex.key",
6260 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006261 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006262 }
6263
6264 apex_key {
6265 name: "otherapex.key",
6266 public_key: "testkey.avbpubkey",
6267 private_key: "testkey.pem",
6268 }
6269
6270 cc_library {
6271 name: "libfoo",
6272 stl: "none",
6273 system_shared_libs: [],
6274 apex_available: ["otherapex"],
6275 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006276
6277 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6278 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6279 testApex(t, `
6280 apex {
6281 name: "com.sdv.myapex",
6282 key: "myapex.key",
6283 native_shared_libs: ["libfoo"],
6284 updatable: false,
6285 product_specific: true,
6286 }
6287
6288 apex_key {
6289 name: "myapex.key",
6290 public_key: "testkey.avbpubkey",
6291 private_key: "testkey.pem",
6292 }
6293
6294 apex {
6295 name: "com.any.otherapex",
6296 key: "otherapex.key",
6297 native_shared_libs: ["libfoo"],
6298 updatable: false,
6299 }
6300
6301 apex_key {
6302 name: "otherapex.key",
6303 public_key: "testkey.avbpubkey",
6304 private_key: "testkey.pem",
6305 }
6306
6307 cc_library {
6308 name: "libfoo",
6309 stl: "none",
6310 system_shared_libs: [],
6311 apex_available: ["com.any.otherapex"],
6312 product_specific: true,
6313 }`,
6314 android.FixtureMergeMockFs(android.MockFS{
6315 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6316 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6317 }))
6318
6319 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6320 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6321 apex {
6322 name: "com.sdv.myapex",
6323 key: "myapex.key",
6324 native_shared_libs: ["libfoo"],
6325 updatable: false,
6326 }
6327
6328 apex_key {
6329 name: "myapex.key",
6330 public_key: "testkey.avbpubkey",
6331 private_key: "testkey.pem",
6332 }
6333
6334 apex {
6335 name: "com.any.otherapex",
6336 key: "otherapex.key",
6337 native_shared_libs: ["libfoo"],
6338 updatable: false,
6339 }
6340
6341 apex_key {
6342 name: "otherapex.key",
6343 public_key: "testkey.avbpubkey",
6344 private_key: "testkey.pem",
6345 }
6346
6347 cc_library {
6348 name: "libfoo",
6349 stl: "none",
6350 system_shared_libs: [],
6351 apex_available: ["com.any.otherapex"],
6352 }`,
6353 android.FixtureMergeMockFs(android.MockFS{
6354 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6355 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6356 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006357}
Jiyong Park127b40b2019-09-30 16:04:35 +09006358
Paul Duffine52e66f2020-03-30 17:54:29 +01006359func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006360 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006361 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006362 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006363.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006364.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006365.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006366.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006367.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006368.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
Jiyong Park127b40b2019-09-30 16:04:35 +09006382 cc_library {
6383 name: "libfoo",
6384 stl: "none",
6385 shared_libs: ["libbar"],
6386 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006387 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006388 }
6389
6390 cc_library {
6391 name: "libbar",
6392 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006393 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006394 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006395 apex_available: ["myapex"],
6396 }
6397
6398 cc_library {
6399 name: "libbaz",
6400 stl: "none",
6401 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006402 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006403
6404 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6405 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6406 testApex(t, `
6407 apex {
6408 name: "com.sdv.myapex",
6409 key: "myapex.key",
6410 native_shared_libs: ["libfoo"],
6411 updatable: false,
6412 product_specific: true,
6413 }
6414
6415 apex_key {
6416 name: "myapex.key",
6417 public_key: "testkey.avbpubkey",
6418 private_key: "testkey.pem",
6419 }
6420
6421 cc_library {
6422 name: "libfoo",
6423 stl: "none",
6424 shared_libs: ["libbar"],
6425 system_shared_libs: [],
6426 apex_available: ["com.sdv.myapex"],
6427 product_specific: true,
6428 }
6429
6430 cc_library {
6431 name: "libbar",
6432 stl: "none",
6433 shared_libs: ["libbaz"],
6434 system_shared_libs: [],
6435 apex_available: ["com.sdv.myapex"],
6436 product_specific: true,
6437 }
6438
6439 cc_library {
6440 name: "libbaz",
6441 stl: "none",
6442 system_shared_libs: [],
6443 product_specific: true,
6444 }`,
6445 android.FixtureMergeMockFs(android.MockFS{
6446 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6447 }))
6448
6449 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6450 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6451 apex {
6452 name: "com.sdv.myapex",
6453 key: "myapex.key",
6454 native_shared_libs: ["libfoo"],
6455 updatable: false,
6456 }
6457
6458 apex_key {
6459 name: "myapex.key",
6460 public_key: "testkey.avbpubkey",
6461 private_key: "testkey.pem",
6462 }
6463
6464 cc_library {
6465 name: "libfoo",
6466 stl: "none",
6467 shared_libs: ["libbar"],
6468 system_shared_libs: [],
6469 apex_available: ["com.sdv.myapex"],
6470 }
6471
6472 cc_library {
6473 name: "libbar",
6474 stl: "none",
6475 shared_libs: ["libbaz"],
6476 system_shared_libs: [],
6477 apex_available: ["com.sdv.myapex"],
6478 }
6479
6480 cc_library {
6481 name: "libbaz",
6482 stl: "none",
6483 system_shared_libs: [],
6484 }`,
6485 android.FixtureMergeMockFs(android.MockFS{
6486 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6487 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006488}
Jiyong Park127b40b2019-09-30 16:04:35 +09006489
Liz Kammer5f108fa2023-05-11 14:33:17 -04006490func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006491 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006492 testApex(t, `
6493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["libfoo"],
6497 updatable: false,
6498 }
6499
6500 apex_key {
6501 name: "myapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 static_libs: ["libbar"],
6510 system_shared_libs: [],
6511 apex_available: ["myapex"],
6512 }
6513
6514 cc_library {
6515 name: "libbar",
6516 stl: "none",
6517 shared_libs: ["libbaz"],
6518 system_shared_libs: [],
6519 apex_available: ["myapex"],
6520 }
6521
6522 cc_library {
6523 name: "libbaz",
6524 stl: "none",
6525 system_shared_libs: [],
6526 }`)
6527
6528 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6529 apex {
6530 name: "myapex",
6531 key: "myapex.key",
6532 native_shared_libs: ["libfoo"],
6533 updatable: false,
6534 }
6535
6536 apex_key {
6537 name: "myapex.key",
6538 public_key: "testkey.avbpubkey",
6539 private_key: "testkey.pem",
6540 }
6541
6542 cc_library {
6543 name: "libfoo",
6544 stl: "none",
6545 static_libs: ["libbar"],
6546 system_shared_libs: [],
6547 apex_available: ["myapex"],
6548 }
6549
6550 cc_library {
6551 name: "libbar",
6552 stl: "none",
6553 system_shared_libs: [],
6554 }`)
6555}
6556
Paul Duffine52e66f2020-03-30 17:54:29 +01006557func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006558 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 testApexError(t, "\"otherapex\" is not a valid module name", `
6560 apex {
6561 name: "myapex",
6562 key: "myapex.key",
6563 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006564 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006565 }
6566
6567 apex_key {
6568 name: "myapex.key",
6569 public_key: "testkey.avbpubkey",
6570 private_key: "testkey.pem",
6571 }
6572
6573 cc_library {
6574 name: "libfoo",
6575 stl: "none",
6576 system_shared_libs: [],
6577 apex_available: ["otherapex"],
6578 }`)
6579
Paul Duffine52e66f2020-03-30 17:54:29 +01006580 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006581 apex {
6582 name: "myapex",
6583 key: "myapex.key",
6584 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006585 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006586 }
6587
6588 apex_key {
6589 name: "myapex.key",
6590 public_key: "testkey.avbpubkey",
6591 private_key: "testkey.pem",
6592 }
6593
6594 cc_library {
6595 name: "libfoo",
6596 stl: "none",
6597 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006598 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006599 apex_available: ["myapex"],
6600 }
6601
6602 cc_library {
6603 name: "libbar",
6604 stl: "none",
6605 system_shared_libs: [],
6606 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006607 }
6608
6609 cc_library {
6610 name: "libbaz",
6611 stl: "none",
6612 system_shared_libs: [],
6613 stubs: {
6614 versions: ["10", "20", "30"],
6615 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006616 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006617}
Jiyong Park127b40b2019-09-30 16:04:35 +09006618
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006619func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006620 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006621 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006622 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006623 testApexError(t, "expected an integer between 0-9; got -1", `
6624 apex {
6625 name: "myapex",
6626 key: "myapex.key",
6627 apex_available_name: "com.android.foo",
6628 variant_version: "-1",
6629 updatable: false,
6630 }
6631 apex_key {
6632 name: "myapex.key",
6633 public_key: "testkey.avbpubkey",
6634 private_key: "testkey.pem",
6635 }
6636 `)
6637 })
6638
6639 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006640 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006641 testApexError(t, "expected an integer between 0-9; got 10", `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 apex_available_name: "com.android.foo",
6646 variant_version: "10",
6647 updatable: false,
6648 }
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654 `)
6655 })
6656}
6657
6658func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006659 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006660 context := android.GroupFixturePreparers(
6661 android.PrepareForIntegrationTestWithAndroid,
6662 PrepareForTestWithApexBuildComponents,
6663 android.FixtureMergeMockFs(android.MockFS{
6664 "system/sepolicy/apex/foo-file_contexts": nil,
6665 "system/sepolicy/apex/bar-file_contexts": nil,
6666 }),
6667 )
6668 result := context.RunTestWithBp(t, `
6669 apex {
6670 name: "foo",
6671 key: "myapex.key",
6672 apex_available_name: "com.android.foo",
6673 variant_version: "0",
6674 updatable: false,
6675 }
6676 apex {
6677 name: "bar",
6678 key: "myapex.key",
6679 apex_available_name: "com.android.foo",
6680 variant_version: "3",
6681 updatable: false,
6682 }
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006688 override_apex {
6689 name: "myoverrideapex",
6690 base: "bar",
6691 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006692 `)
6693
Jooyung Hana0503a52023-08-23 13:12:50 +09006694 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006695 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006696 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6697 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6698 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6699 }
6700
Jooyung Hana0503a52023-08-23 13:12:50 +09006701 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006702 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6704 barActualDefaultVersion := barManifestRule.Args["default_version"]
6705 if barActualDefaultVersion != barExpectedDefaultVersion {
6706 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6707 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006708
Spandan Das50801e22024-05-13 18:29:45 +00006709 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006710 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6711 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6712 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6713 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714}
6715
Sam Delmericoca816532023-06-02 14:09:50 -04006716func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006717 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006718 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006719 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006720 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6721 apex {
6722 name: "myapex_sminus",
6723 key: "myapex.key",
6724 apps: ["AppFoo"],
6725 apex_available_name: "myapex",
6726 updatable: false,
6727 }
6728 apex {
6729 name: "myapex",
6730 key: "myapex.key",
6731 apps: ["AppFoo"],
6732 updatable: false,
6733 }
6734 apex_key {
6735 name: "myapex.key",
6736 public_key: "testkey.avbpubkey",
6737 private_key: "testkey.pem",
6738 }
6739 android_app {
6740 name: "AppFoo",
6741 srcs: ["foo/bar/MyClass.java"],
6742 sdk_version: "none",
6743 system_modules: "none",
6744 apex_available: [ "myapex_sminus" ],
6745 }`,
6746 android.FixtureMergeMockFs(android.MockFS{
6747 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6748 }),
6749 )
6750 })
6751
6752 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006753 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006754 testApex(t, `
6755 apex {
6756 name: "myapex_sminus",
6757 key: "myapex.key",
6758 apps: ["AppFoo"],
6759 apex_available_name: "myapex",
6760 updatable: false,
6761 }
6762 apex {
6763 name: "myapex",
6764 key: "myapex.key",
6765 apps: ["AppFoo"],
6766 updatable: false,
6767 }
6768 apex_key {
6769 name: "myapex.key",
6770 public_key: "testkey.avbpubkey",
6771 private_key: "testkey.pem",
6772 }
6773 android_app {
6774 name: "AppFoo",
6775 srcs: ["foo/bar/MyClass.java"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 apex_available: [ "myapex" ],
6779 }`,
6780 android.FixtureMergeMockFs(android.MockFS{
6781 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6782 }),
6783 )
6784 })
6785
6786 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006787 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006788 testApex(t, `
6789 override_apex {
6790 name: "myoverrideapex_sminus",
6791 base: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFooOverride"],
6794 }
6795 override_apex {
6796 name: "myoverrideapex",
6797 base: "myapex",
6798 key: "myapex.key",
6799 apps: ["AppFooOverride"],
6800 }
6801 apex {
6802 name: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFoo"],
6805 apex_available_name: "myapex",
6806 updatable: false,
6807 }
6808 apex {
6809 name: "myapex",
6810 key: "myapex.key",
6811 apps: ["AppFoo"],
6812 updatable: false,
6813 }
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819 android_app {
6820 name: "AppFooOverride",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 apex_available: [ "myapex" ],
6825 }
6826 android_app {
6827 name: "AppFoo",
6828 srcs: ["foo/bar/MyClass.java"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 apex_available: [ "myapex" ],
6832 }`,
6833 android.FixtureMergeMockFs(android.MockFS{
6834 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6835 }),
6836 )
6837 })
6838}
6839
6840func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006841 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006842 context := android.GroupFixturePreparers(
6843 android.PrepareForIntegrationTestWithAndroid,
6844 PrepareForTestWithApexBuildComponents,
6845 java.PrepareForTestWithDexpreopt,
6846 android.FixtureMergeMockFs(android.MockFS{
6847 "system/sepolicy/apex/myapex-file_contexts": nil,
6848 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6849 }),
6850 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6851 variables.BuildId = proptools.StringPtr("buildid")
6852 }),
6853 )
6854 context.RunTestWithBp(t, `
6855 override_apex {
6856 name: "myoverrideapex_sminus",
6857 base: "myapex_sminus",
6858 }
6859 override_apex {
6860 name: "myoverrideapex",
6861 base: "myapex",
6862 }
6863 apex {
6864 name: "myapex",
6865 key: "myapex.key",
6866 apps: ["AppFoo"],
6867 updatable: false,
6868 }
6869 apex {
6870 name: "myapex_sminus",
6871 apex_available_name: "myapex",
6872 key: "myapex.key",
6873 apps: ["AppFoo_sminus"],
6874 updatable: false,
6875 }
6876 apex_key {
6877 name: "myapex.key",
6878 public_key: "testkey.avbpubkey",
6879 private_key: "testkey.pem",
6880 }
6881 android_app {
6882 name: "AppFoo",
6883 srcs: ["foo/bar/MyClass.java"],
6884 sdk_version: "none",
6885 system_modules: "none",
6886 apex_available: [ "myapex" ],
6887 }
6888 android_app {
6889 name: "AppFoo_sminus",
6890 srcs: ["foo/bar/MyClass.java"],
6891 sdk_version: "none",
6892 min_sdk_version: "29",
6893 system_modules: "none",
6894 apex_available: [ "myapex" ],
6895 }`)
6896}
6897
Jiyong Park89e850a2020-04-07 16:37:39 +09006898func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006899 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006900 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006901 apex {
6902 name: "myapex",
6903 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006904 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006905 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006906 }
6907
6908 apex_key {
6909 name: "myapex.key",
6910 public_key: "testkey.avbpubkey",
6911 private_key: "testkey.pem",
6912 }
6913
6914 cc_library {
6915 name: "libfoo",
6916 stl: "none",
6917 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006918 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006919 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006920 }
6921
6922 cc_library {
6923 name: "libfoo2",
6924 stl: "none",
6925 system_shared_libs: [],
6926 shared_libs: ["libbaz"],
6927 apex_available: ["//apex_available:platform"],
6928 }
6929
6930 cc_library {
6931 name: "libbar",
6932 stl: "none",
6933 system_shared_libs: [],
6934 apex_available: ["myapex"],
6935 }
6936
6937 cc_library {
6938 name: "libbaz",
6939 stl: "none",
6940 system_shared_libs: [],
6941 apex_available: ["myapex"],
6942 stubs: {
6943 versions: ["1"],
6944 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006945 }`)
6946
Jiyong Park89e850a2020-04-07 16:37:39 +09006947 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6948 // because it depends on libbar which isn't available to platform
6949 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6950 if libfoo.NotAvailableForPlatform() != true {
6951 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6952 }
6953
6954 // libfoo2 however can be available to platform because it depends on libbaz which provides
6955 // stubs
6956 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6957 if libfoo2.NotAvailableForPlatform() == true {
6958 t.Errorf("%q should be available to platform", libfoo2.String())
6959 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006960}
Jiyong Parka90ca002019-10-07 15:47:24 +09006961
Paul Duffine52e66f2020-03-30 17:54:29 +01006962func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006963 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006964 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006965 apex {
6966 name: "myapex",
6967 key: "myapex.key",
6968 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006969 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006970 }
6971
6972 apex_key {
6973 name: "myapex.key",
6974 public_key: "testkey.avbpubkey",
6975 private_key: "testkey.pem",
6976 }
6977
6978 cc_library {
6979 name: "libfoo",
6980 stl: "none",
6981 system_shared_libs: [],
6982 apex_available: ["myapex"],
6983 static: {
6984 apex_available: ["//apex_available:platform"],
6985 },
6986 }`)
6987
Jiyong Park89e850a2020-04-07 16:37:39 +09006988 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6989 if libfooShared.NotAvailableForPlatform() != true {
6990 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6991 }
6992 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6993 if libfooStatic.NotAvailableForPlatform() != false {
6994 t.Errorf("%q should be available to platform", libfooStatic.String())
6995 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006996}
6997
Jooyung Han9a419e22024-08-16 17:14:21 +09006998func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006999 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007000
7001 for _, tc := range []struct {
7002 name string
7003 apexAvailable string
7004 expectedError string
7005 }{
7006 {
7007 name: "prefix matches correctly",
7008 apexAvailable: "com.foo.*",
7009 },
7010 {
7011 name: "prefix doesn't match",
7012 apexAvailable: "com.bar.*",
7013 expectedError: `Consider .* "com.foo\.\*"`,
7014 },
7015 {
7016 name: "short prefix",
7017 apexAvailable: "com.*",
7018 expectedError: "requires two or more components",
7019 },
7020 {
7021 name: "wildcard not in the end",
7022 apexAvailable: "com.*.foo",
7023 expectedError: "should end with .*",
7024 },
7025 {
7026 name: "wildcard in the middle",
7027 apexAvailable: "com.foo*.*",
7028 expectedError: "not allowed in the middle",
7029 },
7030 {
7031 name: "hint with prefix pattern",
7032 apexAvailable: "//apex_available:platform",
7033 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7034 },
7035 } {
7036 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007037 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007038 errorHandler := android.FixtureExpectsNoErrors
7039 if tc.expectedError != "" {
7040 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7041 }
7042 context := android.GroupFixturePreparers(
7043 prepareForApexTest,
7044 android.FixtureMergeMockFs(android.MockFS{
7045 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7046 }),
7047 ).ExtendWithErrorHandler(errorHandler)
7048
7049 context.RunTestWithBp(t, `
7050 apex {
7051 name: "com.foo.bar",
7052 key: "myapex.key",
7053 native_shared_libs: ["libfoo"],
7054 updatable: false,
7055 }
7056
7057 apex_key {
7058 name: "myapex.key",
7059 public_key: "testkey.avbpubkey",
7060 private_key: "testkey.pem",
7061 }
7062
7063 cc_library {
7064 name: "libfoo",
7065 stl: "none",
7066 system_shared_libs: [],
7067 apex_available: ["`+tc.apexAvailable+`"],
7068 }`)
7069 })
7070 }
7071 testApexError(t, `Consider adding "com.foo" to`, `
7072 apex {
7073 name: "com.foo", // too short for a partner apex
7074 key: "myapex.key",
7075 native_shared_libs: ["libfoo"],
7076 updatable: false,
7077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
7085 cc_library {
7086 name: "libfoo",
7087 stl: "none",
7088 system_shared_libs: [],
7089 }
7090 `)
7091}
7092
Jiyong Park5d790c32019-11-15 18:40:32 +09007093func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007094 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007095 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007096 apex {
7097 name: "myapex",
7098 key: "myapex.key",
7099 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007100 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007101 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007102 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007103 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007104 }
7105
7106 override_apex {
7107 name: "override_myapex",
7108 base: "myapex",
7109 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007110 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007111 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007112 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007113 compile_multilib: "first",
7114 multilib: {
7115 lib32: {
7116 native_shared_libs: ["mylib32"],
7117 },
7118 lib64: {
7119 native_shared_libs: ["mylib64"],
7120 },
7121 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007122 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007123 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007124 key: "mynewapex.key",
7125 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007126 }
7127
7128 apex_key {
7129 name: "myapex.key",
7130 public_key: "testkey.avbpubkey",
7131 private_key: "testkey.pem",
7132 }
7133
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007134 apex_key {
7135 name: "mynewapex.key",
7136 public_key: "testkey2.avbpubkey",
7137 private_key: "testkey2.pem",
7138 }
7139
7140 android_app_certificate {
7141 name: "myapex.certificate",
7142 certificate: "testkey",
7143 }
7144
Jiyong Park5d790c32019-11-15 18:40:32 +09007145 android_app {
7146 name: "app",
7147 srcs: ["foo/bar/MyClass.java"],
7148 package_name: "foo",
7149 sdk_version: "none",
7150 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007151 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007152 }
7153
7154 override_android_app {
7155 name: "override_app",
7156 base: "app",
7157 package_name: "bar",
7158 }
markchien7c803b82021-08-26 22:10:06 +08007159
7160 bpf {
7161 name: "bpf",
7162 srcs: ["bpf.c"],
7163 }
7164
7165 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007166 name: "overrideBpf",
7167 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007168 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007169
7170 prebuilt_etc {
7171 name: "myetc",
7172 src: "myprebuilt",
7173 }
7174
7175 prebuilt_etc {
7176 name: "override_myetc",
7177 src: "override_myprebuilt",
7178 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007179
7180 cc_library {
7181 name: "mylib32",
7182 apex_available: [ "myapex" ],
7183 }
7184
7185 cc_library {
7186 name: "mylib64",
7187 apex_available: [ "myapex" ],
7188 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007189 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007190
Jooyung Hana0503a52023-08-23 13:12:50 +09007191 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007192 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007193 if originalVariant.GetOverriddenBy() != "" {
7194 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7195 }
7196 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7197 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7198 }
7199
Spandan Das50801e22024-05-13 18:29:45 +00007200 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007201 apexRule := module.Rule("apexRule")
7202 copyCmds := apexRule.Args["copy_commands"]
7203
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007204 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7205 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007206
markchien7c803b82021-08-26 22:10:06 +08007207 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007208 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007209
Daniel Norman5a3ce132021-08-26 15:44:43 -07007210 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7211 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7212
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007213 apexBundle := module.Module().(*apexBundle)
7214 name := apexBundle.Name()
7215 if name != "override_myapex" {
7216 t.Errorf("name should be \"override_myapex\", but was %q", name)
7217 }
7218
Baligh Uddin004d7172020-02-19 21:29:28 -08007219 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7220 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7221 }
7222
Jiyong Park20bacab2020-03-03 11:45:41 +09007223 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007224 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007225 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7226
7227 signApkRule := module.Rule("signapk")
7228 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007229
Colin Crossaa255532020-07-03 13:18:24 -07007230 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007231 var builder strings.Builder
7232 data.Custom(&builder, name, "TARGET_", "", data)
7233 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007234 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7235 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007236 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007237 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007238 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007239 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007240 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007241 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007242}
7243
Albert Martineefabcf2022-03-21 20:11:16 +00007244func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007245 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007246 // Override from 29 to 31
7247 minSdkOverride31 := "31"
7248 ctx := testApex(t, `
7249 apex {
7250 name: "myapex",
7251 key: "myapex.key",
7252 native_shared_libs: ["mylib"],
7253 updatable: true,
7254 min_sdk_version: "29"
7255 }
7256
7257 override_apex {
7258 name: "override_myapex",
7259 base: "myapex",
7260 logging_parent: "com.foo.bar",
7261 package_name: "test.overridden.package"
7262 }
7263
7264 apex_key {
7265 name: "myapex.key",
7266 public_key: "testkey.avbpubkey",
7267 private_key: "testkey.pem",
7268 }
7269
7270 cc_library {
7271 name: "mylib",
7272 srcs: ["mylib.cpp"],
7273 runtime_libs: ["libbar"],
7274 system_shared_libs: [],
7275 stl: "none",
7276 apex_available: [ "myapex" ],
7277 min_sdk_version: "apex_inherit"
7278 }
7279
7280 cc_library {
7281 name: "libbar",
7282 srcs: ["mylib.cpp"],
7283 system_shared_libs: [],
7284 stl: "none",
7285 apex_available: [ "myapex" ],
7286 min_sdk_version: "apex_inherit"
7287 }
7288
7289 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7290
Jooyung Hana0503a52023-08-23 13:12:50 +09007291 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007292 copyCmds := apexRule.Args["copy_commands"]
7293
7294 // Ensure that direct non-stubs dep is always included
7295 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7296
7297 // Ensure that runtime_libs dep in included
7298 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7299
7300 // Ensure libraries target overridden min_sdk_version value
7301 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7302}
7303
7304func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007305 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007306 // Attempt to override from 31 to 29, should be a NOOP
7307 minSdkOverride29 := "29"
7308 ctx := testApex(t, `
7309 apex {
7310 name: "myapex",
7311 key: "myapex.key",
7312 native_shared_libs: ["mylib"],
7313 updatable: true,
7314 min_sdk_version: "31"
7315 }
7316
7317 override_apex {
7318 name: "override_myapex",
7319 base: "myapex",
7320 logging_parent: "com.foo.bar",
7321 package_name: "test.overridden.package"
7322 }
7323
7324 apex_key {
7325 name: "myapex.key",
7326 public_key: "testkey.avbpubkey",
7327 private_key: "testkey.pem",
7328 }
7329
7330 cc_library {
7331 name: "mylib",
7332 srcs: ["mylib.cpp"],
7333 runtime_libs: ["libbar"],
7334 system_shared_libs: [],
7335 stl: "none",
7336 apex_available: [ "myapex" ],
7337 min_sdk_version: "apex_inherit"
7338 }
7339
7340 cc_library {
7341 name: "libbar",
7342 srcs: ["mylib.cpp"],
7343 system_shared_libs: [],
7344 stl: "none",
7345 apex_available: [ "myapex" ],
7346 min_sdk_version: "apex_inherit"
7347 }
7348
7349 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7350
Jooyung Hana0503a52023-08-23 13:12:50 +09007351 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007352 copyCmds := apexRule.Args["copy_commands"]
7353
7354 // Ensure that direct non-stubs dep is always included
7355 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7356
7357 // Ensure that runtime_libs dep in included
7358 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7359
7360 // Ensure libraries target the original min_sdk_version value rather than the overridden
7361 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7362}
7363
Jooyung Han214bf372019-11-12 13:03:50 +09007364func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007365 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007366 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007367 apex {
7368 name: "myapex",
7369 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007370 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007371 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007372 }
7373
7374 apex_key {
7375 name: "myapex.key",
7376 public_key: "testkey.avbpubkey",
7377 private_key: "testkey.pem",
7378 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007379
7380 cc_library {
7381 name: "mylib",
7382 srcs: ["mylib.cpp"],
7383 stl: "libc++",
7384 system_shared_libs: [],
7385 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007386 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007387 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007388 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007389
Jooyung Hana0503a52023-08-23 13:12:50 +09007390 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007391 args := module.Rule("apexRule").Args
7392 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007393 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007394
7395 // The copies of the libraries in the apex should have one more dependency than
7396 // the ones outside the apex, namely the unwinder. Ideally we should check
7397 // the dependency names directly here but for some reason the names are blank in
7398 // this test.
7399 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007400 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007401 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7402 if len(apexImplicits) != len(nonApexImplicits)+1 {
7403 t.Errorf("%q missing unwinder dep", lib)
7404 }
7405 }
Jooyung Han214bf372019-11-12 13:03:50 +09007406}
7407
Paul Duffine05480a2021-03-08 15:07:14 +00007408var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007409 "api/current.txt": nil,
7410 "api/removed.txt": nil,
7411 "api/system-current.txt": nil,
7412 "api/system-removed.txt": nil,
7413 "api/test-current.txt": nil,
7414 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007415
Anton Hanssondff2c782020-12-21 17:10:01 +00007416 "100/public/api/foo.txt": nil,
7417 "100/public/api/foo-removed.txt": nil,
7418 "100/system/api/foo.txt": nil,
7419 "100/system/api/foo-removed.txt": nil,
7420
Paul Duffineedc5d52020-06-12 17:46:39 +01007421 // For java_sdk_library_import
7422 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007423}
7424
Jooyung Han58f26ab2019-12-18 15:34:32 +09007425func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007426 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007427 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007428 apex {
7429 name: "myapex",
7430 key: "myapex.key",
7431 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007432 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007433 }
7434
7435 apex_key {
7436 name: "myapex.key",
7437 public_key: "testkey.avbpubkey",
7438 private_key: "testkey.pem",
7439 }
7440
7441 java_sdk_library {
7442 name: "foo",
7443 srcs: ["a.java"],
7444 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007445 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007446 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007447
7448 prebuilt_apis {
7449 name: "sdk",
7450 api_dirs: ["100"],
7451 }
Paul Duffin9b879592020-05-26 13:21:35 +01007452 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007453
7454 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007455 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007456 "javalib/foo.jar",
7457 "etc/permissions/foo.xml",
7458 })
7459 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007460 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7461 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7462 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007463}
7464
Spandan Das3ee19692024-06-19 04:47:40 +00007465func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007466 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007467 ctx := testApex(t, `
7468 override_apex {
7469 name: "mycompanyapex",
7470 base: "myapex",
7471 }
7472 apex {
7473 name: "myapex",
7474 key: "myapex.key",
7475 java_libs: ["foo"],
7476 updatable: false,
7477 }
7478
7479 apex_key {
7480 name: "myapex.key",
7481 public_key: "testkey.avbpubkey",
7482 private_key: "testkey.pem",
7483 }
7484
7485 java_sdk_library {
7486 name: "foo",
7487 srcs: ["a.java"],
7488 api_packages: ["foo"],
7489 apex_available: [ "myapex" ],
7490 }
7491
7492 prebuilt_apis {
7493 name: "sdk",
7494 api_dirs: ["100"],
7495 }
7496 `, withFiles(filesForSdkLibrary))
7497
7498 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7499 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7500 // (com.android.foo), the filepath should not contain override apex name.
7501 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7502 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7503 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7504}
7505
Paul Duffin9b879592020-05-26 13:21:35 +01007506func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007507 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007508 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007509 apex {
7510 name: "myapex",
7511 key: "myapex.key",
7512 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007513 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007514 }
7515
7516 apex_key {
7517 name: "myapex.key",
7518 public_key: "testkey.avbpubkey",
7519 private_key: "testkey.pem",
7520 }
7521
7522 java_sdk_library {
7523 name: "foo",
7524 srcs: ["a.java"],
7525 api_packages: ["foo"],
7526 apex_available: ["myapex"],
7527 sdk_version: "none",
7528 system_modules: "none",
7529 }
7530
7531 java_library {
7532 name: "bar",
7533 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007534 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007535 apex_available: ["myapex"],
7536 sdk_version: "none",
7537 system_modules: "none",
7538 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007539
7540 prebuilt_apis {
7541 name: "sdk",
7542 api_dirs: ["100"],
7543 }
Paul Duffin9b879592020-05-26 13:21:35 +01007544 `, withFiles(filesForSdkLibrary))
7545
7546 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007547 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007548 "javalib/bar.jar",
7549 "javalib/foo.jar",
7550 "etc/permissions/foo.xml",
7551 })
7552
7553 // The bar library should depend on the implementation jar.
7554 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007555 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007556 t.Errorf("expected %q, found %#q", expected, actual)
7557 }
7558}
7559
7560func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007561 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007562 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007563 apex {
7564 name: "myapex",
7565 key: "myapex.key",
7566 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007567 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007568 }
7569
7570 apex_key {
7571 name: "myapex.key",
7572 public_key: "testkey.avbpubkey",
7573 private_key: "testkey.pem",
7574 }
7575
7576 java_sdk_library {
7577 name: "foo",
7578 srcs: ["a.java"],
7579 api_packages: ["foo"],
7580 apex_available: ["myapex"],
7581 sdk_version: "none",
7582 system_modules: "none",
7583 }
7584
7585 java_library {
7586 name: "bar",
7587 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007588 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007589 sdk_version: "none",
7590 system_modules: "none",
7591 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007592
7593 prebuilt_apis {
7594 name: "sdk",
7595 api_dirs: ["100"],
7596 }
Paul Duffin9b879592020-05-26 13:21:35 +01007597 `, withFiles(filesForSdkLibrary))
7598
7599 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007600 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007601 "javalib/foo.jar",
7602 "etc/permissions/foo.xml",
7603 })
7604
7605 // The bar library should depend on the stubs jar.
7606 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007607 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007608 t.Errorf("expected %q, found %#q", expected, actual)
7609 }
7610}
7611
Paul Duffineedc5d52020-06-12 17:46:39 +01007612func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007613 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007614 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007615 prebuilt_apis {
7616 name: "sdk",
7617 api_dirs: ["100"],
7618 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007619 withFiles(map[string][]byte{
7620 "apex/a.java": nil,
7621 "apex/apex_manifest.json": nil,
7622 "apex/Android.bp": []byte(`
7623 package {
7624 default_visibility: ["//visibility:private"],
7625 }
7626
7627 apex {
7628 name: "myapex",
7629 key: "myapex.key",
7630 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007631 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007632 }
7633
7634 apex_key {
7635 name: "myapex.key",
7636 public_key: "testkey.avbpubkey",
7637 private_key: "testkey.pem",
7638 }
7639
7640 java_library {
7641 name: "bar",
7642 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007643 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007644 apex_available: ["myapex"],
7645 sdk_version: "none",
7646 system_modules: "none",
7647 }
7648`),
7649 "source/a.java": nil,
7650 "source/api/current.txt": nil,
7651 "source/api/removed.txt": nil,
7652 "source/Android.bp": []byte(`
7653 package {
7654 default_visibility: ["//visibility:private"],
7655 }
7656
7657 java_sdk_library {
7658 name: "foo",
7659 visibility: ["//apex"],
7660 srcs: ["a.java"],
7661 api_packages: ["foo"],
7662 apex_available: ["myapex"],
7663 sdk_version: "none",
7664 system_modules: "none",
7665 public: {
7666 enabled: true,
7667 },
7668 }
7669`),
7670 "prebuilt/a.jar": nil,
7671 "prebuilt/Android.bp": []byte(`
7672 package {
7673 default_visibility: ["//visibility:private"],
7674 }
7675
7676 java_sdk_library_import {
7677 name: "foo",
7678 visibility: ["//apex", "//source"],
7679 apex_available: ["myapex"],
7680 prefer: true,
7681 public: {
7682 jars: ["a.jar"],
7683 },
7684 }
7685`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007686 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007687 )
7688
7689 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007690 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007691 "javalib/bar.jar",
7692 "javalib/foo.jar",
7693 "etc/permissions/foo.xml",
7694 })
7695
7696 // The bar library should depend on the implementation jar.
7697 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007698 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007699 t.Errorf("expected %q, found %#q", expected, actual)
7700 }
7701}
7702
7703func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007704 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007705 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7706 apex {
7707 name: "myapex",
7708 key: "myapex.key",
7709 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007710 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007711 }
7712
7713 apex_key {
7714 name: "myapex.key",
7715 public_key: "testkey.avbpubkey",
7716 private_key: "testkey.pem",
7717 }
7718
7719 java_sdk_library_import {
7720 name: "foo",
7721 apex_available: ["myapex"],
7722 prefer: true,
7723 public: {
7724 jars: ["a.jar"],
7725 },
7726 }
7727
7728 `, withFiles(filesForSdkLibrary))
7729}
7730
atrost6e126252020-01-27 17:01:16 +00007731func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007732 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007733 result := android.GroupFixturePreparers(
7734 prepareForApexTest,
7735 java.PrepareForTestWithPlatformCompatConfig,
7736 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007737 apex {
7738 name: "myapex",
7739 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007740 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007741 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007742 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007743 }
7744
7745 apex_key {
7746 name: "myapex.key",
7747 public_key: "testkey.avbpubkey",
7748 private_key: "testkey.pem",
7749 }
7750
7751 platform_compat_config {
7752 name: "myjar-platform-compat-config",
7753 src: ":myjar",
7754 }
7755
7756 java_library {
7757 name: "myjar",
7758 srcs: ["foo/bar/MyClass.java"],
7759 sdk_version: "none",
7760 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007761 apex_available: [ "myapex" ],
7762 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007763
7764 // Make sure that a preferred prebuilt does not affect the apex contents.
7765 prebuilt_platform_compat_config {
7766 name: "myjar-platform-compat-config",
7767 metadata: "compat-config/metadata.xml",
7768 prefer: true,
7769 }
atrost6e126252020-01-27 17:01:16 +00007770 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007771 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007772 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007773 "etc/compatconfig/myjar-platform-compat-config.xml",
7774 "javalib/myjar.jar",
7775 })
7776}
7777
Jooyung Han862c0d62022-12-21 10:15:37 +09007778func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007779 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007780 android.GroupFixturePreparers(
7781 android.PrepareForTestWithAndroidBuildComponents,
7782 PrepareForTestWithApexBuildComponents,
7783 prepareForTestWithMyapex,
7784 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7785 ).
7786 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7787 RunTestWithBp(t, `
7788 apex {
7789 name: "myapex",
7790 key: "myapex.key",
7791 prebuilts: ["foo", "bar"],
7792 updatable: false,
7793 }
7794
7795 apex_key {
7796 name: "myapex.key",
7797 public_key: "testkey.avbpubkey",
7798 private_key: "testkey.pem",
7799 }
7800
7801 prebuilt_etc {
7802 name: "foo",
7803 src: "myprebuilt",
7804 filename_from_src: true,
7805 }
7806
7807 prebuilt_etc {
7808 name: "bar",
7809 src: "myprebuilt",
7810 filename_from_src: true,
7811 }
7812 `)
7813}
7814
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007815func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007816 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007817 bp := `
7818 apex {
7819 name: "myapex",
7820 key: "myapex.key",
7821 native_shared_libs: ["libfoo"],
7822 updatable: false,
7823 unwanted_transitive_deps: ["libbar"],
7824 }
7825
7826 apex_key {
7827 name: "myapex.key",
7828 public_key: "testkey.avbpubkey",
7829 private_key: "testkey.pem",
7830 }
7831
7832 cc_library {
7833 name: "libfoo",
7834 srcs: ["foo.cpp"],
7835 shared_libs: ["libbar"],
7836 apex_available: ["myapex"],
7837 }
7838
7839 cc_library {
7840 name: "libbar",
7841 srcs: ["bar.cpp"],
7842 apex_available: ["myapex"],
7843 }`
7844 ctx := testApex(t, bp)
7845 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7846 "*/libc++.so",
7847 "*/libfoo.so",
7848 // not libbar.so
7849 })
7850}
7851
Jiyong Park479321d2019-12-16 11:47:12 +09007852func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007853 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007854 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7855 apex {
7856 name: "myapex",
7857 key: "myapex.key",
7858 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007859 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007860 }
7861
7862 apex_key {
7863 name: "myapex.key",
7864 public_key: "testkey.avbpubkey",
7865 private_key: "testkey.pem",
7866 }
7867
7868 java_library {
7869 name: "myjar",
7870 srcs: ["foo/bar/MyClass.java"],
7871 sdk_version: "none",
7872 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007873 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007874 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007875 }
7876 `)
7877}
7878
Jiyong Park7afd1072019-12-30 16:56:33 +09007879func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007880 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007881 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007882 apex {
7883 name: "myapex",
7884 key: "myapex.key",
7885 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007886 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007887 }
7888
7889 apex_key {
7890 name: "myapex.key",
7891 public_key: "testkey.avbpubkey",
7892 private_key: "testkey.pem",
7893 }
7894
7895 cc_library {
7896 name: "mylib",
7897 srcs: ["mylib.cpp"],
7898 system_shared_libs: [],
7899 stl: "none",
7900 required: ["a", "b"],
7901 host_required: ["c", "d"],
7902 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007903 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007904 }
7905 `)
7906
Jooyung Hana0503a52023-08-23 13:12:50 +09007907 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007908 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007909 name := apexBundle.BaseModuleName()
7910 prefix := "TARGET_"
7911 var builder strings.Builder
7912 data.Custom(&builder, name, prefix, "", data)
7913 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007914 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007915 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7916 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007917}
7918
Jiyong Park7cd10e32020-01-14 09:22:18 +09007919func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007920 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007921 bp := `
7922 apex {
7923 name: "myapex",
7924 key: "myapex.key",
7925 native_shared_libs: ["mylib"],
7926 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007927 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007928 }
7929
Jiyong Park9d677202020-02-19 16:29:35 +09007930 apex {
7931 name: "myapex.updatable",
7932 key: "myapex.key",
7933 native_shared_libs: ["mylib"],
7934 java_libs: ["myjar"],
7935 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007936 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007937 }
7938
Jiyong Park7cd10e32020-01-14 09:22:18 +09007939 apex_key {
7940 name: "myapex.key",
7941 public_key: "testkey.avbpubkey",
7942 private_key: "testkey.pem",
7943 }
7944
7945 cc_library {
7946 name: "mylib",
7947 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007948 shared_libs: [
7949 "myotherlib",
7950 "myotherlib_ext",
7951 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007952 system_shared_libs: [],
7953 stl: "none",
7954 apex_available: [
7955 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007956 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007957 "//apex_available:platform",
7958 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007959 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007960 }
7961
7962 cc_library {
7963 name: "myotherlib",
7964 srcs: ["mylib.cpp"],
7965 system_shared_libs: [],
7966 stl: "none",
7967 apex_available: [
7968 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007969 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007970 "//apex_available:platform",
7971 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007972 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007973 }
7974
Jiyong Parkce243632023-02-17 18:22:25 +09007975 cc_library {
7976 name: "myotherlib_ext",
7977 srcs: ["mylib.cpp"],
7978 system_shared_libs: [],
7979 system_ext_specific: true,
7980 stl: "none",
7981 apex_available: [
7982 "myapex",
7983 "myapex.updatable",
7984 "//apex_available:platform",
7985 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007986 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007987 }
7988
Jiyong Park7cd10e32020-01-14 09:22:18 +09007989 java_library {
7990 name: "myjar",
7991 srcs: ["foo/bar/MyClass.java"],
7992 sdk_version: "none",
7993 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007994 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 apex_available: [
7996 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007997 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007998 "//apex_available:platform",
7999 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008000 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008001 }
8002
8003 java_library {
8004 name: "myotherjar",
8005 srcs: ["foo/bar/MyClass.java"],
8006 sdk_version: "none",
8007 system_modules: "none",
8008 apex_available: [
8009 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008010 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008011 "//apex_available:platform",
8012 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008013 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 }
8015 `
8016
8017 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8018 for _, f := range files {
8019 if f.path == file {
8020 if f.isLink {
8021 t.Errorf("%q is not a real file", file)
8022 }
8023 return
8024 }
8025 }
8026 t.Errorf("%q is not found", file)
8027 }
8028
Jiyong Parkce243632023-02-17 18:22:25 +09008029 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008030 for _, f := range files {
8031 if f.path == file {
8032 if !f.isLink {
8033 t.Errorf("%q is not a symlink", file)
8034 }
Jiyong Parkce243632023-02-17 18:22:25 +09008035 if f.src != target {
8036 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8037 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008038 return
8039 }
8040 }
8041 t.Errorf("%q is not found", file)
8042 }
8043
Jiyong Park9d677202020-02-19 16:29:35 +09008044 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8045 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008046 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008047 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008048 ensureRealfileExists(t, files, "javalib/myjar.jar")
8049 ensureRealfileExists(t, files, "lib64/mylib.so")
8050 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008051 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008052
Jooyung Hana0503a52023-08-23 13:12:50 +09008053 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008054 ensureRealfileExists(t, files, "javalib/myjar.jar")
8055 ensureRealfileExists(t, files, "lib64/mylib.so")
8056 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008057 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008058
8059 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008060 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008061 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008062 ensureRealfileExists(t, files, "javalib/myjar.jar")
8063 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008064 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8065 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008066
Jooyung Hana0503a52023-08-23 13:12:50 +09008067 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008068 ensureRealfileExists(t, files, "javalib/myjar.jar")
8069 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008070 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8071 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008072}
8073
Yo Chiange8128052020-07-23 20:09:18 +08008074func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008075 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008076 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008077 apex {
8078 name: "myapex",
8079 key: "myapex.key",
8080 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008081 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008082 }
8083
8084 apex_key {
8085 name: "myapex.key",
8086 public_key: "testkey.avbpubkey",
8087 private_key: "testkey.pem",
8088 }
8089
8090 cc_library_shared {
8091 name: "mylib",
8092 srcs: ["mylib.cpp"],
8093 shared_libs: ["myotherlib"],
8094 system_shared_libs: [],
8095 stl: "none",
8096 apex_available: [
8097 "myapex",
8098 "//apex_available:platform",
8099 ],
8100 }
8101
8102 cc_prebuilt_library_shared {
8103 name: "myotherlib",
8104 srcs: ["prebuilt.so"],
8105 system_shared_libs: [],
8106 stl: "none",
8107 apex_available: [
8108 "myapex",
8109 "//apex_available:platform",
8110 ],
8111 }
8112 `)
8113
Jooyung Hana0503a52023-08-23 13:12:50 +09008114 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008115 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008116 var builder strings.Builder
8117 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8118 androidMk := builder.String()
8119 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008120 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008121 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8122 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8123 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008124 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008125}
8126
Jooyung Han643adc42020-02-27 13:50:06 +09008127func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008128 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008129 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008130 apex {
8131 name: "myapex",
8132 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008133 binaries: ["mybin"],
8134 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008135 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008136 }
8137
8138 apex_key {
8139 name: "myapex.key",
8140 public_key: "testkey.avbpubkey",
8141 private_key: "testkey.pem",
8142 }
8143
8144 cc_library {
8145 name: "mylib",
8146 srcs: ["mylib.cpp"],
8147 shared_libs: ["mylib2"],
8148 system_shared_libs: [],
8149 stl: "none",
8150 apex_available: [ "myapex" ],
8151 }
8152
8153 cc_library {
8154 name: "mylib2",
8155 srcs: ["mylib.cpp"],
8156 system_shared_libs: [],
8157 stl: "none",
8158 apex_available: [ "myapex" ],
8159 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008160
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008161 // Used as both a JNI library and a regular shared library.
8162 cc_library {
8163 name: "mylib3",
8164 srcs: ["mylib.cpp"],
8165 system_shared_libs: [],
8166 stl: "none",
8167 apex_available: [ "myapex" ],
8168 }
8169
8170 cc_binary {
8171 name: "mybin",
8172 srcs: ["mybin.cpp"],
8173 shared_libs: ["mylib3"],
8174 system_shared_libs: [],
8175 stl: "none",
8176 apex_available: [ "myapex" ],
8177 }
8178
Jiyong Park34d5c332022-02-24 18:02:44 +09008179 rust_ffi_shared {
8180 name: "libfoo.rust",
8181 crate_name: "foo",
8182 srcs: ["foo.rs"],
8183 shared_libs: ["libfoo.shared_from_rust"],
8184 prefer_rlib: true,
8185 apex_available: ["myapex"],
8186 }
8187
8188 cc_library_shared {
8189 name: "libfoo.shared_from_rust",
8190 srcs: ["mylib.cpp"],
8191 system_shared_libs: [],
8192 stl: "none",
8193 stubs: {
8194 versions: ["10", "11", "12"],
8195 },
8196 }
8197
Jooyung Han643adc42020-02-27 13:50:06 +09008198 `)
8199
Jooyung Hana0503a52023-08-23 13:12:50 +09008200 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008201 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008202 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008203 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008204 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008205 "lib64/mylib.so",
8206 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008207 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008208 "lib64/libfoo.rust.so",
8209 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8210 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008211 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008212
8213 // b/220397949
8214 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008215}
8216
Jooyung Han49f67012020-04-17 13:43:10 +09008217func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008218 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008219 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008220 apex {
8221 name: "myapex",
8222 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008223 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008224 }
8225 apex_key {
8226 name: "myapex.key",
8227 public_key: "testkey.avbpubkey",
8228 private_key: "testkey.pem",
8229 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008230 `,
8231 android.FixtureModifyConfig(func(config android.Config) {
8232 delete(config.Targets, android.Android)
8233 config.AndroidCommonTarget = android.Target{}
8234 }),
8235 )
Jooyung Han49f67012020-04-17 13:43:10 +09008236
8237 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8238 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8239 }
8240}
8241
Jiyong Parkbd159612020-02-28 15:22:21 +09008242func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008243 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008244 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008245 apex {
8246 name: "myapex",
8247 key: "myapex.key",
8248 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008249 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008250 }
8251
8252 apex_key {
8253 name: "myapex.key",
8254 public_key: "testkey.avbpubkey",
8255 private_key: "testkey.pem",
8256 }
8257
8258 android_app {
8259 name: "AppFoo",
8260 srcs: ["foo/bar/MyClass.java"],
8261 sdk_version: "none",
8262 system_modules: "none",
8263 apex_available: [ "myapex" ],
8264 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008265 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008266
Jooyung Hana0503a52023-08-23 13:12:50 +09008267 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008268 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008269
8270 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008271 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 +09008272}
8273
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008274func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008275 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008276 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008277 apex {
8278 name: "myapex",
8279 key: "myapex.key",
8280 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008281 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008282 }
8283
8284 apex_key {
8285 name: "myapex.key",
8286 public_key: "testkey.avbpubkey",
8287 private_key: "testkey.pem",
8288 }
8289
8290 android_app_set {
8291 name: "AppSet",
8292 set: "AppSet.apks",
8293 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008294 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008295 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008296 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008297 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8298 s := mod.Rule("apexRule").Args["copy_commands"]
8299 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008300 if len(copyCmds) != 4 {
8301 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008302 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008303 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8304 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008305 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8306 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008307
8308 // Ensure that canned_fs_config has an entry for the app set zip file
8309 generateFsRule := mod.Rule("generateFsConfig")
8310 cmd := generateFsRule.RuleParams.Command
8311 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008312}
8313
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008314func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008315 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008316 apex_set {
8317 name: "myapex",
8318 filename: "foo_v2.apex",
8319 sanitized: {
8320 none: { set: "myapex.apks", },
8321 hwaddress: { set: "myapex.hwasan.apks", },
8322 },
Paul Duffin24704672021-04-06 16:09:30 +01008323 }
8324 `
8325 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008326
Paul Duffin24704672021-04-06 16:09:30 +01008327 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008328 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008329
Spandan Das9d6e2092024-09-21 02:50:00 +00008330 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008331 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008332
Paul Duffin24704672021-04-06 16:09:30 +01008333 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8334
8335 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008336 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8337 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008338
8339 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008340}
8341
Pranav Guptaeba03b02022-09-27 00:27:08 +00008342func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008343 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008344 ctx := testApex(t, `
8345 apex_set {
8346 name: "myapex",
8347 set: ":myapex_apks_file",
8348 }
8349
8350 filegroup {
8351 name: "myapex_apks_file",
8352 srcs: ["myapex.apks"],
8353 }
8354 `)
8355
Spandan Das9d6e2092024-09-21 02:50:00 +00008356 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008357
8358 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008359 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008360 extractedApex := m.Output(extractorOutput)
8361
8362 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8363}
8364
Paul Duffin89f570a2021-06-16 01:42:33 +01008365func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008366 t.Helper()
8367
Paul Duffin55607122021-03-30 23:32:51 +01008368 fs := android.MockFS{
8369 "a.java": nil,
8370 "a.jar": nil,
8371 "apex_manifest.json": nil,
8372 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008373 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008374 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8375 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8376 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008377 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008378 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008379
Paul Duffin55607122021-03-30 23:32:51 +01008380 errorHandler := android.FixtureExpectsNoErrors
8381 if errmsg != "" {
8382 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008383 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008384
Paul Duffin55607122021-03-30 23:32:51 +01008385 result := android.GroupFixturePreparers(
8386 cc.PrepareForTestWithCcDefaultModules,
8387 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008388 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008389 java.PrepareForTestWithJavaSdkLibraryFiles,
8390 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008391 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008392 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008393 android.FixtureModifyMockFS(func(fs android.MockFS) {
8394 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8395 insert := ""
8396 for _, fragment := range fragments {
8397 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8398 }
8399 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8400 platform_bootclasspath {
8401 name: "platform-bootclasspath",
8402 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008403 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008404 %s
8405 ],
8406 }
8407 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008408 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008409 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008410 // Dexpreopt for boot jars requires the ART boot image profile.
8411 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8412 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008413 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008414 ).
8415 ExtendWithErrorHandler(errorHandler).
8416 RunTestWithBp(t, bp)
8417
8418 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008419}
8420
Jooyung Han548640b2020-04-27 12:10:30 +09008421func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008422 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008423 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8424 apex {
8425 name: "myapex",
8426 key: "myapex.key",
8427 updatable: true,
8428 }
8429
8430 apex_key {
8431 name: "myapex.key",
8432 public_key: "testkey.avbpubkey",
8433 private_key: "testkey.pem",
8434 }
8435 `)
8436}
8437
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008438func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008439 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008440 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8441 apex {
8442 name: "myapex",
8443 key: "myapex.key",
8444 }
8445
8446 apex_key {
8447 name: "myapex.key",
8448 public_key: "testkey.avbpubkey",
8449 private_key: "testkey.pem",
8450 }
8451 `)
8452}
8453
satayevb98371c2021-06-15 16:49:50 +01008454func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008455 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008456 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8457 apex {
8458 name: "myapex",
8459 key: "myapex.key",
8460 systemserverclasspath_fragments: [
8461 "mysystemserverclasspathfragment",
8462 ],
8463 min_sdk_version: "29",
8464 updatable: true,
8465 }
8466
8467 apex_key {
8468 name: "myapex.key",
8469 public_key: "testkey.avbpubkey",
8470 private_key: "testkey.pem",
8471 }
8472
8473 java_library {
8474 name: "foo",
8475 srcs: ["b.java"],
8476 min_sdk_version: "29",
8477 installable: true,
8478 apex_available: [
8479 "myapex",
8480 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008481 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008482 }
8483
8484 systemserverclasspath_fragment {
8485 name: "mysystemserverclasspathfragment",
8486 generate_classpaths_proto: false,
8487 contents: [
8488 "foo",
8489 ],
8490 apex_available: [
8491 "myapex",
8492 ],
8493 }
satayevabcd5972021-08-06 17:49:46 +01008494 `,
8495 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8496 )
satayevb98371c2021-06-15 16:49:50 +01008497}
8498
Paul Duffin064b70c2020-11-02 17:32:38 +00008499func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008500 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008501 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008502 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008503 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008504 fragment := java.ApexVariantReference{
8505 Apex: proptools.StringPtr("myapex"),
8506 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8507 }
8508
Paul Duffin064b70c2020-11-02 17:32:38 +00008509 testDexpreoptWithApexes(t, `
8510 prebuilt_apex {
8511 name: "myapex" ,
8512 arch: {
8513 arm64: {
8514 src: "myapex-arm64.apex",
8515 },
8516 arm: {
8517 src: "myapex-arm.apex",
8518 },
8519 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008520 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8521 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008522
Paul Duffin89f570a2021-06-16 01:42:33 +01008523 prebuilt_bootclasspath_fragment {
8524 name: "my-bootclasspath-fragment",
8525 contents: ["libfoo"],
8526 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008527 hidden_api: {
8528 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8529 metadata: "my-bootclasspath-fragment/metadata.csv",
8530 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008531 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8532 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8533 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008534 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008535 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008536
Spandan Das52c01a12024-09-20 01:09:48 +00008537 java_sdk_library_import {
8538 name: "libfoo",
8539 prefer: true,
8540 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008541 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008542 },
8543 apex_available: ["myapex"],
8544 shared_library: false,
8545 permitted_packages: ["libfoo"],
8546 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008547 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008548 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008549}
8550
Spandan Dasf14e2542021-11-12 00:01:37 +00008551func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008552 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008553 bp += `
8554 apex_key {
8555 name: "myapex.key",
8556 public_key: "testkey.avbpubkey",
8557 private_key: "testkey.pem",
8558 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008559 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008560 "lib1/src/A.java": nil,
8561 "lib2/src/B.java": nil,
8562 "system/sepolicy/apex/myapex-file_contexts": nil,
8563 }
8564
Paul Duffin45338f02021-03-30 23:07:52 +01008565 errorHandler := android.FixtureExpectsNoErrors
8566 if errmsg != "" {
8567 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008568 }
Colin Crossae8600b2020-10-29 17:09:13 -07008569
Paul Duffin45338f02021-03-30 23:07:52 +01008570 android.GroupFixturePreparers(
8571 android.PrepareForTestWithAndroidBuildComponents,
8572 java.PrepareForTestWithJavaBuildComponents,
8573 PrepareForTestWithApexBuildComponents,
8574 android.PrepareForTestWithNeverallowRules(rules),
8575 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008576 apexBootJars := make([]string, 0, len(bootJars))
8577 for _, apexBootJar := range bootJars {
8578 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008579 }
satayevd604b212021-07-21 14:23:52 +01008580 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008581 }),
8582 fs.AddToFixture(),
8583 ).
8584 ExtendWithErrorHandler(errorHandler).
8585 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008586}
8587
8588func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008589 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008590 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008591 name string
8592 expectedError string
8593 bp string
8594 bootJars []string
8595 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008596 }{
8597
8598 {
8599 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8600 expectedError: "",
8601 bp: `
8602 java_library {
8603 name: "bcp_lib1",
8604 srcs: ["lib1/src/*.java"],
8605 permitted_packages: ["foo.bar"],
8606 apex_available: ["myapex"],
8607 sdk_version: "none",
8608 system_modules: "none",
8609 }
8610 java_library {
8611 name: "nonbcp_lib2",
8612 srcs: ["lib2/src/*.java"],
8613 apex_available: ["myapex"],
8614 permitted_packages: ["a.b"],
8615 sdk_version: "none",
8616 system_modules: "none",
8617 }
8618 apex {
8619 name: "myapex",
8620 key: "myapex.key",
8621 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008622 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008623 }`,
8624 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008625 bcpPermittedPackages: map[string][]string{
8626 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008627 "foo.bar",
8628 },
8629 },
8630 },
8631 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008632 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008633 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 +01008634 bp: `
8635 java_library {
8636 name: "bcp_lib1",
8637 srcs: ["lib1/src/*.java"],
8638 apex_available: ["myapex"],
8639 permitted_packages: ["foo.bar"],
8640 sdk_version: "none",
8641 system_modules: "none",
8642 }
8643 java_library {
8644 name: "bcp_lib2",
8645 srcs: ["lib2/src/*.java"],
8646 apex_available: ["myapex"],
8647 permitted_packages: ["foo.bar", "bar.baz"],
8648 sdk_version: "none",
8649 system_modules: "none",
8650 }
8651 apex {
8652 name: "myapex",
8653 key: "myapex.key",
8654 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008655 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008656 }
8657 `,
8658 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008659 bcpPermittedPackages: map[string][]string{
8660 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008661 "foo.bar",
8662 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008663 "bcp_lib2": []string{
8664 "foo.bar",
8665 },
8666 },
8667 },
8668 {
8669 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8670 expectedError: "",
8671 bp: `
8672 java_library {
8673 name: "bcp_lib_restricted",
8674 srcs: ["lib1/src/*.java"],
8675 apex_available: ["myapex"],
8676 permitted_packages: ["foo.bar"],
8677 sdk_version: "none",
8678 min_sdk_version: "29",
8679 system_modules: "none",
8680 }
8681 java_library {
8682 name: "bcp_lib_unrestricted",
8683 srcs: ["lib2/src/*.java"],
8684 apex_available: ["myapex"],
8685 permitted_packages: ["foo.bar", "bar.baz"],
8686 sdk_version: "none",
8687 min_sdk_version: "29",
8688 system_modules: "none",
8689 }
8690 apex {
8691 name: "myapex",
8692 key: "myapex.key",
8693 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8694 updatable: true,
8695 min_sdk_version: "29",
8696 }
8697 `,
8698 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8699 bcpPermittedPackages: map[string][]string{
8700 "bcp_lib1_non_updateable": []string{
8701 "foo.bar",
8702 },
8703 // 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 +01008704 },
8705 },
8706 }
8707 for _, tc := range testcases {
8708 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008709 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008710 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8711 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008712 })
8713 }
8714}
8715
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008716// TODO(jungjw): Move this to proptools
8717func intPtr(i int) *int {
8718 return &i
8719}
8720
8721func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008722 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008723 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008724 apex_set {
8725 name: "myapex",
8726 set: "myapex.apks",
8727 filename: "foo_v2.apex",
8728 overrides: ["foo"],
8729 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008730 `,
8731 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8732 variables.Platform_sdk_version = intPtr(30)
8733 }),
8734 android.FixtureModifyConfig(func(config android.Config) {
8735 config.Targets[android.Android] = []android.Target{
8736 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8737 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8738 }
8739 }),
8740 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008741
Spandan Das9d6e2092024-09-21 02:50:00 +00008742 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008743
8744 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008745 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008746 actual := extractedApex.Args["abis"]
8747 expected := "ARMEABI_V7A,ARM64_V8A"
8748 if actual != expected {
8749 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8750 }
8751 actual = extractedApex.Args["sdk-version"]
8752 expected = "30"
8753 if actual != expected {
8754 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8755 }
8756
Paul Duffin6717d882021-06-15 19:09:41 +01008757 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008758 a := m.Module().(*ApexSet)
8759 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008760 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008761 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8762 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8763 }
8764}
8765
Anton Hansson805e0a52022-11-25 14:06:46 +00008766func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008767 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008768 ctx := testApex(t, `
8769 apex_set {
8770 name: "myapex",
8771 set: "myapex.apks",
8772 filename: "foo_v2.apex",
8773 overrides: ["foo"],
8774 }
8775 `,
8776 android.FixtureModifyConfig(func(config android.Config) {
8777 config.Targets[android.Android] = []android.Target{
8778 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8779 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8780 }
8781 }),
8782 )
8783
Spandan Das9d6e2092024-09-21 02:50:00 +00008784 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008785
8786 // Check extract_apks tool parameters. No native bridge arch expected
8787 extractedApex := m.Output("extracted/myapex.apks")
8788 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8789}
8790
Jiyong Park7d95a512020-05-10 15:16:24 +09008791func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008792 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008793 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8794 apex {
8795 name: "myapex",
8796 key: "myapex.key",
8797 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008798 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008799 }
8800
8801 apex_key {
8802 name: "myapex.key",
8803 public_key: "testkey.avbpubkey",
8804 private_key: "testkey.pem",
8805 }
8806
8807 cc_library {
8808 name: "mylib",
8809 srcs: ["mylib.cpp"],
8810 static_libs: ["otherlib"],
8811 system_shared_libs: [],
8812 stl: "none",
8813 apex_available: [ "myapex" ],
8814 }
8815
8816 cc_library {
8817 name: "otherlib",
8818 srcs: ["mylib.cpp"],
8819 system_shared_libs: [],
8820 stl: "none",
8821 stubs: {
8822 versions: ["1", "2", "3"],
8823 },
8824 apex_available: [ "myapex" ],
8825 }
8826 `)
8827}
8828
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008829func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008830 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008831 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008832 apex {
8833 name: "myapex",
8834 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008835 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008836 custom_sign_tool: "sign_myapex",
8837 }
8838
8839 apex_key {
8840 name: "myapex.key",
8841 public_key: "testkey.avbpubkey",
8842 private_key: "testkey.pem",
8843 }
8844 `)
8845
Jooyung Han286957d2023-10-30 16:17:56 +09008846 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008847 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008848 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 +09008849}
8850
8851func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008852 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008853 ctx := testApex(t, `
8854 apex {
8855 name: "myapex",
8856 key: "myapex.key",
8857 updatable: false,
8858 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008859 }
8860
8861 apex_key {
8862 name: "myapex.key",
8863 public_key: "testkey.avbpubkey",
8864 private_key: "testkey.pem",
8865 }
8866
8867 prebuilt_apex {
8868 name: "myapex",
8869 prefer: true,
8870 arch: {
8871 arm64: {
8872 src: "myapex-arm64.apex",
8873 },
8874 arm: {
8875 src: "myapex-arm.apex",
8876 },
8877 },
8878 }
8879
8880 apex_set {
8881 name: "myapex_set",
8882 set: "myapex.apks",
8883 filename: "myapex_set.apex",
8884 overrides: ["myapex"],
8885 }
8886 `)
8887
Colin Crossf61d03d2023-11-02 16:56:39 -07008888 content := android.ContentFromFileRuleForTests(t, ctx,
8889 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008890 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 -07008891 content = android.ContentFromFileRuleForTests(t, ctx,
8892 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008893 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 +09008894}
8895
Jooyung Han938b5932020-06-20 12:47:47 +09008896func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008898 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008899 apex {
8900 name: "myapex",
8901 key: "myapex.key",
8902 apps: ["app"],
8903 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008904 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008905 }
8906
8907 apex_key {
8908 name: "myapex.key",
8909 public_key: "testkey.avbpubkey",
8910 private_key: "testkey.pem",
8911 }
8912
8913 android_app {
8914 name: "app",
8915 srcs: ["foo/bar/MyClass.java"],
8916 package_name: "foo",
8917 sdk_version: "none",
8918 system_modules: "none",
8919 apex_available: [ "myapex" ],
8920 }
8921 `, withFiles(map[string][]byte{
8922 "sub/Android.bp": []byte(`
8923 override_apex {
8924 name: "override_myapex",
8925 base: "myapex",
8926 apps: ["override_app"],
8927 allowed_files: ":allowed",
8928 }
8929 // Overridable "path" property should be referenced indirectly
8930 filegroup {
8931 name: "allowed",
8932 srcs: ["allowed.txt"],
8933 }
8934 override_android_app {
8935 name: "override_app",
8936 base: "app",
8937 package_name: "bar",
8938 }
8939 `),
8940 }))
8941
Jooyung Hana0503a52023-08-23 13:12:50 +09008942 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008943 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8944 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8945 }
8946
Spandan Das50801e22024-05-13 18:29:45 +00008947 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008948 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8949 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8950 }
8951}
8952
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008953func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008954 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008955 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008956 apex {
8957 name: "myapex",
8958 key: "myapex.key",
8959 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008960 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008961 }
8962
8963 apex_key {
8964 name: "myapex.key",
8965 public_key: "testkey.avbpubkey",
8966 private_key: "testkey.pem",
8967 }
8968
8969 cc_library {
8970 name: "mylib",
8971 srcs: ["mylib.cpp"],
8972 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008973 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008974 },
8975 apex_available: ["myapex"],
8976 }
8977
8978 cc_prebuilt_library_shared {
8979 name: "mylib",
8980 prefer: false,
8981 srcs: ["prebuilt.so"],
8982 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008983 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008984 },
8985 apex_available: ["myapex"],
8986 }
8987 `)
8988}
8989
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008990func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008992 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008993 apex {
8994 name: "myapex",
8995 key: "myapex.key",
8996 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008997 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008998 }
8999 apex_key {
9000 name: "myapex.key",
9001 public_key: "testkey.avbpubkey",
9002 private_key: "testkey.pem",
9003 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009004 `,
9005 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9006 variables.CompressedApex = proptools.BoolPtr(true)
9007 }),
9008 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009009
Jooyung Hana0503a52023-08-23 13:12:50 +09009010 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009011 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9012
Jooyung Hana0503a52023-08-23 13:12:50 +09009013 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009014 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9015
9016 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009017 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009018 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9019
9020 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009021 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009022 var builder strings.Builder
9023 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9024 androidMk := builder.String()
9025 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9026}
9027
Jooyung Han26ec8482024-07-31 15:04:05 +09009028func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009029 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009030 for _, compressionEnabled := range []bool{true, false} {
9031 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009032 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009033 ctx := testApex(t, `
9034 apex_set {
9035 name: "com.company.android.myapex",
9036 apex_name: "com.android.myapex",
9037 set: "company-myapex.apks",
9038 }
9039 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9040 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9041 }),
9042 )
9043
9044 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9045 if compressionEnabled {
9046 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9047 } else {
9048 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9049 }
9050 })
9051 }
9052}
9053
Martin Stjernholm2856c662020-12-02 15:03:42 +00009054func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009055 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009056 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009057 apex {
9058 name: "myapex",
9059 key: "myapex.key",
9060 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009061 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009062 }
9063
9064 apex_key {
9065 name: "myapex.key",
9066 public_key: "testkey.avbpubkey",
9067 private_key: "testkey.pem",
9068 }
9069
9070 cc_library {
9071 name: "mylib",
9072 srcs: ["mylib.cpp"],
9073 apex_available: ["myapex"],
9074 shared_libs: ["otherlib"],
9075 system_shared_libs: [],
9076 }
9077
9078 cc_library {
9079 name: "otherlib",
9080 srcs: ["mylib.cpp"],
9081 stubs: {
9082 versions: ["current"],
9083 },
9084 }
9085
9086 cc_prebuilt_library_shared {
9087 name: "otherlib",
9088 prefer: true,
9089 srcs: ["prebuilt.so"],
9090 stubs: {
9091 versions: ["current"],
9092 },
9093 }
9094 `)
9095
Jooyung Hana0503a52023-08-23 13:12:50 +09009096 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009097 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009098 var builder strings.Builder
9099 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9100 androidMk := builder.String()
9101
9102 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9103 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009104 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009105}
9106
Jiyong Parke3867542020-12-03 17:28:25 +09009107func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009108 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009109 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009110 apex {
9111 name: "myapex",
9112 key: "myapex.key",
9113 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009114 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009115 }
9116
9117 apex_key {
9118 name: "myapex.key",
9119 public_key: "testkey.avbpubkey",
9120 private_key: "testkey.pem",
9121 }
9122
9123 cc_library {
9124 name: "mylib",
9125 srcs: ["mylib.cpp"],
9126 system_shared_libs: [],
9127 stl: "none",
9128 apex_available: ["myapex"],
9129 shared_libs: ["mylib2"],
9130 target: {
9131 apex: {
9132 exclude_shared_libs: ["mylib2"],
9133 },
9134 },
9135 }
9136
9137 cc_library {
9138 name: "mylib2",
9139 srcs: ["mylib.cpp"],
9140 system_shared_libs: [],
9141 stl: "none",
9142 }
9143 `)
9144
9145 // Check if mylib is linked to mylib2 for the non-apex target
9146 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9147 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9148
9149 // Make sure that the link doesn't occur for the apex target
9150 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9151 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9152
9153 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009154 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009155 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9156}
9157
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009158func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009159 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009160 bpBase := `
9161 apex {
9162 name: "myapex",
9163 key: "myapex.key",
9164 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009165 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009166 }
9167 apex_key {
9168 name: "myapex.key",
9169 public_key: "testkey.avbpubkey",
9170 private_key: "testkey.pem",
9171 }
9172 cc_library {
9173 name: "mylib",
9174 srcs: ["mylib.cpp"],
9175 apex_available: ["myapex"],
9176 shared_libs: ["stublib"],
9177 system_shared_libs: [],
9178 }
9179 apex {
9180 name: "otherapex",
9181 enabled: %s,
9182 key: "myapex.key",
9183 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009184 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009185 }
9186 `
9187
9188 stublibSourceBp := `
9189 cc_library {
9190 name: "stublib",
9191 srcs: ["mylib.cpp"],
9192 apex_available: ["otherapex"],
9193 system_shared_libs: [],
9194 stl: "none",
9195 stubs: {
9196 versions: ["1"],
9197 },
9198 }
9199 `
9200
9201 stublibPrebuiltBp := `
9202 cc_prebuilt_library_shared {
9203 name: "stublib",
9204 srcs: ["prebuilt.so"],
9205 apex_available: ["otherapex"],
9206 stubs: {
9207 versions: ["1"],
9208 },
9209 %s
9210 }
9211 `
9212
9213 tests := []struct {
9214 name string
9215 stublibBp string
9216 usePrebuilt bool
9217 modNames []string // Modules to collect AndroidMkEntries for
9218 otherApexEnabled []string
9219 }{
9220 {
9221 name: "only_source",
9222 stublibBp: stublibSourceBp,
9223 usePrebuilt: false,
9224 modNames: []string{"stublib"},
9225 otherApexEnabled: []string{"true", "false"},
9226 },
9227 {
9228 name: "source_preferred",
9229 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9230 usePrebuilt: false,
9231 modNames: []string{"stublib", "prebuilt_stublib"},
9232 otherApexEnabled: []string{"true", "false"},
9233 },
9234 {
9235 name: "prebuilt_preferred",
9236 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9237 usePrebuilt: true,
9238 modNames: []string{"stublib", "prebuilt_stublib"},
9239 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9240 },
9241 {
9242 name: "only_prebuilt",
9243 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9244 usePrebuilt: true,
9245 modNames: []string{"stublib"},
9246 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9247 },
9248 }
9249
9250 for _, test := range tests {
9251 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009252 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009253 for _, otherApexEnabled := range test.otherApexEnabled {
9254 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009255 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009256 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009257
9258 type modAndMkEntries struct {
9259 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009260 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009261 }
9262 entries := []*modAndMkEntries{}
9263
9264 // Gather shared lib modules that are installable
9265 for _, modName := range test.modNames {
9266 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9267 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9268 continue
9269 }
9270 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009271 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009272 continue
9273 }
Yu Liue70976d2024-10-15 20:45:35 +00009274 info := android.AndroidMkInfoForTest(t, ctx, mod)
9275 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9276 ents = append(ents, info.ExtraInfo...)
9277 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009278 if ent.Disabled {
9279 continue
9280 }
9281 entries = append(entries, &modAndMkEntries{
9282 mod: mod,
9283 mkEntries: ent,
9284 })
9285 }
9286 }
9287 }
9288
9289 var entry *modAndMkEntries = nil
9290 for _, ent := range entries {
9291 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9292 if entry != nil {
9293 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9294 } else {
9295 entry = ent
9296 }
9297 }
9298 }
9299
9300 if entry == nil {
9301 t.Errorf("AndroidMk entry for \"stublib\" missing")
9302 } else {
9303 isPrebuilt := entry.mod.Prebuilt() != nil
9304 if isPrebuilt != test.usePrebuilt {
9305 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9306 }
9307 if !entry.mod.IsStubs() {
9308 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9309 }
9310 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9311 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9312 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009313 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009314 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009315 if !android.InList(expected, cflags) {
9316 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9317 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009318 }
9319 })
9320 }
9321 })
9322 }
9323}
9324
Colin Crossc33e5212021-05-25 18:16:02 -07009325func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009326 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009327 bp := `
9328 apex {
9329 name: "myapex",
9330 key: "myapex.key",
9331 java_libs: ["mylib"],
9332 bootclasspath_fragments: ["mybootclasspathfragment"],
9333 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9334 updatable: false,
9335 }
9336
9337 apex_key {
9338 name: "myapex.key",
9339 public_key: "testkey.avbpubkey",
9340 private_key: "testkey.pem",
9341 }
9342
9343 java_library {
9344 name: "mylib",
9345 srcs: ["mylib.java"],
9346 apex_available: ["myapex"],
9347 compile_dex: true,
9348 }
9349
9350 bootclasspath_fragment {
9351 name: "mybootclasspathfragment",
9352 contents: ["mybootclasspathlib"],
9353 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009354 hidden_api: {
9355 split_packages: ["*"],
9356 },
Colin Crossc33e5212021-05-25 18:16:02 -07009357 }
9358
9359 java_library {
9360 name: "mybootclasspathlib",
9361 srcs: ["mybootclasspathlib.java"],
9362 apex_available: ["myapex"],
9363 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009364 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009365 }
9366
9367 systemserverclasspath_fragment {
9368 name: "mysystemserverclasspathfragment",
9369 contents: ["mysystemserverclasspathlib"],
9370 apex_available: ["myapex"],
9371 }
9372
9373 java_library {
9374 name: "mysystemserverclasspathlib",
9375 srcs: ["mysystemserverclasspathlib.java"],
9376 apex_available: ["myapex"],
9377 compile_dex: true,
9378 }
9379 `
9380
9381 result := android.GroupFixturePreparers(
9382 PrepareForTestWithApexBuildComponents,
9383 prepareForTestWithMyapex,
9384 java.PrepareForTestWithJavaDefaultModules,
9385 android.PrepareForTestWithAndroidBuildComponents,
9386 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009387 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9388 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009389 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009390 ).RunTest(t)
9391
9392 // Make sure jacoco ran on both mylib and mybootclasspathlib
9393 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9394 t.Errorf("Failed to find jacoco rule for mylib")
9395 }
9396 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9397 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9398 }
9399 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9400 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9401 }
9402}
9403
Jiyong Park192600a2021-08-03 07:52:17 +00009404func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009405 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009406 testApexError(t, `executable mybin is static`, `
9407 apex {
9408 name: "myapex",
9409 key: "myapex.key",
9410 binaries: ["mybin"],
9411 min_sdk_version: "29",
9412 }
9413
9414 apex_key {
9415 name: "myapex.key",
9416 public_key: "testkey.avbpubkey",
9417 private_key: "testkey.pem",
9418 }
9419
9420 cc_binary {
9421 name: "mybin",
9422 srcs: ["mylib.cpp"],
9423 relative_install_path: "foo/bar",
9424 static_executable: true,
9425 system_shared_libs: [],
9426 stl: "none",
9427 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009428 min_sdk_version: "29",
9429 }
9430 `)
9431
9432 testApexError(t, `executable mybin.rust is static`, `
9433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 binaries: ["mybin.rust"],
9437 min_sdk_version: "29",
9438 }
9439
9440 apex_key {
9441 name: "myapex.key",
9442 public_key: "testkey.avbpubkey",
9443 private_key: "testkey.pem",
9444 }
9445
9446 rust_binary {
9447 name: "mybin.rust",
9448 srcs: ["foo.rs"],
9449 static_executable: true,
9450 apex_available: ["myapex"],
9451 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009452 }
9453 `)
9454}
9455
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009456func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009457 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009458 ctx := testApex(t, `
9459 apex {
9460 name: "myapex",
9461 key: "myapex.key",
9462 updatable: false,
9463 java_libs: ["foo"],
9464 }
9465
9466 apex_key {
9467 name: "myapex.key",
9468 public_key: "testkey.avbpubkey",
9469 private_key: "testkey.pem",
9470 }
9471
9472 java_library {
9473 name: "foo",
9474 srcs: ["foo.java"],
9475 apex_available: ["myapex"],
9476 installable: true,
9477 }
9478 `,
9479 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9480 )
9481
Jooyung Hana0503a52023-08-23 13:12:50 +09009482 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009483 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9484 var builder strings.Builder
9485 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9486 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009487 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 +00009488}
9489
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009490func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009491 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009492 ctx := testApex(t, `
9493 apex {
9494 name: "myapex",
9495 key: "myapex.key",
9496 updatable: false,
9497 java_libs: ["foo"],
9498 required: ["otherapex"],
9499 }
9500
9501 apex {
9502 name: "otherapex",
9503 key: "myapex.key",
9504 updatable: false,
9505 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009506 }
9507
9508 apex_key {
9509 name: "myapex.key",
9510 public_key: "testkey.avbpubkey",
9511 private_key: "testkey.pem",
9512 }
9513
9514 java_library {
9515 name: "foo",
9516 srcs: ["foo.java"],
9517 apex_available: ["myapex", "otherapex"],
9518 installable: true,
9519 }
9520 `)
9521
Jooyung Hana0503a52023-08-23 13:12:50 +09009522 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009523 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9524 var builder strings.Builder
9525 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9526 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009527 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009528}
9529
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009530func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009531 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009532 ctx := testApex(t, `
9533 apex {
9534 name: "myapex",
9535 key: "myapex.key",
9536 updatable: false,
9537 }
9538
9539 apex_key {
9540 name: "myapex.key",
9541 public_key: "testkey.avbpubkey",
9542 private_key: "testkey.pem",
9543 }
9544 `)
9545
Jooyung Hana0503a52023-08-23 13:12:50 +09009546 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009547 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009548 data := android.AndroidMkDataForTest(t, ctx, bundle)
9549 var builder strings.Builder
9550 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9551 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009552 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009553}
9554
Jooyung Hana6d36672022-02-24 13:58:07 +09009555func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009556 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009557 for _, tc := range []struct {
9558 name string
9559 ref string
9560 expected_data []string
9561 }{
9562 {
9563 name: "test_using_output",
9564 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009565 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009566 },
9567 {
9568 name: "test_using_apex",
9569 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009570 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009571 },
9572 } {
9573 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009574 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009575 ctx := testApex(t, `
9576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 compressible: true,
9580 updatable: false,
9581 }
9582
9583 apex_key {
9584 name: "myapex.key",
9585 public_key: "testkey.avbpubkey",
9586 private_key: "testkey.pem",
9587 }
9588
9589 java_test {
9590 name: "`+tc.name+`",
9591 srcs: ["a.java"],
9592 data: ["`+tc.ref+`"],
9593 }
9594 `,
9595 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9596 variables.CompressedApex = proptools.BoolPtr(true)
9597 }))
9598 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9599 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9600 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9601 })
9602 }
9603}
9604
satayev758968a2021-12-06 11:42:40 +00009605func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009606 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009607 preparer := android.GroupFixturePreparers(
9608 PrepareForTestWithApexBuildComponents,
9609 prepareForTestWithMyapex,
9610 java.PrepareForTestWithJavaSdkLibraryFiles,
9611 java.PrepareForTestWithJavaDefaultModules,
9612 android.PrepareForTestWithAndroidBuildComponents,
9613 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9614 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9615 )
9616
9617 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9618 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009619 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009620 preparer.RunTestWithBp(t, `
9621 apex {
9622 name: "myapex",
9623 key: "myapex.key",
9624 bootclasspath_fragments: ["mybootclasspathfragment"],
9625 min_sdk_version: "30",
9626 updatable: false,
9627 }
9628
9629 apex_key {
9630 name: "myapex.key",
9631 public_key: "testkey.avbpubkey",
9632 private_key: "testkey.pem",
9633 }
9634
9635 bootclasspath_fragment {
9636 name: "mybootclasspathfragment",
9637 contents: ["mybootclasspathlib"],
9638 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009639 hidden_api: {
9640 split_packages: ["*"],
9641 },
satayev758968a2021-12-06 11:42:40 +00009642 }
9643
9644 java_sdk_library {
9645 name: "mybootclasspathlib",
9646 srcs: ["mybootclasspathlib.java"],
9647 apex_available: ["myapex"],
9648 compile_dex: true,
9649 unsafe_ignore_missing_latest_api: true,
9650 min_sdk_version: "31",
9651 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009652 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009653 }
9654
9655 java_library {
9656 name: "util",
9657 srcs: ["a.java"],
9658 apex_available: ["myapex"],
9659 min_sdk_version: "31",
9660 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009661 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009662 }
9663
9664 java_library {
9665 name: "another_util",
9666 srcs: ["a.java"],
9667 min_sdk_version: "31",
9668 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009669 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009670 }
9671 `)
9672 })
9673
9674 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9675 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009676 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009677 preparer.RunTestWithBp(t, `
9678 apex {
9679 name: "myapex",
9680 key: "myapex.key",
9681 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9682 min_sdk_version: "30",
9683 updatable: false,
9684 }
9685
9686 apex_key {
9687 name: "myapex.key",
9688 public_key: "testkey.avbpubkey",
9689 private_key: "testkey.pem",
9690 }
9691
9692 systemserverclasspath_fragment {
9693 name: "mysystemserverclasspathfragment",
9694 contents: ["mysystemserverclasspathlib"],
9695 apex_available: ["myapex"],
9696 }
9697
9698 java_sdk_library {
9699 name: "mysystemserverclasspathlib",
9700 srcs: ["mysystemserverclasspathlib.java"],
9701 apex_available: ["myapex"],
9702 compile_dex: true,
9703 min_sdk_version: "32",
9704 unsafe_ignore_missing_latest_api: true,
9705 static_libs: ["util"],
9706 }
9707
9708 java_library {
9709 name: "util",
9710 srcs: ["a.java"],
9711 apex_available: ["myapex"],
9712 min_sdk_version: "31",
9713 static_libs: ["another_util"],
9714 }
9715
9716 java_library {
9717 name: "another_util",
9718 srcs: ["a.java"],
9719 min_sdk_version: "31",
9720 apex_available: ["myapex"],
9721 }
9722 `)
9723 })
9724
9725 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009726 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009727 preparer.
satayev758968a2021-12-06 11:42:40 +00009728 RunTestWithBp(t, `
9729 apex {
9730 name: "myapex",
9731 key: "myapex.key",
9732 bootclasspath_fragments: ["mybootclasspathfragment"],
9733 min_sdk_version: "30",
9734 updatable: false,
9735 }
9736
9737 apex_key {
9738 name: "myapex.key",
9739 public_key: "testkey.avbpubkey",
9740 private_key: "testkey.pem",
9741 }
9742
9743 bootclasspath_fragment {
9744 name: "mybootclasspathfragment",
9745 contents: ["mybootclasspathlib"],
9746 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009747 hidden_api: {
9748 split_packages: ["*"],
9749 },
satayev758968a2021-12-06 11:42:40 +00009750 }
9751
9752 java_sdk_library {
9753 name: "mybootclasspathlib",
9754 srcs: ["mybootclasspathlib.java"],
9755 apex_available: ["myapex"],
9756 compile_dex: true,
9757 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009758 sdk_version: "current",
9759 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009760 }
9761 `)
9762 })
9763
9764 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009765 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009766 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9767 RunTestWithBp(t, `
9768 apex {
9769 name: "myapex",
9770 key: "myapex.key",
9771 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9772 min_sdk_version: "30",
9773 updatable: false,
9774 }
9775
9776 apex_key {
9777 name: "myapex.key",
9778 public_key: "testkey.avbpubkey",
9779 private_key: "testkey.pem",
9780 }
9781
9782 systemserverclasspath_fragment {
9783 name: "mysystemserverclasspathfragment",
9784 contents: ["mysystemserverclasspathlib"],
9785 apex_available: ["myapex"],
9786 }
9787
9788 java_sdk_library {
9789 name: "mysystemserverclasspathlib",
9790 srcs: ["mysystemserverclasspathlib.java"],
9791 apex_available: ["myapex"],
9792 compile_dex: true,
9793 unsafe_ignore_missing_latest_api: true,
9794 }
9795 `)
9796 })
9797}
9798
Jiakai Zhang6decef92022-01-12 17:56:19 +00009799// Verifies that the APEX depends on all the Make modules in the list.
9800func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9801 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9802 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009803 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009804 }
9805}
9806
9807// Verifies that the APEX does not depend on any of the Make modules in the list.
9808func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9809 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9810 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009811 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009812 }
9813}
9814
Cole Faust24e25c02024-01-19 14:12:17 -08009815func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009816 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009817 bpTemplate := `
9818 apex {
9819 name: "myapex",
9820 key: "myapex.key",
9821 java_libs: ["myjavalib"],
9822 updatable: %v,
9823 min_sdk_version: "29",
9824 }
9825 apex_key {
9826 name: "myapex.key",
9827 }
9828 java_library {
9829 name: "myjavalib",
9830 srcs: ["MyClass.java"],
9831 apex_available: [ "myapex" ],
9832 lint: {
9833 strict_updatability_linting: %v,
9834 %s
9835 },
9836 sdk_version: "current",
9837 min_sdk_version: "29",
9838 }
9839 `
9840 fs := android.MockFS{
9841 "lint-baseline.xml": nil,
9842 }
9843
9844 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009845 testCaseName string
9846 apexUpdatable bool
9847 javaStrictUpdtabilityLint bool
9848 lintFileExists bool
9849 disallowedFlagExpectedOnApex bool
9850 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009851 }{
9852 {
Colin Cross87427352024-09-25 15:41:19 -07009853 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9854 apexUpdatable: true,
9855 javaStrictUpdtabilityLint: true,
9856 lintFileExists: false,
9857 disallowedFlagExpectedOnApex: false,
9858 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009859 },
9860 {
Colin Cross87427352024-09-25 15:41:19 -07009861 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9862 apexUpdatable: false,
9863 javaStrictUpdtabilityLint: false,
9864 lintFileExists: true,
9865 disallowedFlagExpectedOnApex: false,
9866 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009867 },
9868 {
Colin Cross87427352024-09-25 15:41:19 -07009869 testCaseName: "non-updatable apex respects strict updatability of javalib",
9870 apexUpdatable: false,
9871 javaStrictUpdtabilityLint: true,
9872 lintFileExists: true,
9873 disallowedFlagExpectedOnApex: false,
9874 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009875 },
9876 {
Colin Cross87427352024-09-25 15:41:19 -07009877 testCaseName: "updatable apex checks strict updatability of javalib",
9878 apexUpdatable: true,
9879 javaStrictUpdtabilityLint: false,
9880 lintFileExists: true,
9881 disallowedFlagExpectedOnApex: true,
9882 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009883 },
9884 }
9885
9886 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009887 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009888 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009889 fixtures := []android.FixturePreparer{}
9890 baselineProperty := ""
9891 if testCase.lintFileExists {
9892 fixtures = append(fixtures, fs.AddToFixture())
9893 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9894 }
9895 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009896
Colin Cross87427352024-09-25 15:41:19 -07009897 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009898
Colin Cross87427352024-09-25 15:41:19 -07009899 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9900 if expectStrictUpdatability {
9901 if m.Rule == nil {
9902 t.Errorf("expected strict updatability check rule on %s", name)
9903 } else {
9904 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9905 m.RuleParams.Command, "--disallowed_issues NewApi")
9906 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9907 m.Inputs.Strings(), "lint-baseline.xml")
9908 }
9909 } else {
9910 if m.Rule != nil {
9911 t.Errorf("expected no strict updatability check rule on %s", name)
9912 }
9913 }
9914 }
9915
9916 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9917 apex := result.ModuleForTests("myapex", "android_common_myapex")
9918 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9919 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9920
9921 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9922 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9923 })
Cole Faust24e25c02024-01-19 14:12:17 -08009924 }
9925}
9926
Cole Faust24e25c02024-01-19 14:12:17 -08009927// checks transtive deps of an apex coming from bootclasspath_fragment
9928func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009929 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009930 bp := `
9931 apex {
9932 name: "myapex",
9933 key: "myapex.key",
9934 bootclasspath_fragments: ["mybootclasspathfragment"],
9935 updatable: true,
9936 min_sdk_version: "29",
9937 }
9938 apex_key {
9939 name: "myapex.key",
9940 }
9941 bootclasspath_fragment {
9942 name: "mybootclasspathfragment",
9943 contents: ["myjavalib"],
9944 apex_available: ["myapex"],
9945 hidden_api: {
9946 split_packages: ["*"],
9947 },
9948 }
9949 java_library {
9950 name: "myjavalib",
9951 srcs: ["MyClass.java"],
9952 apex_available: [ "myapex" ],
9953 sdk_version: "current",
9954 min_sdk_version: "29",
9955 compile_dex: true,
9956 lint: {
9957 baseline_filename: "lint-baseline.xml",
9958 }
9959 }
9960 `
9961 fs := android.MockFS{
9962 "lint-baseline.xml": nil,
9963 }
9964
9965 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -07009966 apex := result.ModuleForTests("myapex", "android_common_myapex")
9967 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
9968 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
9969 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
9970 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
9971 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -08009972}
Spandan Das66773252022-01-15 00:23:18 +00009973
Jihoon Kang784c0052024-06-25 22:15:39 +00009974func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009975 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +00009976 bp := `
9977 apex {
9978 name: "myapex",
9979 key: "myapex.key",
9980 bootclasspath_fragments: ["mybootclasspathfragment"],
9981 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009982 java_libs: [
9983 "jacocoagent",
9984 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009985 }
9986 apex_key {
9987 name: "myapex.key",
9988 }
9989 bootclasspath_fragment {
9990 name: "mybootclasspathfragment",
9991 contents: ["foo"],
9992 apex_available: ["myapex"],
9993 hidden_api: {
9994 split_packages: ["*"],
9995 },
9996 }
9997 java_sdk_library {
9998 name: "foo",
9999 srcs: ["MyClass.java"],
10000 apex_available: [ "myapex" ],
10001 sdk_version: "current",
10002 min_sdk_version: "29",
10003 compile_dex: true,
10004 }
10005 `
10006 fs := android.MockFS{
10007 "lint-baseline.xml": nil,
10008 }
10009
10010 result := android.GroupFixturePreparers(
10011 prepareForApexTest,
10012 java.PrepareForTestWithJavaSdkLibraryFiles,
10013 java.PrepareForTestWithJacocoInstrumentation,
10014 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010015 android.FixtureMergeMockFs(fs),
10016 ).RunTestWithBp(t, bp)
10017
10018 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10019 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10020 android.AssertStringDoesContain(t,
10021 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10022 lintReportInputs, "foo.impl")
10023}
10024
Spandan Das42e89502022-05-06 22:12:55 +000010025// updatable apexes should propagate updatable=true to its apps
10026func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010027 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010028 bp := `
10029 apex {
10030 name: "myapex",
10031 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010032 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010033 apps: [
10034 "myapp",
10035 ],
10036 min_sdk_version: "30",
10037 }
10038 apex_key {
10039 name: "myapex.key",
10040 }
10041 android_app {
10042 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010043 apex_available: [
10044 "myapex",
10045 ],
10046 sdk_version: "current",
10047 min_sdk_version: "30",
10048 }
10049 `
Colin Cross99939e92024-10-01 16:02:46 -070010050 _ = android.GroupFixturePreparers(
10051 prepareForApexTest,
10052 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10053 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010054}
10055
Jingwen Chendea7a642023-03-28 11:30:50 +000010056func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010057 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010058 ctx := testApex(t, `
10059 apex {
10060 name: "myapex",
10061 key: "myapex.key",
10062 updatable: false,
10063 }
10064
10065 apex_key {
10066 name: "myapex.key",
10067 public_key: "testkey.avbpubkey",
10068 private_key: "testkey.pem",
10069 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010070 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010071 generateFsRule := mod.Rule("generateFsConfig")
10072 cmd := generateFsRule.RuleParams.Command
10073
10074 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10075}
10076
10077func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010078 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010079 ctx := testApex(t, `
10080 apex {
10081 name: "myapex",
10082 key: "myapex.key",
10083 canned_fs_config: "my_config",
10084 updatable: false,
10085 }
10086
10087 apex_key {
10088 name: "myapex.key",
10089 public_key: "testkey.avbpubkey",
10090 private_key: "testkey.pem",
10091 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010092 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010093 generateFsRule := mod.Rule("generateFsConfig")
10094 cmd := generateFsRule.RuleParams.Command
10095
10096 // Ensure that canned_fs_config has "cat my_config" at the end
10097 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10098}
Spandan Das20fce2d2023-04-12 17:21:39 +000010099
10100func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010101 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010102 testCases := []struct {
10103 desc string
10104 hasStubs bool
10105 apexAvailable string
10106 expectedError string
10107 }{
10108 {
10109 desc: "non-stub library can have multiple apex_available",
10110 hasStubs: false,
10111 apexAvailable: `["myapex", "otherapex"]`,
10112 },
10113 {
10114 desc: "stub library should not be available to anyapex",
10115 hasStubs: true,
10116 apexAvailable: `["//apex_available:anyapex"]`,
10117 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10118 },
10119 {
10120 desc: "stub library should not be available to multiple apexes",
10121 hasStubs: true,
10122 apexAvailable: `["myapex", "otherapex"]`,
10123 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10124 },
10125 {
10126 desc: "stub library can be available to a core apex and a test apex",
10127 hasStubs: true,
10128 apexAvailable: `["myapex", "test_myapex"]`,
10129 },
10130 }
10131 bpTemplate := `
10132 cc_library {
10133 name: "libfoo",
10134 %v
10135 apex_available: %v,
10136 }
10137 apex {
10138 name: "myapex",
10139 key: "apex.key",
10140 updatable: false,
10141 native_shared_libs: ["libfoo"],
10142 }
10143 apex {
10144 name: "otherapex",
10145 key: "apex.key",
10146 updatable: false,
10147 }
10148 apex_test {
10149 name: "test_myapex",
10150 key: "apex.key",
10151 updatable: false,
10152 native_shared_libs: ["libfoo"],
10153 }
10154 apex_key {
10155 name: "apex.key",
10156 }
10157 `
10158 for _, tc := range testCases {
10159 stubs := ""
10160 if tc.hasStubs {
10161 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10162 }
10163 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10164 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10165 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10166 })
10167 if tc.expectedError == "" {
10168 testApex(t, bp, mockFsFixturePreparer)
10169 } else {
10170 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10171 }
10172 }
10173}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010174
10175func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010176 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010177 context := android.GroupFixturePreparers(
10178 android.PrepareForIntegrationTestWithAndroid,
10179 cc.PrepareForIntegrationTestWithCc,
10180 PrepareForTestWithApexBuildComponents,
10181 prepareForTestWithMyapex,
10182 filesystem.PrepareForTestWithFilesystemBuildComponents,
10183 )
10184 result := context.RunTestWithBp(t, `
10185 android_system_image {
10186 name: "myfilesystem",
10187 deps: [
10188 "libfoo",
10189 ],
10190 linker_config_src: "linker.config.json",
10191 }
10192
10193 cc_library {
10194 name: "libfoo",
10195 shared_libs: [
10196 "libbar",
10197 ],
10198 stl: "none",
10199 }
10200
10201 cc_library {
10202 name: "libbar",
10203 stl: "none",
10204 apex_available: ["myapex"],
10205 }
10206
10207 apex {
10208 name: "myapex",
10209 native_shared_libs: ["libbar"],
10210 key: "myapex.key",
10211 updatable: false,
10212 }
10213
10214 apex_key {
10215 name: "myapex.key",
10216 public_key: "testkey.avbpubkey",
10217 private_key: "testkey.pem",
10218 }
10219 `)
10220
Cole Faust3b806d32024-03-11 15:15:03 -070010221 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010222 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10223 inputs.Strings(),
10224 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10225}
Yu Liueae7b362023-11-16 17:05:47 -080010226
10227var apex_default_bp = `
10228 apex_key {
10229 name: "myapex.key",
10230 public_key: "testkey.avbpubkey",
10231 private_key: "testkey.pem",
10232 }
10233
10234 filegroup {
10235 name: "myapex.manifest",
10236 srcs: ["apex_manifest.json"],
10237 }
10238
10239 filegroup {
10240 name: "myapex.androidmanifest",
10241 srcs: ["AndroidManifest.xml"],
10242 }
10243`
10244
10245func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010246 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010247 ctx := testApex(t, apex_default_bp+`
10248 apex {
10249 name: "myapex",
10250 manifest: ":myapex.manifest",
10251 androidManifest: ":myapex.androidmanifest",
10252 key: "myapex.key",
10253 java_libs: [
10254 "my_java_library_foo",
10255 "my_java_library_bar",
10256 ],
10257 updatable: false,
10258 }
10259
10260 java_library {
10261 name: "my_java_library_foo",
10262 srcs: ["foo/bar/MyClass.java"],
10263 sdk_version: "none",
10264 system_modules: "none",
10265 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010266 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010267 "myapex",
10268 ],
10269 }
10270
10271 java_library {
10272 name: "my_java_library_bar",
10273 srcs: ["foo/bar/MyClass.java"],
10274 sdk_version: "none",
10275 system_modules: "none",
10276 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010277 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010278 "myapex",
10279 ],
10280 }
10281
10282 aconfig_declarations {
10283 name: "my_aconfig_declarations_foo",
10284 package: "com.example.package",
10285 container: "myapex",
10286 srcs: ["foo.aconfig"],
10287 }
10288
10289 java_aconfig_library {
10290 name: "my_java_aconfig_library_foo",
10291 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010292 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010293 "myapex",
10294 ],
10295 }
10296
10297 aconfig_declarations {
10298 name: "my_aconfig_declarations_bar",
10299 package: "com.example.package",
10300 container: "myapex",
10301 srcs: ["bar.aconfig"],
10302 }
10303
10304 java_aconfig_library {
10305 name: "my_java_aconfig_library_bar",
10306 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010307 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010308 "myapex",
10309 ],
10310 }
10311 `)
10312
10313 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10314 s := mod.Rule("apexRule").Args["copy_commands"]
10315 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010316 if len(copyCmds) != 14 {
10317 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010318 }
10319
Jooyung Hana3fddf42024-09-03 13:22:21 +090010320 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10321 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10322 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10323 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010324 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010325
Yu Liubba555e2024-02-17 00:36:42 +000010326 inputs := []string{
10327 "my_aconfig_declarations_foo/intermediate.pb",
10328 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010329 }
Yu Liubba555e2024-02-17 00:36:42 +000010330 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10331 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10332 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10333 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010334 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010335}
10336
10337func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010338 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010339 ctx := testApex(t, apex_default_bp+`
10340 apex {
10341 name: "myapex",
10342 manifest: ":myapex.manifest",
10343 androidManifest: ":myapex.androidmanifest",
10344 key: "myapex.key",
10345 java_libs: [
10346 "my_java_library_foo",
10347 ],
10348 native_shared_libs: [
10349 "my_cc_library_bar",
10350 ],
10351 binaries: [
10352 "my_cc_binary_baz",
10353 ],
10354 updatable: false,
10355 }
10356
10357 java_library {
10358 name: "my_java_library_foo",
10359 srcs: ["foo/bar/MyClass.java"],
10360 sdk_version: "none",
10361 system_modules: "none",
10362 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010363 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010364 "myapex",
10365 ],
10366 }
10367
10368 cc_library {
10369 name: "my_cc_library_bar",
10370 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010371 static_libs: [
10372 "my_cc_aconfig_library_bar",
10373 "my_cc_aconfig_library_baz",
10374 ],
Yu Liueae7b362023-11-16 17:05:47 -080010375 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010376 "myapex",
10377 ],
10378 }
10379
10380 cc_binary {
10381 name: "my_cc_binary_baz",
10382 srcs: ["foo/bar/MyClass.cc"],
10383 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010384 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010385 "myapex",
10386 ],
10387 }
10388
10389 aconfig_declarations {
10390 name: "my_aconfig_declarations_foo",
10391 package: "com.example.package",
10392 container: "myapex",
10393 srcs: ["foo.aconfig"],
10394 }
10395
10396 java_aconfig_library {
10397 name: "my_java_aconfig_library_foo",
10398 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010399 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010400 "myapex",
10401 ],
10402 }
10403
10404 aconfig_declarations {
10405 name: "my_aconfig_declarations_bar",
10406 package: "com.example.package",
10407 container: "myapex",
10408 srcs: ["bar.aconfig"],
10409 }
10410
10411 cc_aconfig_library {
10412 name: "my_cc_aconfig_library_bar",
10413 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010414 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010415 "myapex",
10416 ],
10417 }
10418
10419 aconfig_declarations {
10420 name: "my_aconfig_declarations_baz",
10421 package: "com.example.package",
10422 container: "myapex",
10423 srcs: ["baz.aconfig"],
10424 }
10425
10426 cc_aconfig_library {
10427 name: "my_cc_aconfig_library_baz",
10428 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010429 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010430 "myapex",
10431 ],
10432 }
10433
10434 cc_library {
10435 name: "server_configurable_flags",
10436 srcs: ["server_configurable_flags.cc"],
10437 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010438 cc_library {
10439 name: "libbase",
10440 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010441 apex_available: [
10442 "myapex",
10443 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010444 }
10445 cc_library {
10446 name: "libaconfig_storage_read_api_cc",
10447 srcs: ["libaconfig_storage_read_api_cc.cc"],
10448 }
Yu Liueae7b362023-11-16 17:05:47 -080010449 `)
10450
10451 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10452 s := mod.Rule("apexRule").Args["copy_commands"]
10453 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010454 if len(copyCmds) != 18 {
10455 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010456 }
10457
Jooyung Hana3fddf42024-09-03 13:22:21 +090010458 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10459 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10460 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10461 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010462 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010463
Yu Liubba555e2024-02-17 00:36:42 +000010464 inputs := []string{
10465 "my_aconfig_declarations_foo/intermediate.pb",
10466 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10467 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010468 }
Yu Liubba555e2024-02-17 00:36:42 +000010469 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10470 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10471 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10472 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010473 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010474}
10475
Yu Liucec0e412023-11-30 16:45:50 -080010476func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010477 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010478 ctx := testApex(t, apex_default_bp+`
10479 apex {
10480 name: "myapex",
10481 manifest: ":myapex.manifest",
10482 androidManifest: ":myapex.androidmanifest",
10483 key: "myapex.key",
10484 native_shared_libs: [
10485 "libmy_rust_library",
10486 ],
10487 binaries: [
10488 "my_rust_binary",
10489 ],
10490 rust_dyn_libs: [
10491 "libmy_rust_dylib",
10492 ],
10493 updatable: false,
10494 }
10495
10496 rust_library {
10497 name: "libflags_rust", // test mock
10498 crate_name: "flags_rust",
10499 srcs: ["lib.rs"],
10500 apex_available: [
10501 "myapex",
10502 ],
10503 }
10504
10505 rust_library {
10506 name: "liblazy_static", // test mock
10507 crate_name: "lazy_static",
10508 srcs: ["src/lib.rs"],
10509 apex_available: [
10510 "myapex",
10511 ],
10512 }
10513
Ted Bauer02d475c2024-03-27 20:56:26 +000010514 rust_library {
10515 name: "libaconfig_storage_read_api", // test mock
10516 crate_name: "aconfig_storage_read_api",
10517 srcs: ["src/lib.rs"],
10518 apex_available: [
10519 "myapex",
10520 ],
10521 }
10522
Ted Bauer6ef40db2024-03-29 14:04:10 +000010523 rust_library {
10524 name: "liblogger", // test mock
10525 crate_name: "logger",
10526 srcs: ["src/lib.rs"],
10527 apex_available: [
10528 "myapex",
10529 ],
10530 }
10531
10532 rust_library {
10533 name: "liblog_rust", // test mock
10534 crate_name: "log_rust",
10535 srcs: ["src/lib.rs"],
10536 apex_available: [
10537 "myapex",
10538 ],
10539 }
10540
Yu Liucec0e412023-11-30 16:45:50 -080010541 rust_ffi_shared {
10542 name: "libmy_rust_library",
10543 srcs: ["src/lib.rs"],
10544 rustlibs: ["libmy_rust_aconfig_library_foo"],
10545 crate_name: "my_rust_library",
10546 apex_available: [
10547 "myapex",
10548 ],
10549 }
10550
10551 rust_library_dylib {
10552 name: "libmy_rust_dylib",
10553 srcs: ["foo/bar/MyClass.rs"],
10554 rustlibs: ["libmy_rust_aconfig_library_bar"],
10555 crate_name: "my_rust_dylib",
10556 apex_available: [
10557 "myapex",
10558 ],
10559 }
10560
10561 rust_binary {
10562 name: "my_rust_binary",
10563 srcs: ["foo/bar/MyClass.rs"],
10564 rustlibs: [
10565 "libmy_rust_aconfig_library_baz",
10566 "libmy_rust_dylib",
10567 ],
10568 apex_available: [
10569 "myapex",
10570 ],
10571 }
10572
10573 aconfig_declarations {
10574 name: "my_aconfig_declarations_foo",
10575 package: "com.example.package",
10576 container: "myapex",
10577 srcs: ["foo.aconfig"],
10578 }
10579
10580 aconfig_declarations {
10581 name: "my_aconfig_declarations_bar",
10582 package: "com.example.package",
10583 container: "myapex",
10584 srcs: ["bar.aconfig"],
10585 }
10586
10587 aconfig_declarations {
10588 name: "my_aconfig_declarations_baz",
10589 package: "com.example.package",
10590 container: "myapex",
10591 srcs: ["baz.aconfig"],
10592 }
10593
10594 rust_aconfig_library {
10595 name: "libmy_rust_aconfig_library_foo",
10596 aconfig_declarations: "my_aconfig_declarations_foo",
10597 crate_name: "my_rust_aconfig_library_foo",
10598 apex_available: [
10599 "myapex",
10600 ],
10601 }
10602
10603 rust_aconfig_library {
10604 name: "libmy_rust_aconfig_library_bar",
10605 aconfig_declarations: "my_aconfig_declarations_bar",
10606 crate_name: "my_rust_aconfig_library_bar",
10607 apex_available: [
10608 "myapex",
10609 ],
10610 }
10611
10612 rust_aconfig_library {
10613 name: "libmy_rust_aconfig_library_baz",
10614 aconfig_declarations: "my_aconfig_declarations_baz",
10615 crate_name: "my_rust_aconfig_library_baz",
10616 apex_available: [
10617 "myapex",
10618 ],
10619 }
10620 `)
10621
10622 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10623 s := mod.Rule("apexRule").Args["copy_commands"]
10624 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010625 if len(copyCmds) != 38 {
10626 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010627 }
10628
Jooyung Hana3fddf42024-09-03 13:22:21 +090010629 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10630 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10631 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10632 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010633 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010634
Yu Liubba555e2024-02-17 00:36:42 +000010635 inputs := []string{
10636 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010637 "my_aconfig_declarations_bar/intermediate.pb",
10638 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010639 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10640 }
10641 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10642 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10643 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10644 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010645 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010646}
10647
10648func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10649 aconfigRule := mod.Description(desc)
10650 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010651 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010652 if len(aconfigArgs) != len(inputs) {
10653 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010654 }
Yu Liucec0e412023-11-30 16:45:50 -080010655
Yu Liubba555e2024-02-17 00:36:42 +000010656 ensureEquals(t, container, aconfigRule.Args["container"])
10657 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10658
10659 buildParams := aconfigRule.BuildParams
10660 for _, input := range inputs {
10661 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10662 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010663 }
Yu Liubba555e2024-02-17 00:36:42 +000010664
10665 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010666}
10667
Yu Liueae7b362023-11-16 17:05:47 -080010668func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010669 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010670 ctx := testApex(t, apex_default_bp+`
10671 apex {
10672 name: "myapex",
10673 manifest: ":myapex.manifest",
10674 androidManifest: ":myapex.androidmanifest",
10675 key: "myapex.key",
10676 java_libs: [
10677 "my_java_library_foo",
10678 "other_java_library_bar",
10679 ],
10680 updatable: false,
10681 }
10682
10683 java_library {
10684 name: "my_java_library_foo",
10685 srcs: ["foo/bar/MyClass.java"],
10686 sdk_version: "none",
10687 system_modules: "none",
10688 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010689 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010690 "myapex",
10691 ],
10692 }
10693
10694 java_library {
10695 name: "other_java_library_bar",
10696 srcs: ["foo/bar/MyClass.java"],
10697 sdk_version: "none",
10698 system_modules: "none",
10699 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010700 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010701 "myapex",
10702 ],
10703 }
10704
10705 aconfig_declarations {
10706 name: "my_aconfig_declarations_foo",
10707 package: "com.example.package",
10708 container: "myapex",
10709 srcs: ["foo.aconfig"],
10710 }
10711
10712 java_aconfig_library {
10713 name: "my_java_aconfig_library_foo",
10714 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010715 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010716 "myapex",
10717 ],
10718 }
10719
10720 aconfig_declarations {
10721 name: "other_aconfig_declarations_bar",
10722 package: "com.example.package",
10723 container: "otherapex",
10724 srcs: ["bar.aconfig"],
10725 }
10726
10727 java_aconfig_library {
10728 name: "other_java_aconfig_library_bar",
10729 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010730 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010731 "myapex",
10732 ],
10733 }
10734 `)
10735
10736 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10737 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10738 s := " " + combineAconfigRule.Args["cache_files"]
10739 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10740 if len(aconfigArgs) != 1 {
10741 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10742 }
10743 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10744
10745 buildParams := combineAconfigRule.BuildParams
10746 if len(buildParams.Inputs) != 1 {
10747 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10748 }
10749 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10750 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10751}
10752
10753func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010754 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010755 ctx := testApex(t, apex_default_bp+`
10756 apex {
10757 name: "myapex",
10758 manifest: ":myapex.manifest",
10759 androidManifest: ":myapex.androidmanifest",
10760 key: "myapex.key",
10761 java_libs: [
10762 "my_java_library_foo",
10763 "my_java_library_bar",
10764 ],
10765 updatable: false,
10766 }
10767
10768 java_library {
10769 name: "my_java_library_foo",
10770 srcs: ["foo/bar/MyClass.java"],
10771 sdk_version: "none",
10772 system_modules: "none",
10773 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010774 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010775 "myapex",
10776 ],
10777 }
10778
10779 java_library {
10780 name: "my_java_library_bar",
10781 srcs: ["foo/bar/MyClass.java"],
10782 sdk_version: "none",
10783 system_modules: "none",
10784 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010785 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010786 "myapex",
10787 ],
10788 }
10789
10790 aconfig_declarations {
10791 name: "my_aconfig_declarations_foo",
10792 package: "com.example.package",
10793 container: "myapex",
10794 srcs: ["foo.aconfig"],
10795 }
10796
10797 java_aconfig_library {
10798 name: "my_java_aconfig_library_foo",
10799 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010800 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010801 "myapex",
10802 ],
10803 }
10804
10805 java_aconfig_library {
10806 name: "my_java_aconfig_library_bar",
10807 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010808 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010809 "myapex",
10810 ],
10811 }
10812 `)
10813
10814 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10815 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10816 s := " " + combineAconfigRule.Args["cache_files"]
10817 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10818 if len(aconfigArgs) != 1 {
10819 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10820 }
10821 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10822
10823 buildParams := combineAconfigRule.BuildParams
10824 if len(buildParams.Inputs) != 1 {
10825 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10826 }
10827 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10828 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10829}
Spandan Das5be63332023-12-13 00:06:32 +000010830
10831// Test that the boot jars come from the _selected_ apex prebuilt
10832// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10833func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010834 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010835 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10836 t.Helper()
10837 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10838 foundLibfooJar := false
10839 base := stem + ".jar"
10840 for _, output := range s.AllOutputs() {
10841 if filepath.Base(output) == base {
10842 foundLibfooJar = true
10843 buildRule := s.Output(output)
10844 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10845 }
10846 }
10847 if !foundLibfooJar {
10848 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10849 }
10850 }
10851
Spandan Das64c9e0c2023-12-20 20:13:34 +000010852 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10853 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10854 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10855 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10856 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10857 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)
10858 }
10859
10860 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10861 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10862 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10863 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10864 }
10865
Spandan Das5be63332023-12-13 00:06:32 +000010866 bp := `
10867 // Source APEX.
10868
10869 java_library {
10870 name: "framework-foo",
10871 srcs: ["foo.java"],
10872 installable: true,
10873 apex_available: [
10874 "com.android.foo",
10875 ],
10876 }
10877
10878 bootclasspath_fragment {
10879 name: "foo-bootclasspath-fragment",
10880 contents: ["framework-foo"],
10881 apex_available: [
10882 "com.android.foo",
10883 ],
10884 hidden_api: {
10885 split_packages: ["*"],
10886 },
10887 }
10888
10889 apex_key {
10890 name: "com.android.foo.key",
10891 public_key: "com.android.foo.avbpubkey",
10892 private_key: "com.android.foo.pem",
10893 }
10894
10895 apex {
10896 name: "com.android.foo",
10897 key: "com.android.foo.key",
10898 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10899 updatable: false,
10900 }
10901
10902 // Prebuilt APEX.
10903
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010904 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010905 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010906 public: {
10907 jars: ["foo.jar"],
10908 },
Spandan Das5be63332023-12-13 00:06:32 +000010909 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010910 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010911 }
10912
10913 prebuilt_bootclasspath_fragment {
10914 name: "foo-bootclasspath-fragment",
10915 contents: ["framework-foo"],
10916 hidden_api: {
10917 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10918 metadata: "my-bootclasspath-fragment/metadata.csv",
10919 index: "my-bootclasspath-fragment/index.csv",
10920 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10921 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10922 },
10923 apex_available: [
10924 "com.android.foo",
10925 ],
10926 }
10927
10928 prebuilt_apex {
10929 name: "com.android.foo",
10930 apex_name: "com.android.foo",
10931 src: "com.android.foo-arm.apex",
10932 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10933 }
10934
10935 // Another Prebuilt ART APEX
10936 prebuilt_apex {
10937 name: "com.android.foo.v2",
10938 apex_name: "com.android.foo", // Used to determine the API domain
10939 src: "com.android.foo-arm.apex",
10940 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10941 }
10942
10943 // APEX contribution modules
10944
10945 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010946 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010947 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010948 contents: ["com.android.foo"],
10949 }
10950
10951 apex_contributions {
10952 name: "foo.prebuilt.contributions",
10953 api_domain: "com.android.foo",
10954 contents: ["prebuilt_com.android.foo"],
10955 }
10956
10957 apex_contributions {
10958 name: "foo.prebuilt.v2.contributions",
10959 api_domain: "com.android.foo",
10960 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010961 }
10962 `
10963
10964 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010965 desc string
10966 selectedApexContributions string
10967 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010968 }{
10969 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010970 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10971 selectedApexContributions: "foo.source.contributions",
10972 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010973 },
10974 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010975 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10976 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010977 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010978 },
10979 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010980 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10981 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010982 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010983 },
10984 }
10985
10986 fragment := java.ApexVariantReference{
10987 Apex: proptools.StringPtr("com.android.foo"),
10988 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10989 }
10990
10991 for _, tc := range testCases {
10992 preparer := android.GroupFixturePreparers(
10993 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10994 android.FixtureMergeMockFs(map[string][]byte{
10995 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10996 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010997 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10998 // file creation.
10999 java.FixtureConfigureBootJars("platform:foo"),
11000 android.FixtureModifyMockFS(func(fs android.MockFS) {
11001 fs["platform/Android.bp"] = []byte(`
11002 java_library {
11003 name: "foo",
11004 srcs: ["Test.java"],
11005 compile_dex: true,
11006 }
11007 `)
11008 fs["platform/Test.java"] = nil
11009 }),
11010
Colin Crossa66b4632024-08-08 15:50:47 -070011011 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011012 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011013 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011014 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011015 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11016 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011017 }
11018}
Spandan Das3576e762024-01-03 18:57:03 +000011019
11020// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11021// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11022func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011023 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011024 // for a mainline module family, check that only the flagged soong module is visible to make
11025 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11026 variation := func(moduleName string) string {
11027 ret := "android_common_com.android.foo"
11028 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011029 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011030 }
11031 return ret
11032 }
11033
11034 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11035 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11036
11037 for _, hiddenModuleName := range hiddenModuleNames {
11038 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11039 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11040
11041 }
11042 }
11043
11044 bp := `
11045 apex_key {
11046 name: "com.android.foo.key",
11047 public_key: "com.android.foo.avbpubkey",
11048 private_key: "com.android.foo.pem",
11049 }
11050
11051 // AOSP source apex
11052 apex {
11053 name: "com.android.foo",
11054 key: "com.android.foo.key",
11055 updatable: false,
11056 }
11057
11058 // Google source apex
11059 override_apex {
11060 name: "com.google.android.foo",
11061 base: "com.android.foo",
11062 key: "com.android.foo.key",
11063 }
11064
11065 // Prebuilt Google APEX.
11066
11067 prebuilt_apex {
11068 name: "com.google.android.foo",
11069 apex_name: "com.android.foo",
11070 src: "com.android.foo-arm.apex",
11071 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11072 }
11073
11074 // Another Prebuilt Google APEX
11075 prebuilt_apex {
11076 name: "com.google.android.foo.v2",
11077 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011078 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011079 src: "com.android.foo-arm.apex",
11080 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11081 }
11082
11083 // APEX contribution modules
11084
11085 apex_contributions {
11086 name: "foo.source.contributions",
11087 api_domain: "com.android.foo",
11088 contents: ["com.google.android.foo"],
11089 }
11090
11091 apex_contributions {
11092 name: "foo.prebuilt.contributions",
11093 api_domain: "com.android.foo",
11094 contents: ["prebuilt_com.google.android.foo"],
11095 }
11096
11097 apex_contributions {
11098 name: "foo.prebuilt.v2.contributions",
11099 api_domain: "com.android.foo",
11100 contents: ["prebuilt_com.google.android.foo.v2"],
11101 }
11102
11103 // This is an incompatible module because it selects multiple versions of the same mainline module
11104 apex_contributions {
11105 name: "foo.prebuilt.duplicate.contributions",
11106 api_domain: "com.android.foo",
11107 contents: [
11108 "prebuilt_com.google.android.foo",
11109 "prebuilt_com.google.android.foo.v2",
11110 ],
11111 }
11112 `
11113
11114 testCases := []struct {
11115 desc string
11116 selectedApexContributions string
11117 expectedVisibleModuleName string
11118 expectedHiddenModuleNames []string
11119 expectedError string
11120 }{
11121 {
11122 desc: "Source apex is selected, prebuilts should be hidden from make",
11123 selectedApexContributions: "foo.source.contributions",
11124 expectedVisibleModuleName: "com.google.android.foo",
11125 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11126 },
11127 {
11128 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11129 selectedApexContributions: "foo.prebuilt.contributions",
11130 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11131 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11132 },
11133 {
11134 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11135 selectedApexContributions: "foo.prebuilt.v2.contributions",
11136 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11137 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11138 },
11139 {
11140 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11141 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11142 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11143 },
11144 }
11145
11146 for _, tc := range testCases {
11147 preparer := android.GroupFixturePreparers(
11148 android.FixtureMergeMockFs(map[string][]byte{
11149 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11150 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011151 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011152 )
11153 if tc.expectedError != "" {
11154 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11155 testApex(t, bp, preparer)
11156 return
11157 }
11158 ctx := testApex(t, bp, preparer)
11159
Spandan Das3576e762024-01-03 18:57:03 +000011160 // Check that
11161 // 1. The contents of the selected apex_contributions are visible to make
11162 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11163 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11164 }
11165}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011166
Spandan Das85bd4622024-08-01 00:51:20 +000011167// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11168func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011169 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011170 // for a mainline module family, check that only the flagged soong module is visible to make
11171 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11172 variation := func(moduleName string) string {
11173 ret := "android_common_com.android.adservices"
11174 if moduleName == "com.google.android.foo" {
11175 ret = "android_common_com.google.android.foo_com.google.android.foo"
11176 }
11177 return ret
11178 }
11179
11180 for _, visibleModuleName := range visibleModuleNames {
11181 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11182 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11183 }
11184
11185 for _, hiddenModuleName := range hiddenModuleNames {
11186 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11187 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11188
11189 }
11190 }
11191
11192 bp := `
11193 apex_key {
11194 name: "com.android.adservices.key",
11195 public_key: "com.android.adservices.avbpubkey",
11196 private_key: "com.android.adservices.pem",
11197 }
11198
11199 // AOSP source apex
11200 apex {
11201 name: "com.android.adservices",
11202 key: "com.android.adservices.key",
11203 updatable: false,
11204 }
11205
11206 // Prebuilt Google APEX.
11207
11208 prebuilt_apex {
11209 name: "com.google.android.adservices",
11210 apex_name: "com.android.adservices",
11211 src: "com.android.foo-arm.apex",
11212 }
11213
11214 // Another Prebuilt Google APEX
11215 prebuilt_apex {
11216 name: "com.google.android.adservices.v2",
11217 apex_name: "com.android.adservices",
11218 src: "com.android.foo-arm.apex",
11219 }
11220
11221 // APEX contribution modules
11222
11223
11224 apex_contributions {
11225 name: "adservices.prebuilt.contributions",
11226 api_domain: "com.android.adservices",
11227 contents: ["prebuilt_com.google.android.adservices"],
11228 }
11229
11230 apex_contributions {
11231 name: "adservices.prebuilt.v2.contributions",
11232 api_domain: "com.android.adservices",
11233 contents: ["prebuilt_com.google.android.adservices.v2"],
11234 }
11235 `
11236
11237 testCases := []struct {
11238 desc string
11239 selectedApexContributions string
11240 expectedVisibleModuleNames []string
11241 expectedHiddenModuleNames []string
11242 }{
11243 {
11244 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11245 selectedApexContributions: "",
11246 expectedVisibleModuleNames: []string{"com.android.adservices"},
11247 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11248 },
11249 {
11250 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11251 selectedApexContributions: "adservices.prebuilt.contributions",
11252 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11253 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11254 },
11255 {
11256 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11257 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11258 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11259 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11260 },
11261 }
11262
11263 for _, tc := range testCases {
11264 preparer := android.GroupFixturePreparers(
11265 android.FixtureMergeMockFs(map[string][]byte{
11266 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11267 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011268 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011269 )
11270 ctx := testApex(t, bp, preparer)
11271
11272 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11273 }
11274}
11275
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011276func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011277 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011278 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11279 for _, moduleName := range moduleNames {
11280 ret += fmt.Sprintf(`
11281 aconfig_declarations {
11282 name: "%[1]s",
11283 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011284 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011285 srcs: [
11286 "%[1]s.aconfig",
11287 ],
11288 }
11289 java_aconfig_library {
11290 name: "%[1]s-lib",
11291 aconfig_declarations: "%[1]s",
11292 }
11293 `, moduleName)
11294 }
11295 return ret
11296 }
11297
11298 result := android.GroupFixturePreparers(
11299 prepareForApexTest,
11300 java.PrepareForTestWithJavaSdkLibraryFiles,
11301 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011302 ).RunTestWithBp(t, `
11303 java_library {
11304 name: "baz-java-lib",
11305 static_libs: [
11306 "baz-lib",
11307 ],
11308 }
11309 filegroup {
11310 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011311 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011312 ":qux-lib{.generated_srcjars}",
11313 ],
11314 }
11315 filegroup {
11316 name: "qux-another-filegroup",
11317 srcs: [
11318 ":qux-filegroup",
11319 ],
11320 }
11321 java_library {
11322 name: "quux-java-lib",
11323 srcs: [
11324 "a.java",
11325 ],
11326 libs: [
11327 "quux-lib",
11328 ],
11329 }
11330 java_sdk_library {
11331 name: "foo",
11332 srcs: [
11333 ":qux-another-filegroup",
11334 ],
11335 api_packages: ["foo"],
11336 system: {
11337 enabled: true,
11338 },
11339 module_lib: {
11340 enabled: true,
11341 },
11342 test: {
11343 enabled: true,
11344 },
11345 static_libs: [
11346 "bar-lib",
11347 ],
11348 libs: [
11349 "baz-java-lib",
11350 "quux-java-lib",
11351 ],
11352 aconfig_declarations: [
11353 "bar",
11354 ],
11355 }
11356 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11357
11358 m := result.ModuleForTests("foo.stubs.source", "android_common")
11359 outDir := "out/soong/.intermediates"
11360
11361 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11362 // textproto files
11363 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11364
11365 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11366 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11367 // to aconfig.
11368 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11369 "passed as an input",
11370 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11371
11372 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11373 // to metalava as classpath. Thus the cache file provided by the associated
11374 // aconfig_declarations module "baz" should be passed to aconfig.
11375 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11376 "java_aconfig_library passed as an input",
11377 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11378
11379 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11380 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11381 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11382 "input",
11383 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11384
11385 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11386 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11387 // aconfig_declarations module "quux" should not be passed to aconfig.
11388 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11389 "depend on java_aconfig_library not passed as an input",
11390 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11391}
Cole Faust7c991b42024-05-15 11:17:55 -070011392
11393func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011394 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011395 ctx := testApex(t, `
11396 apex {
11397 name: "myapex",
11398 key: "myapex.key",
11399 prebuilts: ["myetc", "myetc2"],
11400 min_sdk_version: "29",
11401 }
11402 apex_key {
11403 name: "myapex.key",
11404 public_key: "testkey.avbpubkey",
11405 private_key: "testkey.pem",
11406 }
11407
11408 prebuilt_etc {
11409 name: "myetc",
11410 src: "myprebuilt",
11411 filename: "myfilename",
11412 }
11413 prebuilt_etc {
11414 name: "myetc2",
11415 sub_dir: "mysubdir",
11416 src: "myprebuilt",
11417 filename: "myfilename",
11418 }
11419 `, withFiles(android.MockFS{
11420 "packages/modules/common/build/allowed_deps.txt": nil,
11421 }))
11422
11423 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11424 data := android.AndroidMkDataForTest(t, ctx, ab)
11425 var builder strings.Builder
11426 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11427 androidMk := builder.String()
11428
11429 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11430 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11431}
Spandan Das50801e22024-05-13 18:29:45 +000011432
11433func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011434 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011435 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11436 args := module.Rule("apexRule").Args
11437 optFlags := args["opt_flags"]
11438 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11439 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11440 }
11441 }
11442
11443 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11444 t.Helper()
11445 found := false
11446 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11447 if dep == wantDep {
11448 found = true
11449 }
11450 })
11451 if !found {
11452 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11453 }
11454 }
11455
11456 ctx := testApex(t, `
11457 apex {
11458 name: "com.android.apex30",
11459 min_sdk_version: "30",
11460 key: "apex30.key",
11461 java_libs: ["javalib"],
11462 }
11463
11464 java_library {
11465 name: "javalib",
11466 srcs: ["A.java"],
11467 apex_available: ["com.android.apex30"],
11468 min_sdk_version: "30",
11469 sdk_version: "current",
11470 }
11471
11472 override_apex {
11473 name: "com.mycompany.android.apex30",
11474 base: "com.android.apex30",
11475 }
11476
11477 override_apex {
11478 name: "com.mycompany.android.apex31",
11479 base: "com.android.apex30",
11480 min_sdk_version: "31",
11481 }
11482
11483 apex_key {
11484 name: "apex30.key",
11485 public_key: "testkey.avbpubkey",
11486 private_key: "testkey.pem",
11487 }
11488
11489 `, android.FixtureMergeMockFs(android.MockFS{
11490 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11491 }),
11492 )
11493
11494 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11495 checkMinSdkVersion(t, baseModule, "30")
11496
11497 // Override module, but uses same min_sdk_version
11498 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11499 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11500 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11501 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11502
11503 // Override module, uses different min_sdk_version
11504 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11505 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11506 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11507 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11508}
Spandan Das0b28fa02024-05-28 23:40:17 +000011509
11510func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011511 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011512 context := android.GroupFixturePreparers(
11513 android.PrepareForIntegrationTestWithAndroid,
11514 PrepareForTestWithApexBuildComponents,
11515 android.FixtureMergeMockFs(android.MockFS{
11516 "system/sepolicy/apex/foo-file_contexts": nil,
11517 }),
11518 )
11519 res := context.RunTestWithBp(t, `
11520 apex {
11521 name: "foo",
11522 key: "myapex.key",
11523 apex_available_name: "com.android.foo",
11524 variant_version: "0",
11525 updatable: false,
11526 }
11527 apex_key {
11528 name: "myapex.key",
11529 public_key: "testkey.avbpubkey",
11530 private_key: "testkey.pem",
11531 }
11532 prebuilt_apex {
11533 name: "foo",
11534 src: "foo.apex",
11535 prefer: true,
11536 }
11537 override_apex {
11538 name: "myoverrideapex",
11539 base: "foo",
11540 }
11541 `)
11542
11543 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11544}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011545
11546func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011547 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011548 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`, `
11549 apex {
11550 name: "myapex",
11551 key: "myapex.key",
11552 updatable: true,
11553 min_sdk_version: "current",
11554 }
11555
11556 apex_key {
11557 name: "myapex.key",
11558 public_key: "testkey.avbpubkey",
11559 private_key: "testkey.pem",
11560 }
11561 `)
11562}
Spandan Das2f68f192024-07-22 19:25:50 +000011563
11564func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011565 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011566 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11567 result := android.GroupFixturePreparers(
11568 prepareForApexTest,
11569 android.PrepareForTestWithAndroidMk,
11570 android.PrepareForTestWithMakevars,
11571 android.FixtureMergeMockFs(fs),
11572 ).RunTest(t)
11573
11574 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011575 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011576
11577 installRules := result.InstallMakeRulesForTesting(t)
11578
11579 var installedlibRule *android.InstallMakeRule
11580 for i, rule := range installRules {
11581 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11582 if installedlibRule != nil {
11583 t.Errorf("Duplicate install rules for %s", rule.Target)
11584 }
11585 installedlibRule = &installRules[i]
11586 }
11587 }
11588 if installedlibRule == nil {
11589 t.Errorf("No install rule found for installedlib")
11590 return
11591 }
11592
11593 if expectLibfooOnSystemLib {
11594 android.AssertStringListContains(t,
11595 "installedlib doesn't have install dependency on libfoo impl",
11596 installedlibRule.OrderOnlyDeps,
11597 "out/target/product/test_device/system/lib/libfoo.so")
11598 } else {
11599 android.AssertStringListDoesNotContain(t,
11600 "installedlib has install dependency on libfoo stub",
11601 installedlibRule.Deps,
11602 "out/target/product/test_device/system/lib/libfoo.so")
11603 android.AssertStringListDoesNotContain(t,
11604 "installedlib has order-only install dependency on libfoo stub",
11605 installedlibRule.OrderOnlyDeps,
11606 "out/target/product/test_device/system/lib/libfoo.so")
11607 }
11608 }
11609
11610 prebuiltLibfooBp := []byte(`
11611 cc_prebuilt_library {
11612 name: "libfoo",
11613 prefer: true,
11614 srcs: ["libfoo.so"],
11615 stubs: {
11616 versions: ["1"],
11617 },
11618 apex_available: ["apexfoo"],
11619 }
11620 `)
11621
11622 apexfooBp := []byte(`
11623 apex {
11624 name: "apexfoo",
11625 key: "apexfoo.key",
11626 native_shared_libs: ["libfoo"],
11627 updatable: false,
11628 compile_multilib: "both",
11629 }
11630 apex_key {
11631 name: "apexfoo.key",
11632 public_key: "testkey.avbpubkey",
11633 private_key: "testkey.pem",
11634 }
11635 `)
11636
11637 installedlibBp := []byte(`
11638 cc_library {
11639 name: "installedlib",
11640 shared_libs: ["libfoo"],
11641 }
11642 `)
11643
11644 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011645 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011646 testFunc(
11647 t,
11648 /*expectLibfooOnSystemLib=*/ false,
11649 android.MockFS{
11650 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11651 "apexfoo/Android.bp": apexfooBp,
11652 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11653 "Android.bp": installedlibBp,
11654 },
11655 )
11656 })
11657
11658 disabledSourceLibfooBp := []byte(`
11659 cc_library {
11660 name: "libfoo",
11661 enabled: false,
11662 stubs: {
11663 versions: ["1"],
11664 },
11665 apex_available: ["apexfoo"],
11666 }
11667 `)
11668
11669 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011670 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011671 testFunc(
11672 t,
11673 /*expectLibfooOnSystemLib=*/ false,
11674 android.MockFS{
11675 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11676 "impl/Android.bp": disabledSourceLibfooBp,
11677 "apexfoo/Android.bp": apexfooBp,
11678 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11679 "Android.bp": installedlibBp,
11680 },
11681 )
11682 })
11683}
Jihoon Kange246bb72024-09-18 22:26:22 +000011684
11685func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011686 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011687 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11688 // in libs of android_app and java_library does not lead to class loader context device/host
11689 // path mismatch errors.
11690 android.GroupFixturePreparers(
11691 prepareForApexTest,
11692 android.PrepareForIntegrationTestWithAndroid,
11693 PrepareForTestWithApexBuildComponents,
11694 android.FixtureModifyEnv(func(env map[string]string) {
11695 env["DISABLE_CONTAINER_CHECK"] = "true"
11696 }),
11697 withFiles(filesForSdkLibrary),
11698 android.FixtureMergeMockFs(android.MockFS{
11699 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11700 }),
11701 ).RunTestWithBp(t, `
11702 apex {
11703 name: "com.android.foo30",
11704 key: "myapex.key",
11705 updatable: true,
11706 bootclasspath_fragments: [
11707 "foo-bootclasspath-fragment",
11708 ],
11709 java_libs: [
11710 "bar",
11711 ],
11712 apps: [
11713 "bar-app",
11714 ],
11715 min_sdk_version: "30",
11716 }
11717 apex_key {
11718 name: "myapex.key",
11719 public_key: "testkey.avbpubkey",
11720 private_key: "testkey.pem",
11721 }
11722 bootclasspath_fragment {
11723 name: "foo-bootclasspath-fragment",
11724 contents: [
11725 "framework-foo",
11726 ],
11727 apex_available: [
11728 "com.android.foo30",
11729 ],
11730 hidden_api: {
11731 split_packages: ["*"]
11732 },
11733 }
11734
11735 java_sdk_library {
11736 name: "framework-foo",
11737 srcs: [
11738 "A.java"
11739 ],
11740 unsafe_ignore_missing_latest_api: true,
11741 apex_available: [
11742 "com.android.foo30",
11743 ],
11744 compile_dex: true,
11745 sdk_version: "core_current",
11746 shared_library: false,
11747 }
11748
11749 java_library {
11750 name: "bar",
11751 srcs: [
11752 "A.java"
11753 ],
11754 libs: [
11755 "framework-foo.impl",
11756 ],
11757 apex_available: [
11758 "com.android.foo30",
11759 ],
11760 sdk_version: "core_current",
11761 }
11762
11763 java_library {
11764 name: "baz",
11765 srcs: [
11766 "A.java"
11767 ],
11768 libs: [
11769 "bar",
11770 ],
11771 sdk_version: "core_current",
11772 }
11773
11774 android_app {
11775 name: "bar-app",
11776 srcs: [
11777 "A.java"
11778 ],
11779 libs: [
11780 "baz",
11781 "framework-foo.impl",
11782 ],
11783 apex_available: [
11784 "com.android.foo30",
11785 ],
11786 sdk_version: "core_current",
11787 min_sdk_version: "30",
11788 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011789 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011790 }
11791 `)
11792}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011793
11794// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11795func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011796 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011797 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11798 apex {
11799 name: "myapex",
11800 key: "myapex.key",
11801 systemserverclasspath_fragments: [
11802 "mysystemserverclasspathfragment",
11803 ],
11804 min_sdk_version: "29",
11805 updatable: true,
11806 system_ext_specific: true,
11807 }
11808
11809 apex_key {
11810 name: "myapex.key",
11811 public_key: "testkey.avbpubkey",
11812 private_key: "testkey.pem",
11813 }
11814
11815 java_library {
11816 name: "foo",
11817 srcs: ["b.java"],
11818 min_sdk_version: "29",
11819 installable: true,
11820 apex_available: [
11821 "myapex",
11822 ],
11823 sdk_version: "current",
11824 }
11825
11826 systemserverclasspath_fragment {
11827 name: "mysystemserverclasspathfragment",
11828 contents: [
11829 "foo",
11830 ],
11831 apex_available: [
11832 "myapex",
11833 ],
11834 }
11835 `,
11836 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11837 )
11838}
Spandan Das72d86c62024-10-15 19:27:41 +000011839
11840// partitions should not package the artifacts that are included inside the apex.
11841func TestFilesystemWithApexDeps(t *testing.T) {
11842 t.Parallel()
11843 result := testApex(t, `
11844 android_filesystem {
11845 name: "myfilesystem",
11846 deps: ["myapex"],
11847 }
11848 apex {
11849 name: "myapex",
11850 key: "myapex.key",
11851 binaries: ["binfoo"],
11852 native_shared_libs: ["libfoo"],
11853 apps: ["appfoo"],
11854 updatable: false,
11855 }
11856 apex_key {
11857 name: "myapex.key",
11858 }
11859 cc_binary {
11860 name: "binfoo",
11861 apex_available: ["myapex"],
11862 }
11863 cc_library {
11864 name: "libfoo",
11865 apex_available: ["myapex"],
11866 }
11867 android_app {
11868 name: "appfoo",
11869 sdk_version: "current",
11870 apex_available: ["myapex"],
11871 }
11872 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11873
11874 partition := result.ModuleForTests("myfilesystem", "android_common")
11875 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11876 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11877}
Colin Crossb614cd42024-10-11 12:52:21 -070011878
11879func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11880 t.Parallel()
11881
11882 extractDepenencyPathFromErrors := func(errs []error) []string {
11883 i := slices.IndexFunc(errs, func(err error) bool {
11884 return strings.Contains(err.Error(), "dependency path:")
11885 })
11886 if i < 0 {
11887 return nil
11888 }
11889 var dependencyPath []string
11890 for _, err := range errs[i+1:] {
11891 s := err.Error()
11892 lastSpace := strings.LastIndexByte(s, ' ')
11893 if lastSpace >= 0 {
11894 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11895 }
11896 }
11897 return dependencyPath
11898 }
11899
11900 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11901 return func(t *testing.T, result *android.TestResult) {
11902 t.Helper()
11903 if len(result.Errs) == 0 {
11904 t.Fatalf("expected errors")
11905 }
11906 t.Log("found errors:")
11907 for _, err := range result.Errs {
11908 t.Log(err)
11909 }
11910 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11911 t.Fatalf("expected error %q, got %q", w, g)
11912 }
11913 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11914 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11915 t.Errorf("expected dependency path %q, got %q", w, g)
11916 }
11917 }
11918 }
11919
11920 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11921 return func(bp *bpmodify.Blueprint) {
11922 m := bp.ModulesByName(module)
11923 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11924 if err != nil {
11925 panic(err)
11926 }
11927 props.AddStringToList(lib)
11928 }
11929 }
11930
11931 bpTemplate := `
11932 apex {
11933 name: "myapex",
11934 key: "myapex.key",
11935 native_shared_libs: ["mylib"],
11936 rust_dyn_libs: ["libmyrust"],
11937 binaries: ["mybin", "myrustbin"],
11938 jni_libs: ["libjni"],
11939 apps: ["myapp"],
11940 updatable: false,
11941 }
11942
11943 apex {
11944 name: "otherapex",
11945 key: "myapex.key",
11946 native_shared_libs: ["libotherapex"],
11947 updatable: false,
11948 }
11949
11950 apex_key {
11951 name: "myapex.key",
11952 public_key: "testkey.avbpubkey",
11953 private_key: "testkey.pem",
11954 }
11955
11956 cc_library {
11957 name: "mylib",
11958 srcs: ["foo.cpp"],
11959 apex_available: ["myapex"],
11960 }
11961
11962 cc_binary {
11963 name: "mybin",
11964 srcs: ["foo.cpp"],
11965 apex_available: ["myapex"],
11966 }
11967
11968 rust_library {
11969 name: "libmyrust",
11970 crate_name: "myrust",
11971 srcs: ["src/lib.rs"],
11972 rustlibs: ["libmyrust_transitive_dylib"],
11973 rlibs: ["libmyrust_transitive_rlib"],
11974 apex_available: ["myapex"],
11975 }
11976
11977 rust_library{
11978 name: "libmyrust_transitive_dylib",
11979 crate_name: "myrust_transitive_dylib",
11980 srcs: ["src/lib.rs"],
11981 apex_available: ["myapex"],
11982 }
11983
11984 rust_library {
11985 name: "libmyrust_transitive_rlib",
11986 crate_name: "myrust_transitive_rlib",
11987 srcs: ["src/lib.rs"],
11988 apex_available: ["myapex"],
11989 }
11990
11991 rust_binary {
11992 name: "myrustbin",
11993 srcs: ["src/main.rs"],
11994 apex_available: ["myapex"],
11995 }
11996
11997 cc_library {
11998 name: "libbar",
11999 sdk_version: "current",
12000 srcs: ["bar.cpp"],
12001 apex_available: ["myapex"],
12002 stl: "none",
12003 }
12004
12005 android_app {
12006 name: "myapp",
12007 jni_libs: ["libembeddedjni"],
12008 use_embedded_native_libs: true,
12009 sdk_version: "current",
12010 apex_available: ["myapex"],
12011 }
12012
12013 cc_library {
12014 name: "libembeddedjni",
12015 sdk_version: "current",
12016 srcs: ["bar.cpp"],
12017 apex_available: ["myapex"],
12018 stl: "none",
12019 }
12020
12021 cc_library {
12022 name: "libjni",
12023 sdk_version: "current",
12024 srcs: ["bar.cpp"],
12025 apex_available: ["myapex"],
12026 stl: "none",
12027 }
12028
12029 cc_library {
12030 name: "libotherapex",
12031 sdk_version: "current",
12032 srcs: ["otherapex.cpp"],
12033 apex_available: ["otherapex"],
12034 stubs: {
12035 symbol_file: "libotherapex.map.txt",
12036 versions: ["1", "2", "3"],
12037 },
12038 stl: "none",
12039 }
12040
12041 cc_library {
12042 name: "libplatform",
12043 sdk_version: "current",
12044 srcs: ["libplatform.cpp"],
12045 stubs: {
12046 symbol_file: "libplatform.map.txt",
12047 versions: ["1", "2", "3"],
12048 },
12049 stl: "none",
12050 system_shared_libs: [],
12051 }
12052 `
12053
12054 testCases := []struct {
12055 name string
12056 bpModifier func(bp *bpmodify.Blueprint)
12057 dependencyPath []string
12058 }{
12059 {
12060 name: "library dependency in other apex",
12061 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12062 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12063 },
12064 {
12065 name: "transitive library dependency in other apex",
12066 bpModifier: func(bp *bpmodify.Blueprint) {
12067 addToSharedLibs("mylib", "libbar")(bp)
12068 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12069 },
12070 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12071 },
12072 {
12073 name: "library dependency in platform",
12074 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12075 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12076 },
12077 {
12078 name: "jni library dependency in other apex",
12079 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12080 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12081 },
12082 {
12083 name: "transitive jni library dependency in other apex",
12084 bpModifier: func(bp *bpmodify.Blueprint) {
12085 addToSharedLibs("libjni", "libbar")(bp)
12086 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12087 },
12088 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12089 },
12090 {
12091 name: "jni library dependency in platform",
12092 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12093 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12094 },
12095 {
12096 name: "transitive jni library dependency in platform",
12097 bpModifier: func(bp *bpmodify.Blueprint) {
12098 addToSharedLibs("libjni", "libbar")(bp)
12099 addToSharedLibs("libbar", "libplatform#impl")(bp)
12100 },
12101 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12102 },
12103 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12104 // JNI libraries even if they came from another apex.
12105 //{
12106 // name: "app jni library dependency in other apex",
12107 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12108 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12109 //},
12110 //{
12111 // name: "transitive app jni library dependency in other apex",
12112 // bpModifier: func(bp *bpmodify.Blueprint) {
12113 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12114 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12115 // },
12116 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12117 //},
12118 //{
12119 // name: "app jni library dependency in platform",
12120 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12121 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12122 //},
12123 //{
12124 // name: "transitive app jni library dependency in platform",
12125 // bpModifier: func(bp *bpmodify.Blueprint) {
12126 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12127 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12128 // },
12129 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12130 //},
12131 {
12132 name: "binary dependency in other apex",
12133 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12134 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12135 },
12136 {
12137 name: "transitive binary dependency in other apex",
12138 bpModifier: func(bp *bpmodify.Blueprint) {
12139 addToSharedLibs("mybin", "libbar")(bp)
12140 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12141 },
12142 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12143 },
12144 {
12145 name: "binary dependency in platform",
12146 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12147 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12148 },
12149 {
12150 name: "transitive binary dependency in platform",
12151 bpModifier: func(bp *bpmodify.Blueprint) {
12152 addToSharedLibs("mybin", "libbar")(bp)
12153 addToSharedLibs("libbar", "libplatform#impl")(bp)
12154 },
12155 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12156 },
12157
12158 {
12159 name: "rust library dependency in other apex",
12160 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12161 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12162 },
12163 {
12164 name: "transitive rust library dependency in other apex",
12165 bpModifier: func(bp *bpmodify.Blueprint) {
12166 addToSharedLibs("libmyrust", "libbar")(bp)
12167 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12168 },
12169 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12170 },
12171 {
12172 name: "rust library dependency in platform",
12173 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12174 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12175 },
12176 {
12177 name: "transitive rust library dependency in platform",
12178 bpModifier: func(bp *bpmodify.Blueprint) {
12179 addToSharedLibs("libmyrust", "libbar")(bp)
12180 addToSharedLibs("libbar", "libplatform#impl")(bp)
12181 },
12182 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12183 },
12184 {
12185 name: "transitive rust library dylib dependency in other apex",
12186 bpModifier: func(bp *bpmodify.Blueprint) {
12187 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12188 },
12189 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12190 },
12191 {
12192 name: "transitive rust library dylib dependency in platform",
12193 bpModifier: func(bp *bpmodify.Blueprint) {
12194 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12195 },
12196 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12197 },
12198 {
12199 name: "transitive rust library rlib dependency in other apex",
12200 bpModifier: func(bp *bpmodify.Blueprint) {
12201 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12202 },
12203 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12204 },
12205 {
12206 name: "transitive rust library rlib dependency in platform",
12207 bpModifier: func(bp *bpmodify.Blueprint) {
12208 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12209 },
12210 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12211 },
12212 {
12213 name: "rust binary dependency in other apex",
12214 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12215 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12216 },
12217 {
12218 name: "transitive rust binary dependency in other apex",
12219 bpModifier: func(bp *bpmodify.Blueprint) {
12220 addToSharedLibs("myrustbin", "libbar")(bp)
12221 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12222 },
12223 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12224 },
12225 {
12226 name: "rust binary dependency in platform",
12227 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12228 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12229 },
12230 {
12231 name: "transitive rust binary dependency in platform",
12232 bpModifier: func(bp *bpmodify.Blueprint) {
12233 addToSharedLibs("myrustbin", "libbar")(bp)
12234 addToSharedLibs("libbar", "libplatform#impl")(bp)
12235 },
12236 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12237 },
12238 }
12239
12240 for _, testCase := range testCases {
12241 t.Run(testCase.name, func(t *testing.T) {
12242 t.Parallel()
12243 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12244 if err != nil {
12245 t.Fatal(err)
12246 }
12247 if testCase.bpModifier != nil {
12248 func() {
12249 defer func() {
12250 if r := recover(); r != nil {
12251 t.Fatalf("panic in bpModifier: %v", r)
12252 }
12253 }()
12254 testCase.bpModifier(bp)
12255 }()
12256 }
12257 android.GroupFixturePreparers(
12258 android.PrepareForTestWithAndroidBuildComponents,
12259 cc.PrepareForTestWithCcBuildComponents,
12260 java.PrepareForTestWithDexpreopt,
12261 rust.PrepareForTestWithRustDefaultModules,
12262 PrepareForTestWithApexBuildComponents,
12263 prepareForTestWithMyapex,
12264 prepareForTestWithOtherapex,
12265 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12266 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12267 }),
12268 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12269 RunTestWithBp(t, bp.String())
12270 })
12271 }
12272}