blob: 54c1facd53c5af715d21e9b7477c5e12c9c89472 [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
Jiyong Park62304bb2020-04-13 16:19:48 +09008716func TestTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008718 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008719 apex {
8720 name: "myapex",
8721 key: "myapex.key",
8722 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008723 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008724 }
8725
8726 apex_key {
8727 name: "myapex.key",
8728 public_key: "testkey.avbpubkey",
8729 private_key: "testkey.pem",
8730 }
8731
8732 cc_library {
8733 name: "mylib",
8734 srcs: ["mylib.cpp"],
8735 system_shared_libs: [],
8736 stl: "none",
8737 stubs: {
8738 versions: ["1"],
8739 },
8740 apex_available: ["myapex"],
8741 }
8742
8743 cc_library {
8744 name: "myprivlib",
8745 srcs: ["mylib.cpp"],
8746 system_shared_libs: [],
8747 stl: "none",
8748 apex_available: ["myapex"],
8749 }
8750
8751
8752 cc_test {
8753 name: "mytest",
8754 gtest: false,
8755 srcs: ["mylib.cpp"],
8756 system_shared_libs: [],
8757 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008758 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008759 test_for: ["myapex"]
8760 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008761
8762 cc_library {
8763 name: "mytestlib",
8764 srcs: ["mylib.cpp"],
8765 system_shared_libs: [],
8766 shared_libs: ["mylib", "myprivlib"],
8767 stl: "none",
8768 test_for: ["myapex"],
8769 }
8770
8771 cc_benchmark {
8772 name: "mybench",
8773 srcs: ["mylib.cpp"],
8774 system_shared_libs: [],
8775 shared_libs: ["mylib", "myprivlib"],
8776 stl: "none",
8777 test_for: ["myapex"],
8778 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008779 `)
8780
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008781 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008782 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008783 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8784 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8785 }
8786
8787 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008788 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008789 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8790 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8791 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8792}
Jiyong Park46a512f2020-12-04 18:02:13 +09008793
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008794func TestIndirectTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008795 t.Parallel()
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008796 ctx := testApex(t, `
8797 apex {
8798 name: "myapex",
8799 key: "myapex.key",
8800 native_shared_libs: ["mylib", "myprivlib"],
8801 updatable: false,
8802 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008803
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008804 apex_key {
8805 name: "myapex.key",
8806 public_key: "testkey.avbpubkey",
8807 private_key: "testkey.pem",
8808 }
8809
8810 cc_library {
8811 name: "mylib",
8812 srcs: ["mylib.cpp"],
8813 system_shared_libs: [],
8814 stl: "none",
8815 stubs: {
8816 versions: ["1"],
8817 },
8818 apex_available: ["myapex"],
8819 }
8820
8821 cc_library {
8822 name: "myprivlib",
8823 srcs: ["mylib.cpp"],
8824 system_shared_libs: [],
8825 stl: "none",
8826 shared_libs: ["mylib"],
8827 apex_available: ["myapex"],
8828 }
8829
8830 cc_library {
8831 name: "mytestlib",
8832 srcs: ["mylib.cpp"],
8833 system_shared_libs: [],
8834 shared_libs: ["myprivlib"],
8835 stl: "none",
8836 test_for: ["myapex"],
8837 }
8838 `)
8839
8840 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008841 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008842 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8843 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8844 }
8845
8846 // The platform variant of mytestlib links to the platform variant of the
8847 // internal myprivlib.
8848 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8849
8850 // The platform variant of myprivlib links to the platform variant of mylib
8851 // and bypasses its stubs.
8852 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09008853}
8854
Martin Stjernholmec009002021-03-27 15:18:31 +00008855func TestTestForForLibInOtherApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008856 t.Parallel()
Martin Stjernholmec009002021-03-27 15:18:31 +00008857 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8858 _ = testApex(t, `
8859 apex {
8860 name: "com.android.art",
8861 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008862 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008863 updatable: false,
8864 }
8865
8866 apex {
8867 name: "com.android.art.debug",
8868 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008869 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008870 updatable: false,
8871 }
8872
8873 apex_key {
8874 name: "myapex.key",
8875 public_key: "testkey.avbpubkey",
8876 private_key: "testkey.pem",
8877 }
8878
8879 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008880 name: "libnativebridge",
8881 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008882 system_shared_libs: [],
8883 stl: "none",
8884 stubs: {
8885 versions: ["1"],
8886 },
8887 apex_available: ["com.android.art", "com.android.art.debug"],
8888 }
8889
8890 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008891 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008892 srcs: ["mylib.cpp"],
8893 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008894 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008895 stl: "none",
8896 apex_available: ["com.android.art.debug"],
8897 test_for: ["com.android.art"],
8898 }
8899 `,
8900 android.MockFS{
8901 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8902 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8903 }.AddToFixture())
8904}
8905
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008906// TODO(jungjw): Move this to proptools
8907func intPtr(i int) *int {
8908 return &i
8909}
8910
8911func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008912 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008913 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008914 apex_set {
8915 name: "myapex",
8916 set: "myapex.apks",
8917 filename: "foo_v2.apex",
8918 overrides: ["foo"],
8919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008920 `,
8921 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8922 variables.Platform_sdk_version = intPtr(30)
8923 }),
8924 android.FixtureModifyConfig(func(config android.Config) {
8925 config.Targets[android.Android] = []android.Target{
8926 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8927 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8928 }
8929 }),
8930 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008931
Spandan Das9d6e2092024-09-21 02:50:00 +00008932 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008933
8934 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008935 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008936 actual := extractedApex.Args["abis"]
8937 expected := "ARMEABI_V7A,ARM64_V8A"
8938 if actual != expected {
8939 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8940 }
8941 actual = extractedApex.Args["sdk-version"]
8942 expected = "30"
8943 if actual != expected {
8944 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8945 }
8946
Paul Duffin6717d882021-06-15 19:09:41 +01008947 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008948 a := m.Module().(*ApexSet)
8949 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008950 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008951 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8952 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8953 }
8954}
8955
Anton Hansson805e0a52022-11-25 14:06:46 +00008956func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008957 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008958 ctx := testApex(t, `
8959 apex_set {
8960 name: "myapex",
8961 set: "myapex.apks",
8962 filename: "foo_v2.apex",
8963 overrides: ["foo"],
8964 }
8965 `,
8966 android.FixtureModifyConfig(func(config android.Config) {
8967 config.Targets[android.Android] = []android.Target{
8968 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8969 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8970 }
8971 }),
8972 )
8973
Spandan Das9d6e2092024-09-21 02:50:00 +00008974 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008975
8976 // Check extract_apks tool parameters. No native bridge arch expected
8977 extractedApex := m.Output("extracted/myapex.apks")
8978 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8979}
8980
Jiyong Park7d95a512020-05-10 15:16:24 +09008981func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008982 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008983 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8984 apex {
8985 name: "myapex",
8986 key: "myapex.key",
8987 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008988 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008989 }
8990
8991 apex_key {
8992 name: "myapex.key",
8993 public_key: "testkey.avbpubkey",
8994 private_key: "testkey.pem",
8995 }
8996
8997 cc_library {
8998 name: "mylib",
8999 srcs: ["mylib.cpp"],
9000 static_libs: ["otherlib"],
9001 system_shared_libs: [],
9002 stl: "none",
9003 apex_available: [ "myapex" ],
9004 }
9005
9006 cc_library {
9007 name: "otherlib",
9008 srcs: ["mylib.cpp"],
9009 system_shared_libs: [],
9010 stl: "none",
9011 stubs: {
9012 versions: ["1", "2", "3"],
9013 },
9014 apex_available: [ "myapex" ],
9015 }
9016 `)
9017}
9018
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009019func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009020 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009021 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009022 apex {
9023 name: "myapex",
9024 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009025 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009026 custom_sign_tool: "sign_myapex",
9027 }
9028
9029 apex_key {
9030 name: "myapex.key",
9031 public_key: "testkey.avbpubkey",
9032 private_key: "testkey.pem",
9033 }
9034 `)
9035
Jooyung Han286957d2023-10-30 16:17:56 +09009036 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009037 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009038 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 +09009039}
9040
9041func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009042 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009043 ctx := testApex(t, `
9044 apex {
9045 name: "myapex",
9046 key: "myapex.key",
9047 updatable: false,
9048 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009049 }
9050
9051 apex_key {
9052 name: "myapex.key",
9053 public_key: "testkey.avbpubkey",
9054 private_key: "testkey.pem",
9055 }
9056
9057 prebuilt_apex {
9058 name: "myapex",
9059 prefer: true,
9060 arch: {
9061 arm64: {
9062 src: "myapex-arm64.apex",
9063 },
9064 arm: {
9065 src: "myapex-arm.apex",
9066 },
9067 },
9068 }
9069
9070 apex_set {
9071 name: "myapex_set",
9072 set: "myapex.apks",
9073 filename: "myapex_set.apex",
9074 overrides: ["myapex"],
9075 }
9076 `)
9077
Colin Crossf61d03d2023-11-02 16:56:39 -07009078 content := android.ContentFromFileRuleForTests(t, ctx,
9079 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009080 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 -07009081 content = android.ContentFromFileRuleForTests(t, ctx,
9082 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009083 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 +09009084}
9085
Jooyung Han938b5932020-06-20 12:47:47 +09009086func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009088 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009089 apex {
9090 name: "myapex",
9091 key: "myapex.key",
9092 apps: ["app"],
9093 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009094 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009095 }
9096
9097 apex_key {
9098 name: "myapex.key",
9099 public_key: "testkey.avbpubkey",
9100 private_key: "testkey.pem",
9101 }
9102
9103 android_app {
9104 name: "app",
9105 srcs: ["foo/bar/MyClass.java"],
9106 package_name: "foo",
9107 sdk_version: "none",
9108 system_modules: "none",
9109 apex_available: [ "myapex" ],
9110 }
9111 `, withFiles(map[string][]byte{
9112 "sub/Android.bp": []byte(`
9113 override_apex {
9114 name: "override_myapex",
9115 base: "myapex",
9116 apps: ["override_app"],
9117 allowed_files: ":allowed",
9118 }
9119 // Overridable "path" property should be referenced indirectly
9120 filegroup {
9121 name: "allowed",
9122 srcs: ["allowed.txt"],
9123 }
9124 override_android_app {
9125 name: "override_app",
9126 base: "app",
9127 package_name: "bar",
9128 }
9129 `),
9130 }))
9131
Jooyung Hana0503a52023-08-23 13:12:50 +09009132 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009133 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9134 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9135 }
9136
Spandan Das50801e22024-05-13 18:29:45 +00009137 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009138 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9139 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9140 }
9141}
9142
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009143func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009144 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009145 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009146 apex {
9147 name: "myapex",
9148 key: "myapex.key",
9149 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009150 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009151 }
9152
9153 apex_key {
9154 name: "myapex.key",
9155 public_key: "testkey.avbpubkey",
9156 private_key: "testkey.pem",
9157 }
9158
9159 cc_library {
9160 name: "mylib",
9161 srcs: ["mylib.cpp"],
9162 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009163 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009164 },
9165 apex_available: ["myapex"],
9166 }
9167
9168 cc_prebuilt_library_shared {
9169 name: "mylib",
9170 prefer: false,
9171 srcs: ["prebuilt.so"],
9172 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009173 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009174 },
9175 apex_available: ["myapex"],
9176 }
9177 `)
9178}
9179
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009180func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009181 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009182 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009183 apex {
9184 name: "myapex",
9185 key: "myapex.key",
9186 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009187 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009188 }
9189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009194 `,
9195 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9196 variables.CompressedApex = proptools.BoolPtr(true)
9197 }),
9198 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009199
Jooyung Hana0503a52023-08-23 13:12:50 +09009200 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009201 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9202
Jooyung Hana0503a52023-08-23 13:12:50 +09009203 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009204 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9205
9206 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009207 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009208 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9209
9210 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009211 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009212 var builder strings.Builder
9213 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9214 androidMk := builder.String()
9215 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9216}
9217
Jooyung Han26ec8482024-07-31 15:04:05 +09009218func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009219 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009220 for _, compressionEnabled := range []bool{true, false} {
9221 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009222 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009223 ctx := testApex(t, `
9224 apex_set {
9225 name: "com.company.android.myapex",
9226 apex_name: "com.android.myapex",
9227 set: "company-myapex.apks",
9228 }
9229 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9230 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9231 }),
9232 )
9233
9234 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9235 if compressionEnabled {
9236 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9237 } else {
9238 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9239 }
9240 })
9241 }
9242}
9243
Martin Stjernholm2856c662020-12-02 15:03:42 +00009244func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009245 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009246 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009247 apex {
9248 name: "myapex",
9249 key: "myapex.key",
9250 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009251 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009252 }
9253
9254 apex_key {
9255 name: "myapex.key",
9256 public_key: "testkey.avbpubkey",
9257 private_key: "testkey.pem",
9258 }
9259
9260 cc_library {
9261 name: "mylib",
9262 srcs: ["mylib.cpp"],
9263 apex_available: ["myapex"],
9264 shared_libs: ["otherlib"],
9265 system_shared_libs: [],
9266 }
9267
9268 cc_library {
9269 name: "otherlib",
9270 srcs: ["mylib.cpp"],
9271 stubs: {
9272 versions: ["current"],
9273 },
9274 }
9275
9276 cc_prebuilt_library_shared {
9277 name: "otherlib",
9278 prefer: true,
9279 srcs: ["prebuilt.so"],
9280 stubs: {
9281 versions: ["current"],
9282 },
9283 }
9284 `)
9285
Jooyung Hana0503a52023-08-23 13:12:50 +09009286 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009287 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009288 var builder strings.Builder
9289 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9290 androidMk := builder.String()
9291
9292 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9293 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009294 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009295}
9296
Jiyong Parke3867542020-12-03 17:28:25 +09009297func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009298 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009299 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009300 apex {
9301 name: "myapex",
9302 key: "myapex.key",
9303 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009304 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009305 }
9306
9307 apex_key {
9308 name: "myapex.key",
9309 public_key: "testkey.avbpubkey",
9310 private_key: "testkey.pem",
9311 }
9312
9313 cc_library {
9314 name: "mylib",
9315 srcs: ["mylib.cpp"],
9316 system_shared_libs: [],
9317 stl: "none",
9318 apex_available: ["myapex"],
9319 shared_libs: ["mylib2"],
9320 target: {
9321 apex: {
9322 exclude_shared_libs: ["mylib2"],
9323 },
9324 },
9325 }
9326
9327 cc_library {
9328 name: "mylib2",
9329 srcs: ["mylib.cpp"],
9330 system_shared_libs: [],
9331 stl: "none",
9332 }
9333 `)
9334
9335 // Check if mylib is linked to mylib2 for the non-apex target
9336 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9337 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9338
9339 // Make sure that the link doesn't occur for the apex target
9340 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9341 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9342
9343 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009344 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009345 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9346}
9347
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009348func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009349 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009350 bpBase := `
9351 apex {
9352 name: "myapex",
9353 key: "myapex.key",
9354 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009355 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009356 }
9357 apex_key {
9358 name: "myapex.key",
9359 public_key: "testkey.avbpubkey",
9360 private_key: "testkey.pem",
9361 }
9362 cc_library {
9363 name: "mylib",
9364 srcs: ["mylib.cpp"],
9365 apex_available: ["myapex"],
9366 shared_libs: ["stublib"],
9367 system_shared_libs: [],
9368 }
9369 apex {
9370 name: "otherapex",
9371 enabled: %s,
9372 key: "myapex.key",
9373 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009374 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009375 }
9376 `
9377
9378 stublibSourceBp := `
9379 cc_library {
9380 name: "stublib",
9381 srcs: ["mylib.cpp"],
9382 apex_available: ["otherapex"],
9383 system_shared_libs: [],
9384 stl: "none",
9385 stubs: {
9386 versions: ["1"],
9387 },
9388 }
9389 `
9390
9391 stublibPrebuiltBp := `
9392 cc_prebuilt_library_shared {
9393 name: "stublib",
9394 srcs: ["prebuilt.so"],
9395 apex_available: ["otherapex"],
9396 stubs: {
9397 versions: ["1"],
9398 },
9399 %s
9400 }
9401 `
9402
9403 tests := []struct {
9404 name string
9405 stublibBp string
9406 usePrebuilt bool
9407 modNames []string // Modules to collect AndroidMkEntries for
9408 otherApexEnabled []string
9409 }{
9410 {
9411 name: "only_source",
9412 stublibBp: stublibSourceBp,
9413 usePrebuilt: false,
9414 modNames: []string{"stublib"},
9415 otherApexEnabled: []string{"true", "false"},
9416 },
9417 {
9418 name: "source_preferred",
9419 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9420 usePrebuilt: false,
9421 modNames: []string{"stublib", "prebuilt_stublib"},
9422 otherApexEnabled: []string{"true", "false"},
9423 },
9424 {
9425 name: "prebuilt_preferred",
9426 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9427 usePrebuilt: true,
9428 modNames: []string{"stublib", "prebuilt_stublib"},
9429 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9430 },
9431 {
9432 name: "only_prebuilt",
9433 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9434 usePrebuilt: true,
9435 modNames: []string{"stublib"},
9436 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9437 },
9438 }
9439
9440 for _, test := range tests {
9441 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009442 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009443 for _, otherApexEnabled := range test.otherApexEnabled {
9444 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009445 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009446 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009447
9448 type modAndMkEntries struct {
9449 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009450 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009451 }
9452 entries := []*modAndMkEntries{}
9453
9454 // Gather shared lib modules that are installable
9455 for _, modName := range test.modNames {
9456 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9457 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9458 continue
9459 }
9460 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009461 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009462 continue
9463 }
Yu Liue70976d2024-10-15 20:45:35 +00009464 info := android.AndroidMkInfoForTest(t, ctx, mod)
9465 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9466 ents = append(ents, info.ExtraInfo...)
9467 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009468 if ent.Disabled {
9469 continue
9470 }
9471 entries = append(entries, &modAndMkEntries{
9472 mod: mod,
9473 mkEntries: ent,
9474 })
9475 }
9476 }
9477 }
9478
9479 var entry *modAndMkEntries = nil
9480 for _, ent := range entries {
9481 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9482 if entry != nil {
9483 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9484 } else {
9485 entry = ent
9486 }
9487 }
9488 }
9489
9490 if entry == nil {
9491 t.Errorf("AndroidMk entry for \"stublib\" missing")
9492 } else {
9493 isPrebuilt := entry.mod.Prebuilt() != nil
9494 if isPrebuilt != test.usePrebuilt {
9495 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9496 }
9497 if !entry.mod.IsStubs() {
9498 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9499 }
9500 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9501 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9502 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009503 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009504 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009505 if !android.InList(expected, cflags) {
9506 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9507 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009508 }
9509 })
9510 }
9511 })
9512 }
9513}
9514
Colin Crossc33e5212021-05-25 18:16:02 -07009515func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009516 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009517 bp := `
9518 apex {
9519 name: "myapex",
9520 key: "myapex.key",
9521 java_libs: ["mylib"],
9522 bootclasspath_fragments: ["mybootclasspathfragment"],
9523 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9524 updatable: false,
9525 }
9526
9527 apex_key {
9528 name: "myapex.key",
9529 public_key: "testkey.avbpubkey",
9530 private_key: "testkey.pem",
9531 }
9532
9533 java_library {
9534 name: "mylib",
9535 srcs: ["mylib.java"],
9536 apex_available: ["myapex"],
9537 compile_dex: true,
9538 }
9539
9540 bootclasspath_fragment {
9541 name: "mybootclasspathfragment",
9542 contents: ["mybootclasspathlib"],
9543 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009544 hidden_api: {
9545 split_packages: ["*"],
9546 },
Colin Crossc33e5212021-05-25 18:16:02 -07009547 }
9548
9549 java_library {
9550 name: "mybootclasspathlib",
9551 srcs: ["mybootclasspathlib.java"],
9552 apex_available: ["myapex"],
9553 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009554 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009555 }
9556
9557 systemserverclasspath_fragment {
9558 name: "mysystemserverclasspathfragment",
9559 contents: ["mysystemserverclasspathlib"],
9560 apex_available: ["myapex"],
9561 }
9562
9563 java_library {
9564 name: "mysystemserverclasspathlib",
9565 srcs: ["mysystemserverclasspathlib.java"],
9566 apex_available: ["myapex"],
9567 compile_dex: true,
9568 }
9569 `
9570
9571 result := android.GroupFixturePreparers(
9572 PrepareForTestWithApexBuildComponents,
9573 prepareForTestWithMyapex,
9574 java.PrepareForTestWithJavaDefaultModules,
9575 android.PrepareForTestWithAndroidBuildComponents,
9576 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009577 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9578 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009579 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009580 ).RunTest(t)
9581
9582 // Make sure jacoco ran on both mylib and mybootclasspathlib
9583 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9584 t.Errorf("Failed to find jacoco rule for mylib")
9585 }
9586 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9587 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9588 }
9589 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9590 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9591 }
9592}
9593
Jiyong Park192600a2021-08-03 07:52:17 +00009594func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009595 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009596 testApexError(t, `executable mybin is static`, `
9597 apex {
9598 name: "myapex",
9599 key: "myapex.key",
9600 binaries: ["mybin"],
9601 min_sdk_version: "29",
9602 }
9603
9604 apex_key {
9605 name: "myapex.key",
9606 public_key: "testkey.avbpubkey",
9607 private_key: "testkey.pem",
9608 }
9609
9610 cc_binary {
9611 name: "mybin",
9612 srcs: ["mylib.cpp"],
9613 relative_install_path: "foo/bar",
9614 static_executable: true,
9615 system_shared_libs: [],
9616 stl: "none",
9617 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009618 min_sdk_version: "29",
9619 }
9620 `)
9621
9622 testApexError(t, `executable mybin.rust is static`, `
9623 apex {
9624 name: "myapex",
9625 key: "myapex.key",
9626 binaries: ["mybin.rust"],
9627 min_sdk_version: "29",
9628 }
9629
9630 apex_key {
9631 name: "myapex.key",
9632 public_key: "testkey.avbpubkey",
9633 private_key: "testkey.pem",
9634 }
9635
9636 rust_binary {
9637 name: "mybin.rust",
9638 srcs: ["foo.rs"],
9639 static_executable: true,
9640 apex_available: ["myapex"],
9641 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009642 }
9643 `)
9644}
9645
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009646func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009647 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009648 ctx := testApex(t, `
9649 apex {
9650 name: "myapex",
9651 key: "myapex.key",
9652 updatable: false,
9653 java_libs: ["foo"],
9654 }
9655
9656 apex_key {
9657 name: "myapex.key",
9658 public_key: "testkey.avbpubkey",
9659 private_key: "testkey.pem",
9660 }
9661
9662 java_library {
9663 name: "foo",
9664 srcs: ["foo.java"],
9665 apex_available: ["myapex"],
9666 installable: true,
9667 }
9668 `,
9669 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9670 )
9671
Jooyung Hana0503a52023-08-23 13:12:50 +09009672 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009673 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9674 var builder strings.Builder
9675 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9676 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009677 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 +00009678}
9679
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009680func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009681 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009682 ctx := testApex(t, `
9683 apex {
9684 name: "myapex",
9685 key: "myapex.key",
9686 updatable: false,
9687 java_libs: ["foo"],
9688 required: ["otherapex"],
9689 }
9690
9691 apex {
9692 name: "otherapex",
9693 key: "myapex.key",
9694 updatable: false,
9695 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009696 }
9697
9698 apex_key {
9699 name: "myapex.key",
9700 public_key: "testkey.avbpubkey",
9701 private_key: "testkey.pem",
9702 }
9703
9704 java_library {
9705 name: "foo",
9706 srcs: ["foo.java"],
9707 apex_available: ["myapex", "otherapex"],
9708 installable: true,
9709 }
9710 `)
9711
Jooyung Hana0503a52023-08-23 13:12:50 +09009712 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009713 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9714 var builder strings.Builder
9715 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9716 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009717 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009718}
9719
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009720func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009721 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009722 ctx := testApex(t, `
9723 apex {
9724 name: "myapex",
9725 key: "myapex.key",
9726 updatable: false,
9727 }
9728
9729 apex_key {
9730 name: "myapex.key",
9731 public_key: "testkey.avbpubkey",
9732 private_key: "testkey.pem",
9733 }
9734 `)
9735
Jooyung Hana0503a52023-08-23 13:12:50 +09009736 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009737 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009738 data := android.AndroidMkDataForTest(t, ctx, bundle)
9739 var builder strings.Builder
9740 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9741 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009742 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009743}
9744
Jooyung Hana6d36672022-02-24 13:58:07 +09009745func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009746 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009747 for _, tc := range []struct {
9748 name string
9749 ref string
9750 expected_data []string
9751 }{
9752 {
9753 name: "test_using_output",
9754 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009755 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009756 },
9757 {
9758 name: "test_using_apex",
9759 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009760 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009761 },
9762 } {
9763 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009764 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009765 ctx := testApex(t, `
9766 apex {
9767 name: "myapex",
9768 key: "myapex.key",
9769 compressible: true,
9770 updatable: false,
9771 }
9772
9773 apex_key {
9774 name: "myapex.key",
9775 public_key: "testkey.avbpubkey",
9776 private_key: "testkey.pem",
9777 }
9778
9779 java_test {
9780 name: "`+tc.name+`",
9781 srcs: ["a.java"],
9782 data: ["`+tc.ref+`"],
9783 }
9784 `,
9785 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9786 variables.CompressedApex = proptools.BoolPtr(true)
9787 }))
9788 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9789 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9790 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9791 })
9792 }
9793}
9794
satayev758968a2021-12-06 11:42:40 +00009795func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009796 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009797 preparer := android.GroupFixturePreparers(
9798 PrepareForTestWithApexBuildComponents,
9799 prepareForTestWithMyapex,
9800 java.PrepareForTestWithJavaSdkLibraryFiles,
9801 java.PrepareForTestWithJavaDefaultModules,
9802 android.PrepareForTestWithAndroidBuildComponents,
9803 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9804 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9805 )
9806
9807 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9808 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009809 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009810 preparer.RunTestWithBp(t, `
9811 apex {
9812 name: "myapex",
9813 key: "myapex.key",
9814 bootclasspath_fragments: ["mybootclasspathfragment"],
9815 min_sdk_version: "30",
9816 updatable: false,
9817 }
9818
9819 apex_key {
9820 name: "myapex.key",
9821 public_key: "testkey.avbpubkey",
9822 private_key: "testkey.pem",
9823 }
9824
9825 bootclasspath_fragment {
9826 name: "mybootclasspathfragment",
9827 contents: ["mybootclasspathlib"],
9828 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009829 hidden_api: {
9830 split_packages: ["*"],
9831 },
satayev758968a2021-12-06 11:42:40 +00009832 }
9833
9834 java_sdk_library {
9835 name: "mybootclasspathlib",
9836 srcs: ["mybootclasspathlib.java"],
9837 apex_available: ["myapex"],
9838 compile_dex: true,
9839 unsafe_ignore_missing_latest_api: true,
9840 min_sdk_version: "31",
9841 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009842 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009843 }
9844
9845 java_library {
9846 name: "util",
9847 srcs: ["a.java"],
9848 apex_available: ["myapex"],
9849 min_sdk_version: "31",
9850 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009851 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009852 }
9853
9854 java_library {
9855 name: "another_util",
9856 srcs: ["a.java"],
9857 min_sdk_version: "31",
9858 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009859 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009860 }
9861 `)
9862 })
9863
9864 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9865 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009866 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009867 preparer.RunTestWithBp(t, `
9868 apex {
9869 name: "myapex",
9870 key: "myapex.key",
9871 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9872 min_sdk_version: "30",
9873 updatable: false,
9874 }
9875
9876 apex_key {
9877 name: "myapex.key",
9878 public_key: "testkey.avbpubkey",
9879 private_key: "testkey.pem",
9880 }
9881
9882 systemserverclasspath_fragment {
9883 name: "mysystemserverclasspathfragment",
9884 contents: ["mysystemserverclasspathlib"],
9885 apex_available: ["myapex"],
9886 }
9887
9888 java_sdk_library {
9889 name: "mysystemserverclasspathlib",
9890 srcs: ["mysystemserverclasspathlib.java"],
9891 apex_available: ["myapex"],
9892 compile_dex: true,
9893 min_sdk_version: "32",
9894 unsafe_ignore_missing_latest_api: true,
9895 static_libs: ["util"],
9896 }
9897
9898 java_library {
9899 name: "util",
9900 srcs: ["a.java"],
9901 apex_available: ["myapex"],
9902 min_sdk_version: "31",
9903 static_libs: ["another_util"],
9904 }
9905
9906 java_library {
9907 name: "another_util",
9908 srcs: ["a.java"],
9909 min_sdk_version: "31",
9910 apex_available: ["myapex"],
9911 }
9912 `)
9913 })
9914
9915 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009916 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009917 preparer.
satayev758968a2021-12-06 11:42:40 +00009918 RunTestWithBp(t, `
9919 apex {
9920 name: "myapex",
9921 key: "myapex.key",
9922 bootclasspath_fragments: ["mybootclasspathfragment"],
9923 min_sdk_version: "30",
9924 updatable: false,
9925 }
9926
9927 apex_key {
9928 name: "myapex.key",
9929 public_key: "testkey.avbpubkey",
9930 private_key: "testkey.pem",
9931 }
9932
9933 bootclasspath_fragment {
9934 name: "mybootclasspathfragment",
9935 contents: ["mybootclasspathlib"],
9936 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009937 hidden_api: {
9938 split_packages: ["*"],
9939 },
satayev758968a2021-12-06 11:42:40 +00009940 }
9941
9942 java_sdk_library {
9943 name: "mybootclasspathlib",
9944 srcs: ["mybootclasspathlib.java"],
9945 apex_available: ["myapex"],
9946 compile_dex: true,
9947 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009948 sdk_version: "current",
9949 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009950 }
9951 `)
9952 })
9953
9954 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009955 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009956 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9957 RunTestWithBp(t, `
9958 apex {
9959 name: "myapex",
9960 key: "myapex.key",
9961 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9962 min_sdk_version: "30",
9963 updatable: false,
9964 }
9965
9966 apex_key {
9967 name: "myapex.key",
9968 public_key: "testkey.avbpubkey",
9969 private_key: "testkey.pem",
9970 }
9971
9972 systemserverclasspath_fragment {
9973 name: "mysystemserverclasspathfragment",
9974 contents: ["mysystemserverclasspathlib"],
9975 apex_available: ["myapex"],
9976 }
9977
9978 java_sdk_library {
9979 name: "mysystemserverclasspathlib",
9980 srcs: ["mysystemserverclasspathlib.java"],
9981 apex_available: ["myapex"],
9982 compile_dex: true,
9983 unsafe_ignore_missing_latest_api: true,
9984 }
9985 `)
9986 })
9987}
9988
Jiakai Zhang6decef92022-01-12 17:56:19 +00009989// Verifies that the APEX depends on all the Make modules in the list.
9990func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9991 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9992 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009993 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009994 }
9995}
9996
9997// Verifies that the APEX does not depend on any of the Make modules in the list.
9998func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9999 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10000 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010001 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010002 }
10003}
10004
Cole Faust24e25c02024-01-19 14:12:17 -080010005func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010006 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010007 bpTemplate := `
10008 apex {
10009 name: "myapex",
10010 key: "myapex.key",
10011 java_libs: ["myjavalib"],
10012 updatable: %v,
10013 min_sdk_version: "29",
10014 }
10015 apex_key {
10016 name: "myapex.key",
10017 }
10018 java_library {
10019 name: "myjavalib",
10020 srcs: ["MyClass.java"],
10021 apex_available: [ "myapex" ],
10022 lint: {
10023 strict_updatability_linting: %v,
10024 %s
10025 },
10026 sdk_version: "current",
10027 min_sdk_version: "29",
10028 }
10029 `
10030 fs := android.MockFS{
10031 "lint-baseline.xml": nil,
10032 }
10033
10034 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010035 testCaseName string
10036 apexUpdatable bool
10037 javaStrictUpdtabilityLint bool
10038 lintFileExists bool
10039 disallowedFlagExpectedOnApex bool
10040 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010041 }{
10042 {
Colin Cross87427352024-09-25 15:41:19 -070010043 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10044 apexUpdatable: true,
10045 javaStrictUpdtabilityLint: true,
10046 lintFileExists: false,
10047 disallowedFlagExpectedOnApex: false,
10048 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010049 },
10050 {
Colin Cross87427352024-09-25 15:41:19 -070010051 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10052 apexUpdatable: false,
10053 javaStrictUpdtabilityLint: false,
10054 lintFileExists: true,
10055 disallowedFlagExpectedOnApex: false,
10056 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010057 },
10058 {
Colin Cross87427352024-09-25 15:41:19 -070010059 testCaseName: "non-updatable apex respects strict updatability of javalib",
10060 apexUpdatable: false,
10061 javaStrictUpdtabilityLint: true,
10062 lintFileExists: true,
10063 disallowedFlagExpectedOnApex: false,
10064 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010065 },
10066 {
Colin Cross87427352024-09-25 15:41:19 -070010067 testCaseName: "updatable apex checks strict updatability of javalib",
10068 apexUpdatable: true,
10069 javaStrictUpdtabilityLint: false,
10070 lintFileExists: true,
10071 disallowedFlagExpectedOnApex: true,
10072 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010073 },
10074 }
10075
10076 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010077 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010078 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010079 fixtures := []android.FixturePreparer{}
10080 baselineProperty := ""
10081 if testCase.lintFileExists {
10082 fixtures = append(fixtures, fs.AddToFixture())
10083 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10084 }
10085 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010086
Colin Cross87427352024-09-25 15:41:19 -070010087 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010088
Colin Cross87427352024-09-25 15:41:19 -070010089 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10090 if expectStrictUpdatability {
10091 if m.Rule == nil {
10092 t.Errorf("expected strict updatability check rule on %s", name)
10093 } else {
10094 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10095 m.RuleParams.Command, "--disallowed_issues NewApi")
10096 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10097 m.Inputs.Strings(), "lint-baseline.xml")
10098 }
10099 } else {
10100 if m.Rule != nil {
10101 t.Errorf("expected no strict updatability check rule on %s", name)
10102 }
10103 }
10104 }
10105
10106 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10107 apex := result.ModuleForTests("myapex", "android_common_myapex")
10108 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10109 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10110
10111 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10112 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10113 })
Cole Faust24e25c02024-01-19 14:12:17 -080010114 }
10115}
10116
Cole Faust24e25c02024-01-19 14:12:17 -080010117// checks transtive deps of an apex coming from bootclasspath_fragment
10118func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010119 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010120 bp := `
10121 apex {
10122 name: "myapex",
10123 key: "myapex.key",
10124 bootclasspath_fragments: ["mybootclasspathfragment"],
10125 updatable: true,
10126 min_sdk_version: "29",
10127 }
10128 apex_key {
10129 name: "myapex.key",
10130 }
10131 bootclasspath_fragment {
10132 name: "mybootclasspathfragment",
10133 contents: ["myjavalib"],
10134 apex_available: ["myapex"],
10135 hidden_api: {
10136 split_packages: ["*"],
10137 },
10138 }
10139 java_library {
10140 name: "myjavalib",
10141 srcs: ["MyClass.java"],
10142 apex_available: [ "myapex" ],
10143 sdk_version: "current",
10144 min_sdk_version: "29",
10145 compile_dex: true,
10146 lint: {
10147 baseline_filename: "lint-baseline.xml",
10148 }
10149 }
10150 `
10151 fs := android.MockFS{
10152 "lint-baseline.xml": nil,
10153 }
10154
10155 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010156 apex := result.ModuleForTests("myapex", "android_common_myapex")
10157 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10158 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10159 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10160 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10161 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010162}
Spandan Das66773252022-01-15 00:23:18 +000010163
Jihoon Kang784c0052024-06-25 22:15:39 +000010164func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010165 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010166 bp := `
10167 apex {
10168 name: "myapex",
10169 key: "myapex.key",
10170 bootclasspath_fragments: ["mybootclasspathfragment"],
10171 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010172 java_libs: [
10173 "jacocoagent",
10174 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010175 }
10176 apex_key {
10177 name: "myapex.key",
10178 }
10179 bootclasspath_fragment {
10180 name: "mybootclasspathfragment",
10181 contents: ["foo"],
10182 apex_available: ["myapex"],
10183 hidden_api: {
10184 split_packages: ["*"],
10185 },
10186 }
10187 java_sdk_library {
10188 name: "foo",
10189 srcs: ["MyClass.java"],
10190 apex_available: [ "myapex" ],
10191 sdk_version: "current",
10192 min_sdk_version: "29",
10193 compile_dex: true,
10194 }
10195 `
10196 fs := android.MockFS{
10197 "lint-baseline.xml": nil,
10198 }
10199
10200 result := android.GroupFixturePreparers(
10201 prepareForApexTest,
10202 java.PrepareForTestWithJavaSdkLibraryFiles,
10203 java.PrepareForTestWithJacocoInstrumentation,
10204 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010205 android.FixtureMergeMockFs(fs),
10206 ).RunTestWithBp(t, bp)
10207
10208 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10209 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10210 android.AssertStringDoesContain(t,
10211 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10212 lintReportInputs, "foo.impl")
10213}
10214
Spandan Das42e89502022-05-06 22:12:55 +000010215// updatable apexes should propagate updatable=true to its apps
10216func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010217 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010218 bp := `
10219 apex {
10220 name: "myapex",
10221 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010222 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010223 apps: [
10224 "myapp",
10225 ],
10226 min_sdk_version: "30",
10227 }
10228 apex_key {
10229 name: "myapex.key",
10230 }
10231 android_app {
10232 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010233 apex_available: [
10234 "myapex",
10235 ],
10236 sdk_version: "current",
10237 min_sdk_version: "30",
10238 }
10239 `
Colin Cross99939e92024-10-01 16:02:46 -070010240 _ = android.GroupFixturePreparers(
10241 prepareForApexTest,
10242 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10243 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010244}
10245
Dennis Shend4f5d932023-01-31 20:27:21 +000010246func TestTrimmedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010247 t.Parallel()
Dennis Shend4f5d932023-01-31 20:27:21 +000010248 bp := `
10249 apex {
10250 name: "myapex",
10251 key: "myapex.key",
10252 native_shared_libs: ["libfoo","libbaz"],
10253 min_sdk_version: "29",
10254 trim_against: "mydcla",
10255 }
10256 apex {
10257 name: "mydcla",
10258 key: "myapex.key",
10259 native_shared_libs: ["libfoo","libbar"],
10260 min_sdk_version: "29",
10261 file_contexts: ":myapex-file_contexts",
10262 dynamic_common_lib_apex: true,
10263 }
10264 apex_key {
10265 name: "myapex.key",
10266 }
10267 cc_library {
10268 name: "libfoo",
10269 shared_libs: ["libc"],
10270 apex_available: ["myapex","mydcla"],
10271 min_sdk_version: "29",
10272 }
10273 cc_library {
10274 name: "libbar",
10275 shared_libs: ["libc"],
10276 apex_available: ["myapex","mydcla"],
10277 min_sdk_version: "29",
10278 }
10279 cc_library {
10280 name: "libbaz",
10281 shared_libs: ["libc"],
10282 apex_available: ["myapex","mydcla"],
10283 min_sdk_version: "29",
10284 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010285 `
10286 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010287 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010288 apexRule := module.MaybeRule("apexRule")
10289 if apexRule.Rule == nil {
10290 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10291 }
10292
10293 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010294 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010295 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10296 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10297 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10298 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10299}
Jingwen Chendea7a642023-03-28 11:30:50 +000010300
10301func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010302 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010303 ctx := testApex(t, `
10304 apex {
10305 name: "myapex",
10306 key: "myapex.key",
10307 updatable: false,
10308 }
10309
10310 apex_key {
10311 name: "myapex.key",
10312 public_key: "testkey.avbpubkey",
10313 private_key: "testkey.pem",
10314 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010315 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010316 generateFsRule := mod.Rule("generateFsConfig")
10317 cmd := generateFsRule.RuleParams.Command
10318
10319 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10320}
10321
10322func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010323 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010324 ctx := testApex(t, `
10325 apex {
10326 name: "myapex",
10327 key: "myapex.key",
10328 canned_fs_config: "my_config",
10329 updatable: false,
10330 }
10331
10332 apex_key {
10333 name: "myapex.key",
10334 public_key: "testkey.avbpubkey",
10335 private_key: "testkey.pem",
10336 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010337 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010338 generateFsRule := mod.Rule("generateFsConfig")
10339 cmd := generateFsRule.RuleParams.Command
10340
10341 // Ensure that canned_fs_config has "cat my_config" at the end
10342 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10343}
Spandan Das20fce2d2023-04-12 17:21:39 +000010344
10345func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010346 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010347 testCases := []struct {
10348 desc string
10349 hasStubs bool
10350 apexAvailable string
10351 expectedError string
10352 }{
10353 {
10354 desc: "non-stub library can have multiple apex_available",
10355 hasStubs: false,
10356 apexAvailable: `["myapex", "otherapex"]`,
10357 },
10358 {
10359 desc: "stub library should not be available to anyapex",
10360 hasStubs: true,
10361 apexAvailable: `["//apex_available:anyapex"]`,
10362 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10363 },
10364 {
10365 desc: "stub library should not be available to multiple apexes",
10366 hasStubs: true,
10367 apexAvailable: `["myapex", "otherapex"]`,
10368 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10369 },
10370 {
10371 desc: "stub library can be available to a core apex and a test apex",
10372 hasStubs: true,
10373 apexAvailable: `["myapex", "test_myapex"]`,
10374 },
10375 }
10376 bpTemplate := `
10377 cc_library {
10378 name: "libfoo",
10379 %v
10380 apex_available: %v,
10381 }
10382 apex {
10383 name: "myapex",
10384 key: "apex.key",
10385 updatable: false,
10386 native_shared_libs: ["libfoo"],
10387 }
10388 apex {
10389 name: "otherapex",
10390 key: "apex.key",
10391 updatable: false,
10392 }
10393 apex_test {
10394 name: "test_myapex",
10395 key: "apex.key",
10396 updatable: false,
10397 native_shared_libs: ["libfoo"],
10398 }
10399 apex_key {
10400 name: "apex.key",
10401 }
10402 `
10403 for _, tc := range testCases {
10404 stubs := ""
10405 if tc.hasStubs {
10406 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10407 }
10408 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10409 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10410 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10411 })
10412 if tc.expectedError == "" {
10413 testApex(t, bp, mockFsFixturePreparer)
10414 } else {
10415 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10416 }
10417 }
10418}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010419
10420func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010421 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010422 context := android.GroupFixturePreparers(
10423 android.PrepareForIntegrationTestWithAndroid,
10424 cc.PrepareForIntegrationTestWithCc,
10425 PrepareForTestWithApexBuildComponents,
10426 prepareForTestWithMyapex,
10427 filesystem.PrepareForTestWithFilesystemBuildComponents,
10428 )
10429 result := context.RunTestWithBp(t, `
10430 android_system_image {
10431 name: "myfilesystem",
10432 deps: [
10433 "libfoo",
10434 ],
10435 linker_config_src: "linker.config.json",
10436 }
10437
10438 cc_library {
10439 name: "libfoo",
10440 shared_libs: [
10441 "libbar",
10442 ],
10443 stl: "none",
10444 }
10445
10446 cc_library {
10447 name: "libbar",
10448 stl: "none",
10449 apex_available: ["myapex"],
10450 }
10451
10452 apex {
10453 name: "myapex",
10454 native_shared_libs: ["libbar"],
10455 key: "myapex.key",
10456 updatable: false,
10457 }
10458
10459 apex_key {
10460 name: "myapex.key",
10461 public_key: "testkey.avbpubkey",
10462 private_key: "testkey.pem",
10463 }
10464 `)
10465
Cole Faust3b806d32024-03-11 15:15:03 -070010466 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010467 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10468 inputs.Strings(),
10469 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10470}
Yu Liueae7b362023-11-16 17:05:47 -080010471
10472var apex_default_bp = `
10473 apex_key {
10474 name: "myapex.key",
10475 public_key: "testkey.avbpubkey",
10476 private_key: "testkey.pem",
10477 }
10478
10479 filegroup {
10480 name: "myapex.manifest",
10481 srcs: ["apex_manifest.json"],
10482 }
10483
10484 filegroup {
10485 name: "myapex.androidmanifest",
10486 srcs: ["AndroidManifest.xml"],
10487 }
10488`
10489
10490func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010491 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010492 ctx := testApex(t, apex_default_bp+`
10493 apex {
10494 name: "myapex",
10495 manifest: ":myapex.manifest",
10496 androidManifest: ":myapex.androidmanifest",
10497 key: "myapex.key",
10498 java_libs: [
10499 "my_java_library_foo",
10500 "my_java_library_bar",
10501 ],
10502 updatable: false,
10503 }
10504
10505 java_library {
10506 name: "my_java_library_foo",
10507 srcs: ["foo/bar/MyClass.java"],
10508 sdk_version: "none",
10509 system_modules: "none",
10510 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010511 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010512 "myapex",
10513 ],
10514 }
10515
10516 java_library {
10517 name: "my_java_library_bar",
10518 srcs: ["foo/bar/MyClass.java"],
10519 sdk_version: "none",
10520 system_modules: "none",
10521 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010522 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010523 "myapex",
10524 ],
10525 }
10526
10527 aconfig_declarations {
10528 name: "my_aconfig_declarations_foo",
10529 package: "com.example.package",
10530 container: "myapex",
10531 srcs: ["foo.aconfig"],
10532 }
10533
10534 java_aconfig_library {
10535 name: "my_java_aconfig_library_foo",
10536 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010537 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010538 "myapex",
10539 ],
10540 }
10541
10542 aconfig_declarations {
10543 name: "my_aconfig_declarations_bar",
10544 package: "com.example.package",
10545 container: "myapex",
10546 srcs: ["bar.aconfig"],
10547 }
10548
10549 java_aconfig_library {
10550 name: "my_java_aconfig_library_bar",
10551 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010552 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010553 "myapex",
10554 ],
10555 }
10556 `)
10557
10558 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10559 s := mod.Rule("apexRule").Args["copy_commands"]
10560 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010561 if len(copyCmds) != 14 {
10562 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010563 }
10564
Jooyung Hana3fddf42024-09-03 13:22:21 +090010565 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10566 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10567 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10568 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010569 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010570
Yu Liubba555e2024-02-17 00:36:42 +000010571 inputs := []string{
10572 "my_aconfig_declarations_foo/intermediate.pb",
10573 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010574 }
Yu Liubba555e2024-02-17 00:36:42 +000010575 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10576 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10577 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10578 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010579 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010580}
10581
10582func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010583 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010584 ctx := testApex(t, apex_default_bp+`
10585 apex {
10586 name: "myapex",
10587 manifest: ":myapex.manifest",
10588 androidManifest: ":myapex.androidmanifest",
10589 key: "myapex.key",
10590 java_libs: [
10591 "my_java_library_foo",
10592 ],
10593 native_shared_libs: [
10594 "my_cc_library_bar",
10595 ],
10596 binaries: [
10597 "my_cc_binary_baz",
10598 ],
10599 updatable: false,
10600 }
10601
10602 java_library {
10603 name: "my_java_library_foo",
10604 srcs: ["foo/bar/MyClass.java"],
10605 sdk_version: "none",
10606 system_modules: "none",
10607 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010608 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010609 "myapex",
10610 ],
10611 }
10612
10613 cc_library {
10614 name: "my_cc_library_bar",
10615 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010616 static_libs: [
10617 "my_cc_aconfig_library_bar",
10618 "my_cc_aconfig_library_baz",
10619 ],
Yu Liueae7b362023-11-16 17:05:47 -080010620 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010621 "myapex",
10622 ],
10623 }
10624
10625 cc_binary {
10626 name: "my_cc_binary_baz",
10627 srcs: ["foo/bar/MyClass.cc"],
10628 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010629 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010630 "myapex",
10631 ],
10632 }
10633
10634 aconfig_declarations {
10635 name: "my_aconfig_declarations_foo",
10636 package: "com.example.package",
10637 container: "myapex",
10638 srcs: ["foo.aconfig"],
10639 }
10640
10641 java_aconfig_library {
10642 name: "my_java_aconfig_library_foo",
10643 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010644 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010645 "myapex",
10646 ],
10647 }
10648
10649 aconfig_declarations {
10650 name: "my_aconfig_declarations_bar",
10651 package: "com.example.package",
10652 container: "myapex",
10653 srcs: ["bar.aconfig"],
10654 }
10655
10656 cc_aconfig_library {
10657 name: "my_cc_aconfig_library_bar",
10658 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010659 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010660 "myapex",
10661 ],
10662 }
10663
10664 aconfig_declarations {
10665 name: "my_aconfig_declarations_baz",
10666 package: "com.example.package",
10667 container: "myapex",
10668 srcs: ["baz.aconfig"],
10669 }
10670
10671 cc_aconfig_library {
10672 name: "my_cc_aconfig_library_baz",
10673 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010674 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010675 "myapex",
10676 ],
10677 }
10678
10679 cc_library {
10680 name: "server_configurable_flags",
10681 srcs: ["server_configurable_flags.cc"],
10682 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010683 cc_library {
10684 name: "libbase",
10685 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010686 apex_available: [
10687 "myapex",
10688 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010689 }
10690 cc_library {
10691 name: "libaconfig_storage_read_api_cc",
10692 srcs: ["libaconfig_storage_read_api_cc.cc"],
10693 }
Yu Liueae7b362023-11-16 17:05:47 -080010694 `)
10695
10696 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10697 s := mod.Rule("apexRule").Args["copy_commands"]
10698 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010699 if len(copyCmds) != 18 {
10700 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010701 }
10702
Jooyung Hana3fddf42024-09-03 13:22:21 +090010703 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10704 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10705 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10706 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010707 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010708
Yu Liubba555e2024-02-17 00:36:42 +000010709 inputs := []string{
10710 "my_aconfig_declarations_foo/intermediate.pb",
10711 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10712 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010713 }
Yu Liubba555e2024-02-17 00:36:42 +000010714 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10715 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10716 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10717 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010718 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010719}
10720
Yu Liucec0e412023-11-30 16:45:50 -080010721func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010722 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010723 ctx := testApex(t, apex_default_bp+`
10724 apex {
10725 name: "myapex",
10726 manifest: ":myapex.manifest",
10727 androidManifest: ":myapex.androidmanifest",
10728 key: "myapex.key",
10729 native_shared_libs: [
10730 "libmy_rust_library",
10731 ],
10732 binaries: [
10733 "my_rust_binary",
10734 ],
10735 rust_dyn_libs: [
10736 "libmy_rust_dylib",
10737 ],
10738 updatable: false,
10739 }
10740
10741 rust_library {
10742 name: "libflags_rust", // test mock
10743 crate_name: "flags_rust",
10744 srcs: ["lib.rs"],
10745 apex_available: [
10746 "myapex",
10747 ],
10748 }
10749
10750 rust_library {
10751 name: "liblazy_static", // test mock
10752 crate_name: "lazy_static",
10753 srcs: ["src/lib.rs"],
10754 apex_available: [
10755 "myapex",
10756 ],
10757 }
10758
Ted Bauer02d475c2024-03-27 20:56:26 +000010759 rust_library {
10760 name: "libaconfig_storage_read_api", // test mock
10761 crate_name: "aconfig_storage_read_api",
10762 srcs: ["src/lib.rs"],
10763 apex_available: [
10764 "myapex",
10765 ],
10766 }
10767
Ted Bauer6ef40db2024-03-29 14:04:10 +000010768 rust_library {
10769 name: "liblogger", // test mock
10770 crate_name: "logger",
10771 srcs: ["src/lib.rs"],
10772 apex_available: [
10773 "myapex",
10774 ],
10775 }
10776
10777 rust_library {
10778 name: "liblog_rust", // test mock
10779 crate_name: "log_rust",
10780 srcs: ["src/lib.rs"],
10781 apex_available: [
10782 "myapex",
10783 ],
10784 }
10785
Yu Liucec0e412023-11-30 16:45:50 -080010786 rust_ffi_shared {
10787 name: "libmy_rust_library",
10788 srcs: ["src/lib.rs"],
10789 rustlibs: ["libmy_rust_aconfig_library_foo"],
10790 crate_name: "my_rust_library",
10791 apex_available: [
10792 "myapex",
10793 ],
10794 }
10795
10796 rust_library_dylib {
10797 name: "libmy_rust_dylib",
10798 srcs: ["foo/bar/MyClass.rs"],
10799 rustlibs: ["libmy_rust_aconfig_library_bar"],
10800 crate_name: "my_rust_dylib",
10801 apex_available: [
10802 "myapex",
10803 ],
10804 }
10805
10806 rust_binary {
10807 name: "my_rust_binary",
10808 srcs: ["foo/bar/MyClass.rs"],
10809 rustlibs: [
10810 "libmy_rust_aconfig_library_baz",
10811 "libmy_rust_dylib",
10812 ],
10813 apex_available: [
10814 "myapex",
10815 ],
10816 }
10817
10818 aconfig_declarations {
10819 name: "my_aconfig_declarations_foo",
10820 package: "com.example.package",
10821 container: "myapex",
10822 srcs: ["foo.aconfig"],
10823 }
10824
10825 aconfig_declarations {
10826 name: "my_aconfig_declarations_bar",
10827 package: "com.example.package",
10828 container: "myapex",
10829 srcs: ["bar.aconfig"],
10830 }
10831
10832 aconfig_declarations {
10833 name: "my_aconfig_declarations_baz",
10834 package: "com.example.package",
10835 container: "myapex",
10836 srcs: ["baz.aconfig"],
10837 }
10838
10839 rust_aconfig_library {
10840 name: "libmy_rust_aconfig_library_foo",
10841 aconfig_declarations: "my_aconfig_declarations_foo",
10842 crate_name: "my_rust_aconfig_library_foo",
10843 apex_available: [
10844 "myapex",
10845 ],
10846 }
10847
10848 rust_aconfig_library {
10849 name: "libmy_rust_aconfig_library_bar",
10850 aconfig_declarations: "my_aconfig_declarations_bar",
10851 crate_name: "my_rust_aconfig_library_bar",
10852 apex_available: [
10853 "myapex",
10854 ],
10855 }
10856
10857 rust_aconfig_library {
10858 name: "libmy_rust_aconfig_library_baz",
10859 aconfig_declarations: "my_aconfig_declarations_baz",
10860 crate_name: "my_rust_aconfig_library_baz",
10861 apex_available: [
10862 "myapex",
10863 ],
10864 }
10865 `)
10866
10867 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10868 s := mod.Rule("apexRule").Args["copy_commands"]
10869 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010870 if len(copyCmds) != 38 {
10871 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010872 }
10873
Jooyung Hana3fddf42024-09-03 13:22:21 +090010874 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10875 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10876 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10877 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010878 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010879
Yu Liubba555e2024-02-17 00:36:42 +000010880 inputs := []string{
10881 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010882 "my_aconfig_declarations_bar/intermediate.pb",
10883 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010884 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10885 }
10886 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10887 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10888 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10889 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010890 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010891}
10892
10893func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10894 aconfigRule := mod.Description(desc)
10895 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010896 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010897 if len(aconfigArgs) != len(inputs) {
10898 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010899 }
Yu Liucec0e412023-11-30 16:45:50 -080010900
Yu Liubba555e2024-02-17 00:36:42 +000010901 ensureEquals(t, container, aconfigRule.Args["container"])
10902 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10903
10904 buildParams := aconfigRule.BuildParams
10905 for _, input := range inputs {
10906 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10907 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010908 }
Yu Liubba555e2024-02-17 00:36:42 +000010909
10910 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010911}
10912
Yu Liueae7b362023-11-16 17:05:47 -080010913func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010914 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010915 ctx := testApex(t, apex_default_bp+`
10916 apex {
10917 name: "myapex",
10918 manifest: ":myapex.manifest",
10919 androidManifest: ":myapex.androidmanifest",
10920 key: "myapex.key",
10921 java_libs: [
10922 "my_java_library_foo",
10923 "other_java_library_bar",
10924 ],
10925 updatable: false,
10926 }
10927
10928 java_library {
10929 name: "my_java_library_foo",
10930 srcs: ["foo/bar/MyClass.java"],
10931 sdk_version: "none",
10932 system_modules: "none",
10933 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010934 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010935 "myapex",
10936 ],
10937 }
10938
10939 java_library {
10940 name: "other_java_library_bar",
10941 srcs: ["foo/bar/MyClass.java"],
10942 sdk_version: "none",
10943 system_modules: "none",
10944 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010945 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010946 "myapex",
10947 ],
10948 }
10949
10950 aconfig_declarations {
10951 name: "my_aconfig_declarations_foo",
10952 package: "com.example.package",
10953 container: "myapex",
10954 srcs: ["foo.aconfig"],
10955 }
10956
10957 java_aconfig_library {
10958 name: "my_java_aconfig_library_foo",
10959 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010960 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010961 "myapex",
10962 ],
10963 }
10964
10965 aconfig_declarations {
10966 name: "other_aconfig_declarations_bar",
10967 package: "com.example.package",
10968 container: "otherapex",
10969 srcs: ["bar.aconfig"],
10970 }
10971
10972 java_aconfig_library {
10973 name: "other_java_aconfig_library_bar",
10974 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010975 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010976 "myapex",
10977 ],
10978 }
10979 `)
10980
10981 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10982 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10983 s := " " + combineAconfigRule.Args["cache_files"]
10984 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10985 if len(aconfigArgs) != 1 {
10986 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10987 }
10988 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10989
10990 buildParams := combineAconfigRule.BuildParams
10991 if len(buildParams.Inputs) != 1 {
10992 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10993 }
10994 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10995 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10996}
10997
10998func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010999 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011000 ctx := testApex(t, apex_default_bp+`
11001 apex {
11002 name: "myapex",
11003 manifest: ":myapex.manifest",
11004 androidManifest: ":myapex.androidmanifest",
11005 key: "myapex.key",
11006 java_libs: [
11007 "my_java_library_foo",
11008 "my_java_library_bar",
11009 ],
11010 updatable: false,
11011 }
11012
11013 java_library {
11014 name: "my_java_library_foo",
11015 srcs: ["foo/bar/MyClass.java"],
11016 sdk_version: "none",
11017 system_modules: "none",
11018 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011019 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011020 "myapex",
11021 ],
11022 }
11023
11024 java_library {
11025 name: "my_java_library_bar",
11026 srcs: ["foo/bar/MyClass.java"],
11027 sdk_version: "none",
11028 system_modules: "none",
11029 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011030 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011031 "myapex",
11032 ],
11033 }
11034
11035 aconfig_declarations {
11036 name: "my_aconfig_declarations_foo",
11037 package: "com.example.package",
11038 container: "myapex",
11039 srcs: ["foo.aconfig"],
11040 }
11041
11042 java_aconfig_library {
11043 name: "my_java_aconfig_library_foo",
11044 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011045 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011046 "myapex",
11047 ],
11048 }
11049
11050 java_aconfig_library {
11051 name: "my_java_aconfig_library_bar",
11052 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011053 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011054 "myapex",
11055 ],
11056 }
11057 `)
11058
11059 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11060 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11061 s := " " + combineAconfigRule.Args["cache_files"]
11062 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11063 if len(aconfigArgs) != 1 {
11064 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11065 }
11066 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11067
11068 buildParams := combineAconfigRule.BuildParams
11069 if len(buildParams.Inputs) != 1 {
11070 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11071 }
11072 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11073 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11074}
Spandan Das5be63332023-12-13 00:06:32 +000011075
11076// Test that the boot jars come from the _selected_ apex prebuilt
11077// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11078func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011079 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011080 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11081 t.Helper()
11082 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11083 foundLibfooJar := false
11084 base := stem + ".jar"
11085 for _, output := range s.AllOutputs() {
11086 if filepath.Base(output) == base {
11087 foundLibfooJar = true
11088 buildRule := s.Output(output)
11089 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11090 }
11091 }
11092 if !foundLibfooJar {
11093 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11094 }
11095 }
11096
Spandan Das64c9e0c2023-12-20 20:13:34 +000011097 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11098 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11099 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11100 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11101 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11102 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)
11103 }
11104
11105 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11106 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11107 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11108 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11109 }
11110
Spandan Das5be63332023-12-13 00:06:32 +000011111 bp := `
11112 // Source APEX.
11113
11114 java_library {
11115 name: "framework-foo",
11116 srcs: ["foo.java"],
11117 installable: true,
11118 apex_available: [
11119 "com.android.foo",
11120 ],
11121 }
11122
11123 bootclasspath_fragment {
11124 name: "foo-bootclasspath-fragment",
11125 contents: ["framework-foo"],
11126 apex_available: [
11127 "com.android.foo",
11128 ],
11129 hidden_api: {
11130 split_packages: ["*"],
11131 },
11132 }
11133
11134 apex_key {
11135 name: "com.android.foo.key",
11136 public_key: "com.android.foo.avbpubkey",
11137 private_key: "com.android.foo.pem",
11138 }
11139
11140 apex {
11141 name: "com.android.foo",
11142 key: "com.android.foo.key",
11143 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11144 updatable: false,
11145 }
11146
11147 // Prebuilt APEX.
11148
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011149 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011150 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011151 public: {
11152 jars: ["foo.jar"],
11153 },
Spandan Das5be63332023-12-13 00:06:32 +000011154 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011155 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011156 }
11157
11158 prebuilt_bootclasspath_fragment {
11159 name: "foo-bootclasspath-fragment",
11160 contents: ["framework-foo"],
11161 hidden_api: {
11162 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11163 metadata: "my-bootclasspath-fragment/metadata.csv",
11164 index: "my-bootclasspath-fragment/index.csv",
11165 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11166 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11167 },
11168 apex_available: [
11169 "com.android.foo",
11170 ],
11171 }
11172
11173 prebuilt_apex {
11174 name: "com.android.foo",
11175 apex_name: "com.android.foo",
11176 src: "com.android.foo-arm.apex",
11177 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11178 }
11179
11180 // Another Prebuilt ART APEX
11181 prebuilt_apex {
11182 name: "com.android.foo.v2",
11183 apex_name: "com.android.foo", // Used to determine the API domain
11184 src: "com.android.foo-arm.apex",
11185 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11186 }
11187
11188 // APEX contribution modules
11189
11190 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011191 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011192 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011193 contents: ["com.android.foo"],
11194 }
11195
11196 apex_contributions {
11197 name: "foo.prebuilt.contributions",
11198 api_domain: "com.android.foo",
11199 contents: ["prebuilt_com.android.foo"],
11200 }
11201
11202 apex_contributions {
11203 name: "foo.prebuilt.v2.contributions",
11204 api_domain: "com.android.foo",
11205 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011206 }
11207 `
11208
11209 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011210 desc string
11211 selectedApexContributions string
11212 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011213 }{
11214 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011215 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11216 selectedApexContributions: "foo.source.contributions",
11217 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011218 },
11219 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011220 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11221 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011222 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 +000011223 },
11224 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011225 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11226 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011227 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 +000011228 },
11229 }
11230
11231 fragment := java.ApexVariantReference{
11232 Apex: proptools.StringPtr("com.android.foo"),
11233 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11234 }
11235
11236 for _, tc := range testCases {
11237 preparer := android.GroupFixturePreparers(
11238 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11239 android.FixtureMergeMockFs(map[string][]byte{
11240 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11241 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011242 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11243 // file creation.
11244 java.FixtureConfigureBootJars("platform:foo"),
11245 android.FixtureModifyMockFS(func(fs android.MockFS) {
11246 fs["platform/Android.bp"] = []byte(`
11247 java_library {
11248 name: "foo",
11249 srcs: ["Test.java"],
11250 compile_dex: true,
11251 }
11252 `)
11253 fs["platform/Test.java"] = nil
11254 }),
11255
Colin Crossa66b4632024-08-08 15:50:47 -070011256 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011257 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011258 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011259 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011260 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11261 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011262 }
11263}
Spandan Das3576e762024-01-03 18:57:03 +000011264
11265// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11266// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11267func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011268 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011269 // for a mainline module family, check that only the flagged soong module is visible to make
11270 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11271 variation := func(moduleName string) string {
11272 ret := "android_common_com.android.foo"
11273 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011274 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011275 }
11276 return ret
11277 }
11278
11279 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11280 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11281
11282 for _, hiddenModuleName := range hiddenModuleNames {
11283 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11284 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11285
11286 }
11287 }
11288
11289 bp := `
11290 apex_key {
11291 name: "com.android.foo.key",
11292 public_key: "com.android.foo.avbpubkey",
11293 private_key: "com.android.foo.pem",
11294 }
11295
11296 // AOSP source apex
11297 apex {
11298 name: "com.android.foo",
11299 key: "com.android.foo.key",
11300 updatable: false,
11301 }
11302
11303 // Google source apex
11304 override_apex {
11305 name: "com.google.android.foo",
11306 base: "com.android.foo",
11307 key: "com.android.foo.key",
11308 }
11309
11310 // Prebuilt Google APEX.
11311
11312 prebuilt_apex {
11313 name: "com.google.android.foo",
11314 apex_name: "com.android.foo",
11315 src: "com.android.foo-arm.apex",
11316 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11317 }
11318
11319 // Another Prebuilt Google APEX
11320 prebuilt_apex {
11321 name: "com.google.android.foo.v2",
11322 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011323 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011324 src: "com.android.foo-arm.apex",
11325 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11326 }
11327
11328 // APEX contribution modules
11329
11330 apex_contributions {
11331 name: "foo.source.contributions",
11332 api_domain: "com.android.foo",
11333 contents: ["com.google.android.foo"],
11334 }
11335
11336 apex_contributions {
11337 name: "foo.prebuilt.contributions",
11338 api_domain: "com.android.foo",
11339 contents: ["prebuilt_com.google.android.foo"],
11340 }
11341
11342 apex_contributions {
11343 name: "foo.prebuilt.v2.contributions",
11344 api_domain: "com.android.foo",
11345 contents: ["prebuilt_com.google.android.foo.v2"],
11346 }
11347
11348 // This is an incompatible module because it selects multiple versions of the same mainline module
11349 apex_contributions {
11350 name: "foo.prebuilt.duplicate.contributions",
11351 api_domain: "com.android.foo",
11352 contents: [
11353 "prebuilt_com.google.android.foo",
11354 "prebuilt_com.google.android.foo.v2",
11355 ],
11356 }
11357 `
11358
11359 testCases := []struct {
11360 desc string
11361 selectedApexContributions string
11362 expectedVisibleModuleName string
11363 expectedHiddenModuleNames []string
11364 expectedError string
11365 }{
11366 {
11367 desc: "Source apex is selected, prebuilts should be hidden from make",
11368 selectedApexContributions: "foo.source.contributions",
11369 expectedVisibleModuleName: "com.google.android.foo",
11370 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11371 },
11372 {
11373 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11374 selectedApexContributions: "foo.prebuilt.contributions",
11375 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11376 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11377 },
11378 {
11379 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11380 selectedApexContributions: "foo.prebuilt.v2.contributions",
11381 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11382 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11383 },
11384 {
11385 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11386 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11387 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11388 },
11389 }
11390
11391 for _, tc := range testCases {
11392 preparer := android.GroupFixturePreparers(
11393 android.FixtureMergeMockFs(map[string][]byte{
11394 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11395 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011396 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011397 )
11398 if tc.expectedError != "" {
11399 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11400 testApex(t, bp, preparer)
11401 return
11402 }
11403 ctx := testApex(t, bp, preparer)
11404
Spandan Das3576e762024-01-03 18:57:03 +000011405 // Check that
11406 // 1. The contents of the selected apex_contributions are visible to make
11407 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11408 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11409 }
11410}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011411
Spandan Das85bd4622024-08-01 00:51:20 +000011412// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11413func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011414 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011415 // for a mainline module family, check that only the flagged soong module is visible to make
11416 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11417 variation := func(moduleName string) string {
11418 ret := "android_common_com.android.adservices"
11419 if moduleName == "com.google.android.foo" {
11420 ret = "android_common_com.google.android.foo_com.google.android.foo"
11421 }
11422 return ret
11423 }
11424
11425 for _, visibleModuleName := range visibleModuleNames {
11426 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11427 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11428 }
11429
11430 for _, hiddenModuleName := range hiddenModuleNames {
11431 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11432 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11433
11434 }
11435 }
11436
11437 bp := `
11438 apex_key {
11439 name: "com.android.adservices.key",
11440 public_key: "com.android.adservices.avbpubkey",
11441 private_key: "com.android.adservices.pem",
11442 }
11443
11444 // AOSP source apex
11445 apex {
11446 name: "com.android.adservices",
11447 key: "com.android.adservices.key",
11448 updatable: false,
11449 }
11450
11451 // Prebuilt Google APEX.
11452
11453 prebuilt_apex {
11454 name: "com.google.android.adservices",
11455 apex_name: "com.android.adservices",
11456 src: "com.android.foo-arm.apex",
11457 }
11458
11459 // Another Prebuilt Google APEX
11460 prebuilt_apex {
11461 name: "com.google.android.adservices.v2",
11462 apex_name: "com.android.adservices",
11463 src: "com.android.foo-arm.apex",
11464 }
11465
11466 // APEX contribution modules
11467
11468
11469 apex_contributions {
11470 name: "adservices.prebuilt.contributions",
11471 api_domain: "com.android.adservices",
11472 contents: ["prebuilt_com.google.android.adservices"],
11473 }
11474
11475 apex_contributions {
11476 name: "adservices.prebuilt.v2.contributions",
11477 api_domain: "com.android.adservices",
11478 contents: ["prebuilt_com.google.android.adservices.v2"],
11479 }
11480 `
11481
11482 testCases := []struct {
11483 desc string
11484 selectedApexContributions string
11485 expectedVisibleModuleNames []string
11486 expectedHiddenModuleNames []string
11487 }{
11488 {
11489 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11490 selectedApexContributions: "",
11491 expectedVisibleModuleNames: []string{"com.android.adservices"},
11492 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11493 },
11494 {
11495 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11496 selectedApexContributions: "adservices.prebuilt.contributions",
11497 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11498 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11499 },
11500 {
11501 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11502 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11503 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11504 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11505 },
11506 }
11507
11508 for _, tc := range testCases {
11509 preparer := android.GroupFixturePreparers(
11510 android.FixtureMergeMockFs(map[string][]byte{
11511 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11512 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011513 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011514 )
11515 ctx := testApex(t, bp, preparer)
11516
11517 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11518 }
11519}
11520
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011521func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011522 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011523 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11524 for _, moduleName := range moduleNames {
11525 ret += fmt.Sprintf(`
11526 aconfig_declarations {
11527 name: "%[1]s",
11528 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011529 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011530 srcs: [
11531 "%[1]s.aconfig",
11532 ],
11533 }
11534 java_aconfig_library {
11535 name: "%[1]s-lib",
11536 aconfig_declarations: "%[1]s",
11537 }
11538 `, moduleName)
11539 }
11540 return ret
11541 }
11542
11543 result := android.GroupFixturePreparers(
11544 prepareForApexTest,
11545 java.PrepareForTestWithJavaSdkLibraryFiles,
11546 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011547 ).RunTestWithBp(t, `
11548 java_library {
11549 name: "baz-java-lib",
11550 static_libs: [
11551 "baz-lib",
11552 ],
11553 }
11554 filegroup {
11555 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011556 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011557 ":qux-lib{.generated_srcjars}",
11558 ],
11559 }
11560 filegroup {
11561 name: "qux-another-filegroup",
11562 srcs: [
11563 ":qux-filegroup",
11564 ],
11565 }
11566 java_library {
11567 name: "quux-java-lib",
11568 srcs: [
11569 "a.java",
11570 ],
11571 libs: [
11572 "quux-lib",
11573 ],
11574 }
11575 java_sdk_library {
11576 name: "foo",
11577 srcs: [
11578 ":qux-another-filegroup",
11579 ],
11580 api_packages: ["foo"],
11581 system: {
11582 enabled: true,
11583 },
11584 module_lib: {
11585 enabled: true,
11586 },
11587 test: {
11588 enabled: true,
11589 },
11590 static_libs: [
11591 "bar-lib",
11592 ],
11593 libs: [
11594 "baz-java-lib",
11595 "quux-java-lib",
11596 ],
11597 aconfig_declarations: [
11598 "bar",
11599 ],
11600 }
11601 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11602
11603 m := result.ModuleForTests("foo.stubs.source", "android_common")
11604 outDir := "out/soong/.intermediates"
11605
11606 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11607 // textproto files
11608 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11609
11610 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11611 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11612 // to aconfig.
11613 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11614 "passed as an input",
11615 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11616
11617 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11618 // to metalava as classpath. Thus the cache file provided by the associated
11619 // aconfig_declarations module "baz" should be passed to aconfig.
11620 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11621 "java_aconfig_library passed as an input",
11622 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11623
11624 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11625 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11626 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11627 "input",
11628 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11629
11630 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11631 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11632 // aconfig_declarations module "quux" should not be passed to aconfig.
11633 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11634 "depend on java_aconfig_library not passed as an input",
11635 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11636}
Cole Faust7c991b42024-05-15 11:17:55 -070011637
11638func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011639 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011640 ctx := testApex(t, `
11641 apex {
11642 name: "myapex",
11643 key: "myapex.key",
11644 prebuilts: ["myetc", "myetc2"],
11645 min_sdk_version: "29",
11646 }
11647 apex_key {
11648 name: "myapex.key",
11649 public_key: "testkey.avbpubkey",
11650 private_key: "testkey.pem",
11651 }
11652
11653 prebuilt_etc {
11654 name: "myetc",
11655 src: "myprebuilt",
11656 filename: "myfilename",
11657 }
11658 prebuilt_etc {
11659 name: "myetc2",
11660 sub_dir: "mysubdir",
11661 src: "myprebuilt",
11662 filename: "myfilename",
11663 }
11664 `, withFiles(android.MockFS{
11665 "packages/modules/common/build/allowed_deps.txt": nil,
11666 }))
11667
11668 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11669 data := android.AndroidMkDataForTest(t, ctx, ab)
11670 var builder strings.Builder
11671 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11672 androidMk := builder.String()
11673
11674 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11675 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11676}
Spandan Das50801e22024-05-13 18:29:45 +000011677
11678func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011679 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011680 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11681 args := module.Rule("apexRule").Args
11682 optFlags := args["opt_flags"]
11683 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11684 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11685 }
11686 }
11687
11688 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11689 t.Helper()
11690 found := false
11691 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11692 if dep == wantDep {
11693 found = true
11694 }
11695 })
11696 if !found {
11697 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11698 }
11699 }
11700
11701 ctx := testApex(t, `
11702 apex {
11703 name: "com.android.apex30",
11704 min_sdk_version: "30",
11705 key: "apex30.key",
11706 java_libs: ["javalib"],
11707 }
11708
11709 java_library {
11710 name: "javalib",
11711 srcs: ["A.java"],
11712 apex_available: ["com.android.apex30"],
11713 min_sdk_version: "30",
11714 sdk_version: "current",
11715 }
11716
11717 override_apex {
11718 name: "com.mycompany.android.apex30",
11719 base: "com.android.apex30",
11720 }
11721
11722 override_apex {
11723 name: "com.mycompany.android.apex31",
11724 base: "com.android.apex30",
11725 min_sdk_version: "31",
11726 }
11727
11728 apex_key {
11729 name: "apex30.key",
11730 public_key: "testkey.avbpubkey",
11731 private_key: "testkey.pem",
11732 }
11733
11734 `, android.FixtureMergeMockFs(android.MockFS{
11735 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11736 }),
11737 )
11738
11739 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11740 checkMinSdkVersion(t, baseModule, "30")
11741
11742 // Override module, but uses same min_sdk_version
11743 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11744 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11745 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11746 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11747
11748 // Override module, uses different min_sdk_version
11749 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11750 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11751 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11752 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11753}
Spandan Das0b28fa02024-05-28 23:40:17 +000011754
11755func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011756 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011757 context := android.GroupFixturePreparers(
11758 android.PrepareForIntegrationTestWithAndroid,
11759 PrepareForTestWithApexBuildComponents,
11760 android.FixtureMergeMockFs(android.MockFS{
11761 "system/sepolicy/apex/foo-file_contexts": nil,
11762 }),
11763 )
11764 res := context.RunTestWithBp(t, `
11765 apex {
11766 name: "foo",
11767 key: "myapex.key",
11768 apex_available_name: "com.android.foo",
11769 variant_version: "0",
11770 updatable: false,
11771 }
11772 apex_key {
11773 name: "myapex.key",
11774 public_key: "testkey.avbpubkey",
11775 private_key: "testkey.pem",
11776 }
11777 prebuilt_apex {
11778 name: "foo",
11779 src: "foo.apex",
11780 prefer: true,
11781 }
11782 override_apex {
11783 name: "myoverrideapex",
11784 base: "foo",
11785 }
11786 `)
11787
11788 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11789}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011790
11791func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011792 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011793 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`, `
11794 apex {
11795 name: "myapex",
11796 key: "myapex.key",
11797 updatable: true,
11798 min_sdk_version: "current",
11799 }
11800
11801 apex_key {
11802 name: "myapex.key",
11803 public_key: "testkey.avbpubkey",
11804 private_key: "testkey.pem",
11805 }
11806 `)
11807}
Spandan Das2f68f192024-07-22 19:25:50 +000011808
11809func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011810 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011811 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11812 result := android.GroupFixturePreparers(
11813 prepareForApexTest,
11814 android.PrepareForTestWithAndroidMk,
11815 android.PrepareForTestWithMakevars,
11816 android.FixtureMergeMockFs(fs),
11817 ).RunTest(t)
11818
11819 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011820 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011821
11822 installRules := result.InstallMakeRulesForTesting(t)
11823
11824 var installedlibRule *android.InstallMakeRule
11825 for i, rule := range installRules {
11826 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11827 if installedlibRule != nil {
11828 t.Errorf("Duplicate install rules for %s", rule.Target)
11829 }
11830 installedlibRule = &installRules[i]
11831 }
11832 }
11833 if installedlibRule == nil {
11834 t.Errorf("No install rule found for installedlib")
11835 return
11836 }
11837
11838 if expectLibfooOnSystemLib {
11839 android.AssertStringListContains(t,
11840 "installedlib doesn't have install dependency on libfoo impl",
11841 installedlibRule.OrderOnlyDeps,
11842 "out/target/product/test_device/system/lib/libfoo.so")
11843 } else {
11844 android.AssertStringListDoesNotContain(t,
11845 "installedlib has install dependency on libfoo stub",
11846 installedlibRule.Deps,
11847 "out/target/product/test_device/system/lib/libfoo.so")
11848 android.AssertStringListDoesNotContain(t,
11849 "installedlib has order-only install dependency on libfoo stub",
11850 installedlibRule.OrderOnlyDeps,
11851 "out/target/product/test_device/system/lib/libfoo.so")
11852 }
11853 }
11854
11855 prebuiltLibfooBp := []byte(`
11856 cc_prebuilt_library {
11857 name: "libfoo",
11858 prefer: true,
11859 srcs: ["libfoo.so"],
11860 stubs: {
11861 versions: ["1"],
11862 },
11863 apex_available: ["apexfoo"],
11864 }
11865 `)
11866
11867 apexfooBp := []byte(`
11868 apex {
11869 name: "apexfoo",
11870 key: "apexfoo.key",
11871 native_shared_libs: ["libfoo"],
11872 updatable: false,
11873 compile_multilib: "both",
11874 }
11875 apex_key {
11876 name: "apexfoo.key",
11877 public_key: "testkey.avbpubkey",
11878 private_key: "testkey.pem",
11879 }
11880 `)
11881
11882 installedlibBp := []byte(`
11883 cc_library {
11884 name: "installedlib",
11885 shared_libs: ["libfoo"],
11886 }
11887 `)
11888
11889 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011890 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011891 testFunc(
11892 t,
11893 /*expectLibfooOnSystemLib=*/ false,
11894 android.MockFS{
11895 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11896 "apexfoo/Android.bp": apexfooBp,
11897 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11898 "Android.bp": installedlibBp,
11899 },
11900 )
11901 })
11902
11903 disabledSourceLibfooBp := []byte(`
11904 cc_library {
11905 name: "libfoo",
11906 enabled: false,
11907 stubs: {
11908 versions: ["1"],
11909 },
11910 apex_available: ["apexfoo"],
11911 }
11912 `)
11913
11914 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011915 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011916 testFunc(
11917 t,
11918 /*expectLibfooOnSystemLib=*/ false,
11919 android.MockFS{
11920 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11921 "impl/Android.bp": disabledSourceLibfooBp,
11922 "apexfoo/Android.bp": apexfooBp,
11923 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11924 "Android.bp": installedlibBp,
11925 },
11926 )
11927 })
11928}
Jihoon Kange246bb72024-09-18 22:26:22 +000011929
11930func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011931 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011932 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11933 // in libs of android_app and java_library does not lead to class loader context device/host
11934 // path mismatch errors.
11935 android.GroupFixturePreparers(
11936 prepareForApexTest,
11937 android.PrepareForIntegrationTestWithAndroid,
11938 PrepareForTestWithApexBuildComponents,
11939 android.FixtureModifyEnv(func(env map[string]string) {
11940 env["DISABLE_CONTAINER_CHECK"] = "true"
11941 }),
11942 withFiles(filesForSdkLibrary),
11943 android.FixtureMergeMockFs(android.MockFS{
11944 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11945 }),
11946 ).RunTestWithBp(t, `
11947 apex {
11948 name: "com.android.foo30",
11949 key: "myapex.key",
11950 updatable: true,
11951 bootclasspath_fragments: [
11952 "foo-bootclasspath-fragment",
11953 ],
11954 java_libs: [
11955 "bar",
11956 ],
11957 apps: [
11958 "bar-app",
11959 ],
11960 min_sdk_version: "30",
11961 }
11962 apex_key {
11963 name: "myapex.key",
11964 public_key: "testkey.avbpubkey",
11965 private_key: "testkey.pem",
11966 }
11967 bootclasspath_fragment {
11968 name: "foo-bootclasspath-fragment",
11969 contents: [
11970 "framework-foo",
11971 ],
11972 apex_available: [
11973 "com.android.foo30",
11974 ],
11975 hidden_api: {
11976 split_packages: ["*"]
11977 },
11978 }
11979
11980 java_sdk_library {
11981 name: "framework-foo",
11982 srcs: [
11983 "A.java"
11984 ],
11985 unsafe_ignore_missing_latest_api: true,
11986 apex_available: [
11987 "com.android.foo30",
11988 ],
11989 compile_dex: true,
11990 sdk_version: "core_current",
11991 shared_library: false,
11992 }
11993
11994 java_library {
11995 name: "bar",
11996 srcs: [
11997 "A.java"
11998 ],
11999 libs: [
12000 "framework-foo.impl",
12001 ],
12002 apex_available: [
12003 "com.android.foo30",
12004 ],
12005 sdk_version: "core_current",
12006 }
12007
12008 java_library {
12009 name: "baz",
12010 srcs: [
12011 "A.java"
12012 ],
12013 libs: [
12014 "bar",
12015 ],
12016 sdk_version: "core_current",
12017 }
12018
12019 android_app {
12020 name: "bar-app",
12021 srcs: [
12022 "A.java"
12023 ],
12024 libs: [
12025 "baz",
12026 "framework-foo.impl",
12027 ],
12028 apex_available: [
12029 "com.android.foo30",
12030 ],
12031 sdk_version: "core_current",
12032 min_sdk_version: "30",
12033 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012034 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012035 }
12036 `)
12037}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012038
12039// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12040func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012041 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012042 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12043 apex {
12044 name: "myapex",
12045 key: "myapex.key",
12046 systemserverclasspath_fragments: [
12047 "mysystemserverclasspathfragment",
12048 ],
12049 min_sdk_version: "29",
12050 updatable: true,
12051 system_ext_specific: true,
12052 }
12053
12054 apex_key {
12055 name: "myapex.key",
12056 public_key: "testkey.avbpubkey",
12057 private_key: "testkey.pem",
12058 }
12059
12060 java_library {
12061 name: "foo",
12062 srcs: ["b.java"],
12063 min_sdk_version: "29",
12064 installable: true,
12065 apex_available: [
12066 "myapex",
12067 ],
12068 sdk_version: "current",
12069 }
12070
12071 systemserverclasspath_fragment {
12072 name: "mysystemserverclasspathfragment",
12073 contents: [
12074 "foo",
12075 ],
12076 apex_available: [
12077 "myapex",
12078 ],
12079 }
12080 `,
12081 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12082 )
12083}
Spandan Das72d86c62024-10-15 19:27:41 +000012084
12085// partitions should not package the artifacts that are included inside the apex.
12086func TestFilesystemWithApexDeps(t *testing.T) {
12087 t.Parallel()
12088 result := testApex(t, `
12089 android_filesystem {
12090 name: "myfilesystem",
12091 deps: ["myapex"],
12092 }
12093 apex {
12094 name: "myapex",
12095 key: "myapex.key",
12096 binaries: ["binfoo"],
12097 native_shared_libs: ["libfoo"],
12098 apps: ["appfoo"],
12099 updatable: false,
12100 }
12101 apex_key {
12102 name: "myapex.key",
12103 }
12104 cc_binary {
12105 name: "binfoo",
12106 apex_available: ["myapex"],
12107 }
12108 cc_library {
12109 name: "libfoo",
12110 apex_available: ["myapex"],
12111 }
12112 android_app {
12113 name: "appfoo",
12114 sdk_version: "current",
12115 apex_available: ["myapex"],
12116 }
12117 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12118
12119 partition := result.ModuleForTests("myfilesystem", "android_common")
12120 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12121 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12122}
Colin Crossb614cd42024-10-11 12:52:21 -070012123
12124func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12125 t.Parallel()
12126
12127 extractDepenencyPathFromErrors := func(errs []error) []string {
12128 i := slices.IndexFunc(errs, func(err error) bool {
12129 return strings.Contains(err.Error(), "dependency path:")
12130 })
12131 if i < 0 {
12132 return nil
12133 }
12134 var dependencyPath []string
12135 for _, err := range errs[i+1:] {
12136 s := err.Error()
12137 lastSpace := strings.LastIndexByte(s, ' ')
12138 if lastSpace >= 0 {
12139 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12140 }
12141 }
12142 return dependencyPath
12143 }
12144
12145 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12146 return func(t *testing.T, result *android.TestResult) {
12147 t.Helper()
12148 if len(result.Errs) == 0 {
12149 t.Fatalf("expected errors")
12150 }
12151 t.Log("found errors:")
12152 for _, err := range result.Errs {
12153 t.Log(err)
12154 }
12155 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12156 t.Fatalf("expected error %q, got %q", w, g)
12157 }
12158 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12159 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12160 t.Errorf("expected dependency path %q, got %q", w, g)
12161 }
12162 }
12163 }
12164
12165 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12166 return func(bp *bpmodify.Blueprint) {
12167 m := bp.ModulesByName(module)
12168 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12169 if err != nil {
12170 panic(err)
12171 }
12172 props.AddStringToList(lib)
12173 }
12174 }
12175
12176 bpTemplate := `
12177 apex {
12178 name: "myapex",
12179 key: "myapex.key",
12180 native_shared_libs: ["mylib"],
12181 rust_dyn_libs: ["libmyrust"],
12182 binaries: ["mybin", "myrustbin"],
12183 jni_libs: ["libjni"],
12184 apps: ["myapp"],
12185 updatable: false,
12186 }
12187
12188 apex {
12189 name: "otherapex",
12190 key: "myapex.key",
12191 native_shared_libs: ["libotherapex"],
12192 updatable: false,
12193 }
12194
12195 apex_key {
12196 name: "myapex.key",
12197 public_key: "testkey.avbpubkey",
12198 private_key: "testkey.pem",
12199 }
12200
12201 cc_library {
12202 name: "mylib",
12203 srcs: ["foo.cpp"],
12204 apex_available: ["myapex"],
12205 }
12206
12207 cc_binary {
12208 name: "mybin",
12209 srcs: ["foo.cpp"],
12210 apex_available: ["myapex"],
12211 }
12212
12213 rust_library {
12214 name: "libmyrust",
12215 crate_name: "myrust",
12216 srcs: ["src/lib.rs"],
12217 rustlibs: ["libmyrust_transitive_dylib"],
12218 rlibs: ["libmyrust_transitive_rlib"],
12219 apex_available: ["myapex"],
12220 }
12221
12222 rust_library{
12223 name: "libmyrust_transitive_dylib",
12224 crate_name: "myrust_transitive_dylib",
12225 srcs: ["src/lib.rs"],
12226 apex_available: ["myapex"],
12227 }
12228
12229 rust_library {
12230 name: "libmyrust_transitive_rlib",
12231 crate_name: "myrust_transitive_rlib",
12232 srcs: ["src/lib.rs"],
12233 apex_available: ["myapex"],
12234 }
12235
12236 rust_binary {
12237 name: "myrustbin",
12238 srcs: ["src/main.rs"],
12239 apex_available: ["myapex"],
12240 }
12241
12242 cc_library {
12243 name: "libbar",
12244 sdk_version: "current",
12245 srcs: ["bar.cpp"],
12246 apex_available: ["myapex"],
12247 stl: "none",
12248 }
12249
12250 android_app {
12251 name: "myapp",
12252 jni_libs: ["libembeddedjni"],
12253 use_embedded_native_libs: true,
12254 sdk_version: "current",
12255 apex_available: ["myapex"],
12256 }
12257
12258 cc_library {
12259 name: "libembeddedjni",
12260 sdk_version: "current",
12261 srcs: ["bar.cpp"],
12262 apex_available: ["myapex"],
12263 stl: "none",
12264 }
12265
12266 cc_library {
12267 name: "libjni",
12268 sdk_version: "current",
12269 srcs: ["bar.cpp"],
12270 apex_available: ["myapex"],
12271 stl: "none",
12272 }
12273
12274 cc_library {
12275 name: "libotherapex",
12276 sdk_version: "current",
12277 srcs: ["otherapex.cpp"],
12278 apex_available: ["otherapex"],
12279 stubs: {
12280 symbol_file: "libotherapex.map.txt",
12281 versions: ["1", "2", "3"],
12282 },
12283 stl: "none",
12284 }
12285
12286 cc_library {
12287 name: "libplatform",
12288 sdk_version: "current",
12289 srcs: ["libplatform.cpp"],
12290 stubs: {
12291 symbol_file: "libplatform.map.txt",
12292 versions: ["1", "2", "3"],
12293 },
12294 stl: "none",
12295 system_shared_libs: [],
12296 }
12297 `
12298
12299 testCases := []struct {
12300 name string
12301 bpModifier func(bp *bpmodify.Blueprint)
12302 dependencyPath []string
12303 }{
12304 {
12305 name: "library dependency in other apex",
12306 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12307 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12308 },
12309 {
12310 name: "transitive library dependency in other apex",
12311 bpModifier: func(bp *bpmodify.Blueprint) {
12312 addToSharedLibs("mylib", "libbar")(bp)
12313 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12314 },
12315 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12316 },
12317 {
12318 name: "library dependency in platform",
12319 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12320 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12321 },
12322 {
12323 name: "jni library dependency in other apex",
12324 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12325 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12326 },
12327 {
12328 name: "transitive jni library dependency in other apex",
12329 bpModifier: func(bp *bpmodify.Blueprint) {
12330 addToSharedLibs("libjni", "libbar")(bp)
12331 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12332 },
12333 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12334 },
12335 {
12336 name: "jni library dependency in platform",
12337 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12338 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12339 },
12340 {
12341 name: "transitive jni library dependency in platform",
12342 bpModifier: func(bp *bpmodify.Blueprint) {
12343 addToSharedLibs("libjni", "libbar")(bp)
12344 addToSharedLibs("libbar", "libplatform#impl")(bp)
12345 },
12346 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12347 },
12348 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12349 // JNI libraries even if they came from another apex.
12350 //{
12351 // name: "app jni library dependency in other apex",
12352 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12353 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12354 //},
12355 //{
12356 // name: "transitive app jni library dependency in other apex",
12357 // bpModifier: func(bp *bpmodify.Blueprint) {
12358 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12359 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12360 // },
12361 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12362 //},
12363 //{
12364 // name: "app jni library dependency in platform",
12365 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12366 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12367 //},
12368 //{
12369 // name: "transitive app jni library dependency in platform",
12370 // bpModifier: func(bp *bpmodify.Blueprint) {
12371 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12372 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12373 // },
12374 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12375 //},
12376 {
12377 name: "binary dependency in other apex",
12378 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12379 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12380 },
12381 {
12382 name: "transitive binary dependency in other apex",
12383 bpModifier: func(bp *bpmodify.Blueprint) {
12384 addToSharedLibs("mybin", "libbar")(bp)
12385 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12386 },
12387 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12388 },
12389 {
12390 name: "binary dependency in platform",
12391 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12392 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12393 },
12394 {
12395 name: "transitive binary dependency in platform",
12396 bpModifier: func(bp *bpmodify.Blueprint) {
12397 addToSharedLibs("mybin", "libbar")(bp)
12398 addToSharedLibs("libbar", "libplatform#impl")(bp)
12399 },
12400 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12401 },
12402
12403 {
12404 name: "rust library dependency in other apex",
12405 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12406 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12407 },
12408 {
12409 name: "transitive rust library dependency in other apex",
12410 bpModifier: func(bp *bpmodify.Blueprint) {
12411 addToSharedLibs("libmyrust", "libbar")(bp)
12412 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12413 },
12414 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12415 },
12416 {
12417 name: "rust library dependency in platform",
12418 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12419 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12420 },
12421 {
12422 name: "transitive rust library dependency in platform",
12423 bpModifier: func(bp *bpmodify.Blueprint) {
12424 addToSharedLibs("libmyrust", "libbar")(bp)
12425 addToSharedLibs("libbar", "libplatform#impl")(bp)
12426 },
12427 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12428 },
12429 {
12430 name: "transitive rust library dylib dependency in other apex",
12431 bpModifier: func(bp *bpmodify.Blueprint) {
12432 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12433 },
12434 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12435 },
12436 {
12437 name: "transitive rust library dylib dependency in platform",
12438 bpModifier: func(bp *bpmodify.Blueprint) {
12439 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12440 },
12441 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12442 },
12443 {
12444 name: "transitive rust library rlib dependency in other apex",
12445 bpModifier: func(bp *bpmodify.Blueprint) {
12446 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12447 },
12448 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12449 },
12450 {
12451 name: "transitive rust library rlib dependency in platform",
12452 bpModifier: func(bp *bpmodify.Blueprint) {
12453 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12454 },
12455 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12456 },
12457 {
12458 name: "rust binary dependency in other apex",
12459 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12460 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12461 },
12462 {
12463 name: "transitive rust binary dependency in other apex",
12464 bpModifier: func(bp *bpmodify.Blueprint) {
12465 addToSharedLibs("myrustbin", "libbar")(bp)
12466 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12467 },
12468 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12469 },
12470 {
12471 name: "rust binary dependency in platform",
12472 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12473 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12474 },
12475 {
12476 name: "transitive rust binary dependency in platform",
12477 bpModifier: func(bp *bpmodify.Blueprint) {
12478 addToSharedLibs("myrustbin", "libbar")(bp)
12479 addToSharedLibs("libbar", "libplatform#impl")(bp)
12480 },
12481 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12482 },
12483 }
12484
12485 for _, testCase := range testCases {
12486 t.Run(testCase.name, func(t *testing.T) {
12487 t.Parallel()
12488 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12489 if err != nil {
12490 t.Fatal(err)
12491 }
12492 if testCase.bpModifier != nil {
12493 func() {
12494 defer func() {
12495 if r := recover(); r != nil {
12496 t.Fatalf("panic in bpModifier: %v", r)
12497 }
12498 }()
12499 testCase.bpModifier(bp)
12500 }()
12501 }
12502 android.GroupFixturePreparers(
12503 android.PrepareForTestWithAndroidBuildComponents,
12504 cc.PrepareForTestWithCcBuildComponents,
12505 java.PrepareForTestWithDexpreopt,
12506 rust.PrepareForTestWithRustDefaultModules,
12507 PrepareForTestWithApexBuildComponents,
12508 prepareForTestWithMyapex,
12509 prepareForTestWithOtherapex,
12510 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12511 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12512 }),
12513 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12514 RunTestWithBp(t, bp.String())
12515 })
12516 }
12517}