blob: 9baa724283e9d640d01218f03453df75d1e6932b [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 Mohamed3413f302024-09-04 22:19:51 +00002217func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002218 t.Parallel()
Nouby Mohamed3413f302024-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 Mohamed3413f302024-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,
Nouby Mohamed3413f302024-09-04 22:19:51 +00005703 "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())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007393
7394 // The copies of the libraries in the apex should have one more dependency than
7395 // the ones outside the apex, namely the unwinder. Ideally we should check
7396 // the dependency names directly here but for some reason the names are blank in
7397 // this test.
7398 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007399 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007400 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7401 if len(apexImplicits) != len(nonApexImplicits)+1 {
7402 t.Errorf("%q missing unwinder dep", lib)
7403 }
7404 }
Jooyung Han214bf372019-11-12 13:03:50 +09007405}
7406
Paul Duffine05480a2021-03-08 15:07:14 +00007407var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007408 "api/current.txt": nil,
7409 "api/removed.txt": nil,
7410 "api/system-current.txt": nil,
7411 "api/system-removed.txt": nil,
7412 "api/test-current.txt": nil,
7413 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007414
Anton Hanssondff2c782020-12-21 17:10:01 +00007415 "100/public/api/foo.txt": nil,
7416 "100/public/api/foo-removed.txt": nil,
7417 "100/system/api/foo.txt": nil,
7418 "100/system/api/foo-removed.txt": nil,
7419
Paul Duffineedc5d52020-06-12 17:46:39 +01007420 // For java_sdk_library_import
7421 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007422}
7423
Jooyung Han58f26ab2019-12-18 15:34:32 +09007424func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007425 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007426 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007427 apex {
7428 name: "myapex",
7429 key: "myapex.key",
7430 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007431 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007432 }
7433
7434 apex_key {
7435 name: "myapex.key",
7436 public_key: "testkey.avbpubkey",
7437 private_key: "testkey.pem",
7438 }
7439
7440 java_sdk_library {
7441 name: "foo",
7442 srcs: ["a.java"],
7443 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007444 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007445 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007446
7447 prebuilt_apis {
7448 name: "sdk",
7449 api_dirs: ["100"],
7450 }
Paul Duffin9b879592020-05-26 13:21:35 +01007451 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007452
7453 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007454 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007455 "javalib/foo.jar",
7456 "etc/permissions/foo.xml",
7457 })
7458 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007459 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7460 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7461 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007462}
7463
Spandan Das3ee19692024-06-19 04:47:40 +00007464func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007465 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007466 ctx := testApex(t, `
7467 override_apex {
7468 name: "mycompanyapex",
7469 base: "myapex",
7470 }
7471 apex {
7472 name: "myapex",
7473 key: "myapex.key",
7474 java_libs: ["foo"],
7475 updatable: false,
7476 }
7477
7478 apex_key {
7479 name: "myapex.key",
7480 public_key: "testkey.avbpubkey",
7481 private_key: "testkey.pem",
7482 }
7483
7484 java_sdk_library {
7485 name: "foo",
7486 srcs: ["a.java"],
7487 api_packages: ["foo"],
7488 apex_available: [ "myapex" ],
7489 }
7490
7491 prebuilt_apis {
7492 name: "sdk",
7493 api_dirs: ["100"],
7494 }
7495 `, withFiles(filesForSdkLibrary))
7496
7497 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7498 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7499 // (com.android.foo), the filepath should not contain override apex name.
7500 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7501 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7502 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7503}
7504
Paul Duffin9b879592020-05-26 13:21:35 +01007505func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007506 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007507 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007508 apex {
7509 name: "myapex",
7510 key: "myapex.key",
7511 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007512 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007513 }
7514
7515 apex_key {
7516 name: "myapex.key",
7517 public_key: "testkey.avbpubkey",
7518 private_key: "testkey.pem",
7519 }
7520
7521 java_sdk_library {
7522 name: "foo",
7523 srcs: ["a.java"],
7524 api_packages: ["foo"],
7525 apex_available: ["myapex"],
7526 sdk_version: "none",
7527 system_modules: "none",
7528 }
7529
7530 java_library {
7531 name: "bar",
7532 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007533 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007534 apex_available: ["myapex"],
7535 sdk_version: "none",
7536 system_modules: "none",
7537 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007538
7539 prebuilt_apis {
7540 name: "sdk",
7541 api_dirs: ["100"],
7542 }
Paul Duffin9b879592020-05-26 13:21:35 +01007543 `, withFiles(filesForSdkLibrary))
7544
7545 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007546 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007547 "javalib/bar.jar",
7548 "javalib/foo.jar",
7549 "etc/permissions/foo.xml",
7550 })
7551
7552 // The bar library should depend on the implementation jar.
7553 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007554 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007555 t.Errorf("expected %q, found %#q", expected, actual)
7556 }
7557}
7558
7559func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007560 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007561 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007562 apex {
7563 name: "myapex",
7564 key: "myapex.key",
7565 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007566 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007567 }
7568
7569 apex_key {
7570 name: "myapex.key",
7571 public_key: "testkey.avbpubkey",
7572 private_key: "testkey.pem",
7573 }
7574
7575 java_sdk_library {
7576 name: "foo",
7577 srcs: ["a.java"],
7578 api_packages: ["foo"],
7579 apex_available: ["myapex"],
7580 sdk_version: "none",
7581 system_modules: "none",
7582 }
7583
7584 java_library {
7585 name: "bar",
7586 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007587 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007588 sdk_version: "none",
7589 system_modules: "none",
7590 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007591
7592 prebuilt_apis {
7593 name: "sdk",
7594 api_dirs: ["100"],
7595 }
Paul Duffin9b879592020-05-26 13:21:35 +01007596 `, withFiles(filesForSdkLibrary))
7597
7598 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007599 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007600 "javalib/foo.jar",
7601 "etc/permissions/foo.xml",
7602 })
7603
7604 // The bar library should depend on the stubs jar.
7605 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007606 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007607 t.Errorf("expected %q, found %#q", expected, actual)
7608 }
7609}
7610
Paul Duffineedc5d52020-06-12 17:46:39 +01007611func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007612 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007613 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007614 prebuilt_apis {
7615 name: "sdk",
7616 api_dirs: ["100"],
7617 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007618 withFiles(map[string][]byte{
7619 "apex/a.java": nil,
7620 "apex/apex_manifest.json": nil,
7621 "apex/Android.bp": []byte(`
7622 package {
7623 default_visibility: ["//visibility:private"],
7624 }
7625
7626 apex {
7627 name: "myapex",
7628 key: "myapex.key",
7629 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007630 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007631 }
7632
7633 apex_key {
7634 name: "myapex.key",
7635 public_key: "testkey.avbpubkey",
7636 private_key: "testkey.pem",
7637 }
7638
7639 java_library {
7640 name: "bar",
7641 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007642 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007643 apex_available: ["myapex"],
7644 sdk_version: "none",
7645 system_modules: "none",
7646 }
7647`),
7648 "source/a.java": nil,
7649 "source/api/current.txt": nil,
7650 "source/api/removed.txt": nil,
7651 "source/Android.bp": []byte(`
7652 package {
7653 default_visibility: ["//visibility:private"],
7654 }
7655
7656 java_sdk_library {
7657 name: "foo",
7658 visibility: ["//apex"],
7659 srcs: ["a.java"],
7660 api_packages: ["foo"],
7661 apex_available: ["myapex"],
7662 sdk_version: "none",
7663 system_modules: "none",
7664 public: {
7665 enabled: true,
7666 },
7667 }
7668`),
7669 "prebuilt/a.jar": nil,
7670 "prebuilt/Android.bp": []byte(`
7671 package {
7672 default_visibility: ["//visibility:private"],
7673 }
7674
7675 java_sdk_library_import {
7676 name: "foo",
7677 visibility: ["//apex", "//source"],
7678 apex_available: ["myapex"],
7679 prefer: true,
7680 public: {
7681 jars: ["a.jar"],
7682 },
7683 }
7684`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007685 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007686 )
7687
7688 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007689 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 "javalib/bar.jar",
7691 "javalib/foo.jar",
7692 "etc/permissions/foo.xml",
7693 })
7694
7695 // The bar library should depend on the implementation jar.
7696 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007697 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007698 t.Errorf("expected %q, found %#q", expected, actual)
7699 }
7700}
7701
7702func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007703 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007704 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7705 apex {
7706 name: "myapex",
7707 key: "myapex.key",
7708 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007709 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007710 }
7711
7712 apex_key {
7713 name: "myapex.key",
7714 public_key: "testkey.avbpubkey",
7715 private_key: "testkey.pem",
7716 }
7717
7718 java_sdk_library_import {
7719 name: "foo",
7720 apex_available: ["myapex"],
7721 prefer: true,
7722 public: {
7723 jars: ["a.jar"],
7724 },
7725 }
7726
7727 `, withFiles(filesForSdkLibrary))
7728}
7729
atrost6e126252020-01-27 17:01:16 +00007730func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007731 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007732 result := android.GroupFixturePreparers(
7733 prepareForApexTest,
7734 java.PrepareForTestWithPlatformCompatConfig,
7735 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007736 apex {
7737 name: "myapex",
7738 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007739 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007740 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007741 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007742 }
7743
7744 apex_key {
7745 name: "myapex.key",
7746 public_key: "testkey.avbpubkey",
7747 private_key: "testkey.pem",
7748 }
7749
7750 platform_compat_config {
7751 name: "myjar-platform-compat-config",
7752 src: ":myjar",
7753 }
7754
7755 java_library {
7756 name: "myjar",
7757 srcs: ["foo/bar/MyClass.java"],
7758 sdk_version: "none",
7759 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007760 apex_available: [ "myapex" ],
7761 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007762
7763 // Make sure that a preferred prebuilt does not affect the apex contents.
7764 prebuilt_platform_compat_config {
7765 name: "myjar-platform-compat-config",
7766 metadata: "compat-config/metadata.xml",
7767 prefer: true,
7768 }
atrost6e126252020-01-27 17:01:16 +00007769 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007770 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007771 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007772 "etc/compatconfig/myjar-platform-compat-config.xml",
7773 "javalib/myjar.jar",
7774 })
7775}
7776
Jooyung Han862c0d62022-12-21 10:15:37 +09007777func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007778 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007779 android.GroupFixturePreparers(
7780 android.PrepareForTestWithAndroidBuildComponents,
7781 PrepareForTestWithApexBuildComponents,
7782 prepareForTestWithMyapex,
7783 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7784 ).
7785 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7786 RunTestWithBp(t, `
7787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 prebuilts: ["foo", "bar"],
7791 updatable: false,
7792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 prebuilt_etc {
7801 name: "foo",
7802 src: "myprebuilt",
7803 filename_from_src: true,
7804 }
7805
7806 prebuilt_etc {
7807 name: "bar",
7808 src: "myprebuilt",
7809 filename_from_src: true,
7810 }
7811 `)
7812}
7813
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007814func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007815 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007816 bp := `
7817 apex {
7818 name: "myapex",
7819 key: "myapex.key",
7820 native_shared_libs: ["libfoo"],
7821 updatable: false,
7822 unwanted_transitive_deps: ["libbar"],
7823 }
7824
7825 apex_key {
7826 name: "myapex.key",
7827 public_key: "testkey.avbpubkey",
7828 private_key: "testkey.pem",
7829 }
7830
7831 cc_library {
7832 name: "libfoo",
7833 srcs: ["foo.cpp"],
7834 shared_libs: ["libbar"],
7835 apex_available: ["myapex"],
7836 }
7837
7838 cc_library {
7839 name: "libbar",
7840 srcs: ["bar.cpp"],
7841 apex_available: ["myapex"],
7842 }`
7843 ctx := testApex(t, bp)
7844 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7845 "*/libc++.so",
7846 "*/libfoo.so",
7847 // not libbar.so
7848 })
7849}
7850
Jiyong Park479321d2019-12-16 11:47:12 +09007851func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007852 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007853 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7854 apex {
7855 name: "myapex",
7856 key: "myapex.key",
7857 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007858 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007859 }
7860
7861 apex_key {
7862 name: "myapex.key",
7863 public_key: "testkey.avbpubkey",
7864 private_key: "testkey.pem",
7865 }
7866
7867 java_library {
7868 name: "myjar",
7869 srcs: ["foo/bar/MyClass.java"],
7870 sdk_version: "none",
7871 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007872 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007873 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007874 }
7875 `)
7876}
7877
Jiyong Park7afd1072019-12-30 16:56:33 +09007878func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007879 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007880 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007881 apex {
7882 name: "myapex",
7883 key: "myapex.key",
7884 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007885 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007886 }
7887
7888 apex_key {
7889 name: "myapex.key",
7890 public_key: "testkey.avbpubkey",
7891 private_key: "testkey.pem",
7892 }
7893
7894 cc_library {
7895 name: "mylib",
7896 srcs: ["mylib.cpp"],
7897 system_shared_libs: [],
7898 stl: "none",
7899 required: ["a", "b"],
7900 host_required: ["c", "d"],
7901 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007902 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007903 }
7904 `)
7905
Jooyung Hana0503a52023-08-23 13:12:50 +09007906 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007907 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007908 name := apexBundle.BaseModuleName()
7909 prefix := "TARGET_"
7910 var builder strings.Builder
7911 data.Custom(&builder, name, prefix, "", data)
7912 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007913 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007914 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7915 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007916}
7917
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007919 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007920 bp := `
7921 apex {
7922 name: "myapex",
7923 key: "myapex.key",
7924 native_shared_libs: ["mylib"],
7925 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007926 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007927 }
7928
Jiyong Park9d677202020-02-19 16:29:35 +09007929 apex {
7930 name: "myapex.updatable",
7931 key: "myapex.key",
7932 native_shared_libs: ["mylib"],
7933 java_libs: ["myjar"],
7934 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007935 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007936 }
7937
Jiyong Park7cd10e32020-01-14 09:22:18 +09007938 apex_key {
7939 name: "myapex.key",
7940 public_key: "testkey.avbpubkey",
7941 private_key: "testkey.pem",
7942 }
7943
7944 cc_library {
7945 name: "mylib",
7946 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007947 shared_libs: [
7948 "myotherlib",
7949 "myotherlib_ext",
7950 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007951 system_shared_libs: [],
7952 stl: "none",
7953 apex_available: [
7954 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007955 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007956 "//apex_available:platform",
7957 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007958 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 }
7960
7961 cc_library {
7962 name: "myotherlib",
7963 srcs: ["mylib.cpp"],
7964 system_shared_libs: [],
7965 stl: "none",
7966 apex_available: [
7967 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007968 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007969 "//apex_available:platform",
7970 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007971 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007972 }
7973
Jiyong Parkce243632023-02-17 18:22:25 +09007974 cc_library {
7975 name: "myotherlib_ext",
7976 srcs: ["mylib.cpp"],
7977 system_shared_libs: [],
7978 system_ext_specific: true,
7979 stl: "none",
7980 apex_available: [
7981 "myapex",
7982 "myapex.updatable",
7983 "//apex_available:platform",
7984 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007985 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007986 }
7987
Jiyong Park7cd10e32020-01-14 09:22:18 +09007988 java_library {
7989 name: "myjar",
7990 srcs: ["foo/bar/MyClass.java"],
7991 sdk_version: "none",
7992 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007993 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007994 apex_available: [
7995 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007996 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007997 "//apex_available:platform",
7998 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007999 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008000 }
8001
8002 java_library {
8003 name: "myotherjar",
8004 srcs: ["foo/bar/MyClass.java"],
8005 sdk_version: "none",
8006 system_modules: "none",
8007 apex_available: [
8008 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008009 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008010 "//apex_available:platform",
8011 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008012 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008013 }
8014 `
8015
8016 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8017 for _, f := range files {
8018 if f.path == file {
8019 if f.isLink {
8020 t.Errorf("%q is not a real file", file)
8021 }
8022 return
8023 }
8024 }
8025 t.Errorf("%q is not found", file)
8026 }
8027
Jiyong Parkce243632023-02-17 18:22:25 +09008028 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008029 for _, f := range files {
8030 if f.path == file {
8031 if !f.isLink {
8032 t.Errorf("%q is not a symlink", file)
8033 }
Jiyong Parkce243632023-02-17 18:22:25 +09008034 if f.src != target {
8035 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8036 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008037 return
8038 }
8039 }
8040 t.Errorf("%q is not found", file)
8041 }
8042
Jiyong Park9d677202020-02-19 16:29:35 +09008043 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8044 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008045 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008046 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008047 ensureRealfileExists(t, files, "javalib/myjar.jar")
8048 ensureRealfileExists(t, files, "lib64/mylib.so")
8049 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008050 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008051
Jooyung Hana0503a52023-08-23 13:12:50 +09008052 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008053 ensureRealfileExists(t, files, "javalib/myjar.jar")
8054 ensureRealfileExists(t, files, "lib64/mylib.so")
8055 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008056 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008057
8058 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008059 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008060 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008061 ensureRealfileExists(t, files, "javalib/myjar.jar")
8062 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008063 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8064 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008065
Jooyung Hana0503a52023-08-23 13:12:50 +09008066 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008067 ensureRealfileExists(t, files, "javalib/myjar.jar")
8068 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008069 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8070 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008071}
8072
Yo Chiange8128052020-07-23 20:09:18 +08008073func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008074 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008075 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008076 apex {
8077 name: "myapex",
8078 key: "myapex.key",
8079 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008080 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008081 }
8082
8083 apex_key {
8084 name: "myapex.key",
8085 public_key: "testkey.avbpubkey",
8086 private_key: "testkey.pem",
8087 }
8088
8089 cc_library_shared {
8090 name: "mylib",
8091 srcs: ["mylib.cpp"],
8092 shared_libs: ["myotherlib"],
8093 system_shared_libs: [],
8094 stl: "none",
8095 apex_available: [
8096 "myapex",
8097 "//apex_available:platform",
8098 ],
8099 }
8100
8101 cc_prebuilt_library_shared {
8102 name: "myotherlib",
8103 srcs: ["prebuilt.so"],
8104 system_shared_libs: [],
8105 stl: "none",
8106 apex_available: [
8107 "myapex",
8108 "//apex_available:platform",
8109 ],
8110 }
8111 `)
8112
Jooyung Hana0503a52023-08-23 13:12:50 +09008113 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008114 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008115 var builder strings.Builder
8116 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8117 androidMk := builder.String()
8118 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008119 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008120 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8121 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8122 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008123 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008124}
8125
Jooyung Han643adc42020-02-27 13:50:06 +09008126func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008128 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008129 apex {
8130 name: "myapex",
8131 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008132 binaries: ["mybin"],
8133 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008134 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008135 }
8136
8137 apex_key {
8138 name: "myapex.key",
8139 public_key: "testkey.avbpubkey",
8140 private_key: "testkey.pem",
8141 }
8142
8143 cc_library {
8144 name: "mylib",
8145 srcs: ["mylib.cpp"],
8146 shared_libs: ["mylib2"],
8147 system_shared_libs: [],
8148 stl: "none",
8149 apex_available: [ "myapex" ],
8150 }
8151
8152 cc_library {
8153 name: "mylib2",
8154 srcs: ["mylib.cpp"],
8155 system_shared_libs: [],
8156 stl: "none",
8157 apex_available: [ "myapex" ],
8158 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008159
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008160 // Used as both a JNI library and a regular shared library.
8161 cc_library {
8162 name: "mylib3",
8163 srcs: ["mylib.cpp"],
8164 system_shared_libs: [],
8165 stl: "none",
8166 apex_available: [ "myapex" ],
8167 }
8168
8169 cc_binary {
8170 name: "mybin",
8171 srcs: ["mybin.cpp"],
8172 shared_libs: ["mylib3"],
8173 system_shared_libs: [],
8174 stl: "none",
8175 apex_available: [ "myapex" ],
8176 }
8177
Jiyong Park34d5c332022-02-24 18:02:44 +09008178 rust_ffi_shared {
8179 name: "libfoo.rust",
8180 crate_name: "foo",
8181 srcs: ["foo.rs"],
8182 shared_libs: ["libfoo.shared_from_rust"],
8183 prefer_rlib: true,
8184 apex_available: ["myapex"],
8185 }
8186
8187 cc_library_shared {
8188 name: "libfoo.shared_from_rust",
8189 srcs: ["mylib.cpp"],
8190 system_shared_libs: [],
8191 stl: "none",
8192 stubs: {
8193 versions: ["10", "11", "12"],
8194 },
8195 }
8196
Jooyung Han643adc42020-02-27 13:50:06 +09008197 `)
8198
Jooyung Hana0503a52023-08-23 13:12:50 +09008199 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008200 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008201 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008202 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008203 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008204 "lib64/mylib.so",
8205 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008206 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008207 "lib64/libfoo.rust.so",
8208 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8209 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008210 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008211
8212 // b/220397949
8213 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008214}
8215
Jooyung Han49f67012020-04-17 13:43:10 +09008216func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008217 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008218 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008219 apex {
8220 name: "myapex",
8221 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008222 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008223 }
8224 apex_key {
8225 name: "myapex.key",
8226 public_key: "testkey.avbpubkey",
8227 private_key: "testkey.pem",
8228 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008229 `,
8230 android.FixtureModifyConfig(func(config android.Config) {
8231 delete(config.Targets, android.Android)
8232 config.AndroidCommonTarget = android.Target{}
8233 }),
8234 )
Jooyung Han49f67012020-04-17 13:43:10 +09008235
8236 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8237 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8238 }
8239}
8240
Jiyong Parkbd159612020-02-28 15:22:21 +09008241func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008242 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008243 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008244 apex {
8245 name: "myapex",
8246 key: "myapex.key",
8247 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008248 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008249 }
8250
8251 apex_key {
8252 name: "myapex.key",
8253 public_key: "testkey.avbpubkey",
8254 private_key: "testkey.pem",
8255 }
8256
8257 android_app {
8258 name: "AppFoo",
8259 srcs: ["foo/bar/MyClass.java"],
8260 sdk_version: "none",
8261 system_modules: "none",
8262 apex_available: [ "myapex" ],
8263 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008264 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008265
Jooyung Hana0503a52023-08-23 13:12:50 +09008266 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008267 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008268
8269 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008270 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 +09008271}
8272
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008273func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008274 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008275 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008276 apex {
8277 name: "myapex",
8278 key: "myapex.key",
8279 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008280 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008281 }
8282
8283 apex_key {
8284 name: "myapex.key",
8285 public_key: "testkey.avbpubkey",
8286 private_key: "testkey.pem",
8287 }
8288
8289 android_app_set {
8290 name: "AppSet",
8291 set: "AppSet.apks",
8292 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008293 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008294 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008295 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008296 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8297 s := mod.Rule("apexRule").Args["copy_commands"]
8298 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008299 if len(copyCmds) != 4 {
8300 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008301 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008302 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8303 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008304 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8305 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008306
8307 // Ensure that canned_fs_config has an entry for the app set zip file
8308 generateFsRule := mod.Rule("generateFsConfig")
8309 cmd := generateFsRule.RuleParams.Command
8310 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008311}
8312
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008313func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008314 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008315 apex_set {
8316 name: "myapex",
8317 filename: "foo_v2.apex",
8318 sanitized: {
8319 none: { set: "myapex.apks", },
8320 hwaddress: { set: "myapex.hwasan.apks", },
8321 },
Paul Duffin24704672021-04-06 16:09:30 +01008322 }
8323 `
8324 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008325
Paul Duffin24704672021-04-06 16:09:30 +01008326 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008327 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008328
Spandan Das9d6e2092024-09-21 02:50:00 +00008329 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008330 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008331
Paul Duffin24704672021-04-06 16:09:30 +01008332 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8333
8334 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008335 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8336 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008337
8338 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008339}
8340
Pranav Guptaeba03b02022-09-27 00:27:08 +00008341func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008342 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008343 ctx := testApex(t, `
8344 apex_set {
8345 name: "myapex",
8346 set: ":myapex_apks_file",
8347 }
8348
8349 filegroup {
8350 name: "myapex_apks_file",
8351 srcs: ["myapex.apks"],
8352 }
8353 `)
8354
Spandan Das9d6e2092024-09-21 02:50:00 +00008355 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008356
8357 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008358 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008359 extractedApex := m.Output(extractorOutput)
8360
8361 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8362}
8363
Paul Duffin89f570a2021-06-16 01:42:33 +01008364func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008365 t.Helper()
8366
Paul Duffin55607122021-03-30 23:32:51 +01008367 fs := android.MockFS{
8368 "a.java": nil,
8369 "a.jar": nil,
8370 "apex_manifest.json": nil,
8371 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008372 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008373 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8374 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8375 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008376 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008377 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008378
Paul Duffin55607122021-03-30 23:32:51 +01008379 errorHandler := android.FixtureExpectsNoErrors
8380 if errmsg != "" {
8381 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008382 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008383
Paul Duffin55607122021-03-30 23:32:51 +01008384 result := android.GroupFixturePreparers(
8385 cc.PrepareForTestWithCcDefaultModules,
8386 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008387 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008388 java.PrepareForTestWithJavaSdkLibraryFiles,
8389 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008390 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008391 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008392 android.FixtureModifyMockFS(func(fs android.MockFS) {
8393 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8394 insert := ""
8395 for _, fragment := range fragments {
8396 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8397 }
8398 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8399 platform_bootclasspath {
8400 name: "platform-bootclasspath",
8401 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008402 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008403 %s
8404 ],
8405 }
8406 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008407 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008408 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008409 // Dexpreopt for boot jars requires the ART boot image profile.
8410 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8411 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008412 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008413 ).
8414 ExtendWithErrorHandler(errorHandler).
8415 RunTestWithBp(t, bp)
8416
8417 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008418}
8419
Jooyung Han548640b2020-04-27 12:10:30 +09008420func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008421 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008422 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8423 apex {
8424 name: "myapex",
8425 key: "myapex.key",
8426 updatable: true,
8427 }
8428
8429 apex_key {
8430 name: "myapex.key",
8431 public_key: "testkey.avbpubkey",
8432 private_key: "testkey.pem",
8433 }
8434 `)
8435}
8436
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008437func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008438 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008439 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8440 apex {
8441 name: "myapex",
8442 key: "myapex.key",
8443 }
8444
8445 apex_key {
8446 name: "myapex.key",
8447 public_key: "testkey.avbpubkey",
8448 private_key: "testkey.pem",
8449 }
8450 `)
8451}
8452
satayevb98371c2021-06-15 16:49:50 +01008453func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008454 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008455 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8456 apex {
8457 name: "myapex",
8458 key: "myapex.key",
8459 systemserverclasspath_fragments: [
8460 "mysystemserverclasspathfragment",
8461 ],
8462 min_sdk_version: "29",
8463 updatable: true,
8464 }
8465
8466 apex_key {
8467 name: "myapex.key",
8468 public_key: "testkey.avbpubkey",
8469 private_key: "testkey.pem",
8470 }
8471
8472 java_library {
8473 name: "foo",
8474 srcs: ["b.java"],
8475 min_sdk_version: "29",
8476 installable: true,
8477 apex_available: [
8478 "myapex",
8479 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008480 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008481 }
8482
8483 systemserverclasspath_fragment {
8484 name: "mysystemserverclasspathfragment",
8485 generate_classpaths_proto: false,
8486 contents: [
8487 "foo",
8488 ],
8489 apex_available: [
8490 "myapex",
8491 ],
8492 }
satayevabcd5972021-08-06 17:49:46 +01008493 `,
8494 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8495 )
satayevb98371c2021-06-15 16:49:50 +01008496}
8497
Paul Duffin064b70c2020-11-02 17:32:38 +00008498func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008499 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008500 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008501 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008502 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008503 fragment := java.ApexVariantReference{
8504 Apex: proptools.StringPtr("myapex"),
8505 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8506 }
8507
Paul Duffin064b70c2020-11-02 17:32:38 +00008508 testDexpreoptWithApexes(t, `
8509 prebuilt_apex {
8510 name: "myapex" ,
8511 arch: {
8512 arm64: {
8513 src: "myapex-arm64.apex",
8514 },
8515 arm: {
8516 src: "myapex-arm.apex",
8517 },
8518 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008519 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8520 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008521
Paul Duffin89f570a2021-06-16 01:42:33 +01008522 prebuilt_bootclasspath_fragment {
8523 name: "my-bootclasspath-fragment",
8524 contents: ["libfoo"],
8525 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008526 hidden_api: {
8527 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8528 metadata: "my-bootclasspath-fragment/metadata.csv",
8529 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008530 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8531 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8532 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008533 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008534 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008535
Spandan Das52c01a12024-09-20 01:09:48 +00008536 java_sdk_library_import {
8537 name: "libfoo",
8538 prefer: true,
8539 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008540 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008541 },
8542 apex_available: ["myapex"],
8543 shared_library: false,
8544 permitted_packages: ["libfoo"],
8545 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008547 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008548}
8549
Spandan Dasf14e2542021-11-12 00:01:37 +00008550func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008551 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008552 bp += `
8553 apex_key {
8554 name: "myapex.key",
8555 public_key: "testkey.avbpubkey",
8556 private_key: "testkey.pem",
8557 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008558 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008559 "lib1/src/A.java": nil,
8560 "lib2/src/B.java": nil,
8561 "system/sepolicy/apex/myapex-file_contexts": nil,
8562 }
8563
Paul Duffin45338f02021-03-30 23:07:52 +01008564 errorHandler := android.FixtureExpectsNoErrors
8565 if errmsg != "" {
8566 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008567 }
Colin Crossae8600b2020-10-29 17:09:13 -07008568
Paul Duffin45338f02021-03-30 23:07:52 +01008569 android.GroupFixturePreparers(
8570 android.PrepareForTestWithAndroidBuildComponents,
8571 java.PrepareForTestWithJavaBuildComponents,
8572 PrepareForTestWithApexBuildComponents,
8573 android.PrepareForTestWithNeverallowRules(rules),
8574 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008575 apexBootJars := make([]string, 0, len(bootJars))
8576 for _, apexBootJar := range bootJars {
8577 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008578 }
satayevd604b212021-07-21 14:23:52 +01008579 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008580 }),
8581 fs.AddToFixture(),
8582 ).
8583 ExtendWithErrorHandler(errorHandler).
8584 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008585}
8586
8587func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008588 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008589 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008590 name string
8591 expectedError string
8592 bp string
8593 bootJars []string
8594 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008595 }{
8596
8597 {
8598 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8599 expectedError: "",
8600 bp: `
8601 java_library {
8602 name: "bcp_lib1",
8603 srcs: ["lib1/src/*.java"],
8604 permitted_packages: ["foo.bar"],
8605 apex_available: ["myapex"],
8606 sdk_version: "none",
8607 system_modules: "none",
8608 }
8609 java_library {
8610 name: "nonbcp_lib2",
8611 srcs: ["lib2/src/*.java"],
8612 apex_available: ["myapex"],
8613 permitted_packages: ["a.b"],
8614 sdk_version: "none",
8615 system_modules: "none",
8616 }
8617 apex {
8618 name: "myapex",
8619 key: "myapex.key",
8620 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008621 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008622 }`,
8623 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008624 bcpPermittedPackages: map[string][]string{
8625 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008626 "foo.bar",
8627 },
8628 },
8629 },
8630 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008631 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008632 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 +01008633 bp: `
8634 java_library {
8635 name: "bcp_lib1",
8636 srcs: ["lib1/src/*.java"],
8637 apex_available: ["myapex"],
8638 permitted_packages: ["foo.bar"],
8639 sdk_version: "none",
8640 system_modules: "none",
8641 }
8642 java_library {
8643 name: "bcp_lib2",
8644 srcs: ["lib2/src/*.java"],
8645 apex_available: ["myapex"],
8646 permitted_packages: ["foo.bar", "bar.baz"],
8647 sdk_version: "none",
8648 system_modules: "none",
8649 }
8650 apex {
8651 name: "myapex",
8652 key: "myapex.key",
8653 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008654 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008655 }
8656 `,
8657 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008658 bcpPermittedPackages: map[string][]string{
8659 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008660 "foo.bar",
8661 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008662 "bcp_lib2": []string{
8663 "foo.bar",
8664 },
8665 },
8666 },
8667 {
8668 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8669 expectedError: "",
8670 bp: `
8671 java_library {
8672 name: "bcp_lib_restricted",
8673 srcs: ["lib1/src/*.java"],
8674 apex_available: ["myapex"],
8675 permitted_packages: ["foo.bar"],
8676 sdk_version: "none",
8677 min_sdk_version: "29",
8678 system_modules: "none",
8679 }
8680 java_library {
8681 name: "bcp_lib_unrestricted",
8682 srcs: ["lib2/src/*.java"],
8683 apex_available: ["myapex"],
8684 permitted_packages: ["foo.bar", "bar.baz"],
8685 sdk_version: "none",
8686 min_sdk_version: "29",
8687 system_modules: "none",
8688 }
8689 apex {
8690 name: "myapex",
8691 key: "myapex.key",
8692 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8693 updatable: true,
8694 min_sdk_version: "29",
8695 }
8696 `,
8697 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8698 bcpPermittedPackages: map[string][]string{
8699 "bcp_lib1_non_updateable": []string{
8700 "foo.bar",
8701 },
8702 // 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 +01008703 },
8704 },
8705 }
8706 for _, tc := range testcases {
8707 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008708 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008709 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8710 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008711 })
8712 }
8713}
8714
Jiyong Park62304bb2020-04-13 16:19:48 +09008715func TestTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008716 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008717 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008718 apex {
8719 name: "myapex",
8720 key: "myapex.key",
8721 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008722 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008723 }
8724
8725 apex_key {
8726 name: "myapex.key",
8727 public_key: "testkey.avbpubkey",
8728 private_key: "testkey.pem",
8729 }
8730
8731 cc_library {
8732 name: "mylib",
8733 srcs: ["mylib.cpp"],
8734 system_shared_libs: [],
8735 stl: "none",
8736 stubs: {
8737 versions: ["1"],
8738 },
8739 apex_available: ["myapex"],
8740 }
8741
8742 cc_library {
8743 name: "myprivlib",
8744 srcs: ["mylib.cpp"],
8745 system_shared_libs: [],
8746 stl: "none",
8747 apex_available: ["myapex"],
8748 }
8749
8750
8751 cc_test {
8752 name: "mytest",
8753 gtest: false,
8754 srcs: ["mylib.cpp"],
8755 system_shared_libs: [],
8756 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008757 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008758 test_for: ["myapex"]
8759 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008760
8761 cc_library {
8762 name: "mytestlib",
8763 srcs: ["mylib.cpp"],
8764 system_shared_libs: [],
8765 shared_libs: ["mylib", "myprivlib"],
8766 stl: "none",
8767 test_for: ["myapex"],
8768 }
8769
8770 cc_benchmark {
8771 name: "mybench",
8772 srcs: ["mylib.cpp"],
8773 system_shared_libs: [],
8774 shared_libs: ["mylib", "myprivlib"],
8775 stl: "none",
8776 test_for: ["myapex"],
8777 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008778 `)
8779
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008780 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008781 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008782 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8783 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8784 }
8785
8786 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008787 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008788 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8789 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8790 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8791}
Jiyong Park46a512f2020-12-04 18:02:13 +09008792
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008793func TestIndirectTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008794 t.Parallel()
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008795 ctx := testApex(t, `
8796 apex {
8797 name: "myapex",
8798 key: "myapex.key",
8799 native_shared_libs: ["mylib", "myprivlib"],
8800 updatable: false,
8801 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008802
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008803 apex_key {
8804 name: "myapex.key",
8805 public_key: "testkey.avbpubkey",
8806 private_key: "testkey.pem",
8807 }
8808
8809 cc_library {
8810 name: "mylib",
8811 srcs: ["mylib.cpp"],
8812 system_shared_libs: [],
8813 stl: "none",
8814 stubs: {
8815 versions: ["1"],
8816 },
8817 apex_available: ["myapex"],
8818 }
8819
8820 cc_library {
8821 name: "myprivlib",
8822 srcs: ["mylib.cpp"],
8823 system_shared_libs: [],
8824 stl: "none",
8825 shared_libs: ["mylib"],
8826 apex_available: ["myapex"],
8827 }
8828
8829 cc_library {
8830 name: "mytestlib",
8831 srcs: ["mylib.cpp"],
8832 system_shared_libs: [],
8833 shared_libs: ["myprivlib"],
8834 stl: "none",
8835 test_for: ["myapex"],
8836 }
8837 `)
8838
8839 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008840 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008841 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8842 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8843 }
8844
8845 // The platform variant of mytestlib links to the platform variant of the
8846 // internal myprivlib.
8847 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8848
8849 // The platform variant of myprivlib links to the platform variant of mylib
8850 // and bypasses its stubs.
8851 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 +09008852}
8853
Martin Stjernholmec009002021-03-27 15:18:31 +00008854func TestTestForForLibInOtherApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008855 t.Parallel()
Martin Stjernholmec009002021-03-27 15:18:31 +00008856 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8857 _ = testApex(t, `
8858 apex {
8859 name: "com.android.art",
8860 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008861 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008862 updatable: false,
8863 }
8864
8865 apex {
8866 name: "com.android.art.debug",
8867 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008868 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008869 updatable: false,
8870 }
8871
8872 apex_key {
8873 name: "myapex.key",
8874 public_key: "testkey.avbpubkey",
8875 private_key: "testkey.pem",
8876 }
8877
8878 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008879 name: "libnativebridge",
8880 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008881 system_shared_libs: [],
8882 stl: "none",
8883 stubs: {
8884 versions: ["1"],
8885 },
8886 apex_available: ["com.android.art", "com.android.art.debug"],
8887 }
8888
8889 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008890 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008891 srcs: ["mylib.cpp"],
8892 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008893 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008894 stl: "none",
8895 apex_available: ["com.android.art.debug"],
8896 test_for: ["com.android.art"],
8897 }
8898 `,
8899 android.MockFS{
8900 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8901 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8902 }.AddToFixture())
8903}
8904
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008905// TODO(jungjw): Move this to proptools
8906func intPtr(i int) *int {
8907 return &i
8908}
8909
8910func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008911 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008912 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008913 apex_set {
8914 name: "myapex",
8915 set: "myapex.apks",
8916 filename: "foo_v2.apex",
8917 overrides: ["foo"],
8918 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008919 `,
8920 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8921 variables.Platform_sdk_version = intPtr(30)
8922 }),
8923 android.FixtureModifyConfig(func(config android.Config) {
8924 config.Targets[android.Android] = []android.Target{
8925 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8926 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8927 }
8928 }),
8929 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008930
Spandan Das9d6e2092024-09-21 02:50:00 +00008931 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008932
8933 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008934 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008935 actual := extractedApex.Args["abis"]
8936 expected := "ARMEABI_V7A,ARM64_V8A"
8937 if actual != expected {
8938 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8939 }
8940 actual = extractedApex.Args["sdk-version"]
8941 expected = "30"
8942 if actual != expected {
8943 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8944 }
8945
Paul Duffin6717d882021-06-15 19:09:41 +01008946 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008947 a := m.Module().(*ApexSet)
8948 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008949 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008950 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8951 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8952 }
8953}
8954
Anton Hansson805e0a52022-11-25 14:06:46 +00008955func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008956 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008957 ctx := testApex(t, `
8958 apex_set {
8959 name: "myapex",
8960 set: "myapex.apks",
8961 filename: "foo_v2.apex",
8962 overrides: ["foo"],
8963 }
8964 `,
8965 android.FixtureModifyConfig(func(config android.Config) {
8966 config.Targets[android.Android] = []android.Target{
8967 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8968 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8969 }
8970 }),
8971 )
8972
Spandan Das9d6e2092024-09-21 02:50:00 +00008973 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008974
8975 // Check extract_apks tool parameters. No native bridge arch expected
8976 extractedApex := m.Output("extracted/myapex.apks")
8977 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8978}
8979
Jiyong Park7d95a512020-05-10 15:16:24 +09008980func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008981 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008982 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8983 apex {
8984 name: "myapex",
8985 key: "myapex.key",
8986 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008987 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008988 }
8989
8990 apex_key {
8991 name: "myapex.key",
8992 public_key: "testkey.avbpubkey",
8993 private_key: "testkey.pem",
8994 }
8995
8996 cc_library {
8997 name: "mylib",
8998 srcs: ["mylib.cpp"],
8999 static_libs: ["otherlib"],
9000 system_shared_libs: [],
9001 stl: "none",
9002 apex_available: [ "myapex" ],
9003 }
9004
9005 cc_library {
9006 name: "otherlib",
9007 srcs: ["mylib.cpp"],
9008 system_shared_libs: [],
9009 stl: "none",
9010 stubs: {
9011 versions: ["1", "2", "3"],
9012 },
9013 apex_available: [ "myapex" ],
9014 }
9015 `)
9016}
9017
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009018func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009019 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009020 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009021 apex {
9022 name: "myapex",
9023 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009024 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009025 custom_sign_tool: "sign_myapex",
9026 }
9027
9028 apex_key {
9029 name: "myapex.key",
9030 public_key: "testkey.avbpubkey",
9031 private_key: "testkey.pem",
9032 }
9033 `)
9034
Jooyung Han286957d2023-10-30 16:17:56 +09009035 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009036 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009037 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 +09009038}
9039
9040func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009041 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009042 ctx := testApex(t, `
9043 apex {
9044 name: "myapex",
9045 key: "myapex.key",
9046 updatable: false,
9047 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009048 }
9049
9050 apex_key {
9051 name: "myapex.key",
9052 public_key: "testkey.avbpubkey",
9053 private_key: "testkey.pem",
9054 }
9055
9056 prebuilt_apex {
9057 name: "myapex",
9058 prefer: true,
9059 arch: {
9060 arm64: {
9061 src: "myapex-arm64.apex",
9062 },
9063 arm: {
9064 src: "myapex-arm.apex",
9065 },
9066 },
9067 }
9068
9069 apex_set {
9070 name: "myapex_set",
9071 set: "myapex.apks",
9072 filename: "myapex_set.apex",
9073 overrides: ["myapex"],
9074 }
9075 `)
9076
Colin Crossf61d03d2023-11-02 16:56:39 -07009077 content := android.ContentFromFileRuleForTests(t, ctx,
9078 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009079 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 -07009080 content = android.ContentFromFileRuleForTests(t, ctx,
9081 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009082 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 +09009083}
9084
Jooyung Han938b5932020-06-20 12:47:47 +09009085func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009087 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009088 apex {
9089 name: "myapex",
9090 key: "myapex.key",
9091 apps: ["app"],
9092 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009093 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009094 }
9095
9096 apex_key {
9097 name: "myapex.key",
9098 public_key: "testkey.avbpubkey",
9099 private_key: "testkey.pem",
9100 }
9101
9102 android_app {
9103 name: "app",
9104 srcs: ["foo/bar/MyClass.java"],
9105 package_name: "foo",
9106 sdk_version: "none",
9107 system_modules: "none",
9108 apex_available: [ "myapex" ],
9109 }
9110 `, withFiles(map[string][]byte{
9111 "sub/Android.bp": []byte(`
9112 override_apex {
9113 name: "override_myapex",
9114 base: "myapex",
9115 apps: ["override_app"],
9116 allowed_files: ":allowed",
9117 }
9118 // Overridable "path" property should be referenced indirectly
9119 filegroup {
9120 name: "allowed",
9121 srcs: ["allowed.txt"],
9122 }
9123 override_android_app {
9124 name: "override_app",
9125 base: "app",
9126 package_name: "bar",
9127 }
9128 `),
9129 }))
9130
Jooyung Hana0503a52023-08-23 13:12:50 +09009131 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009132 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9133 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9134 }
9135
Spandan Das50801e22024-05-13 18:29:45 +00009136 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009137 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9138 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9139 }
9140}
9141
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009142func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009143 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009144 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009145 apex {
9146 name: "myapex",
9147 key: "myapex.key",
9148 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009149 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009150 }
9151
9152 apex_key {
9153 name: "myapex.key",
9154 public_key: "testkey.avbpubkey",
9155 private_key: "testkey.pem",
9156 }
9157
9158 cc_library {
9159 name: "mylib",
9160 srcs: ["mylib.cpp"],
9161 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009162 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009163 },
9164 apex_available: ["myapex"],
9165 }
9166
9167 cc_prebuilt_library_shared {
9168 name: "mylib",
9169 prefer: false,
9170 srcs: ["prebuilt.so"],
9171 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009172 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009173 },
9174 apex_available: ["myapex"],
9175 }
9176 `)
9177}
9178
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009179func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009181 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
9185 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009186 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009187 }
9188 apex_key {
9189 name: "myapex.key",
9190 public_key: "testkey.avbpubkey",
9191 private_key: "testkey.pem",
9192 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009193 `,
9194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9195 variables.CompressedApex = proptools.BoolPtr(true)
9196 }),
9197 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009198
Jooyung Hana0503a52023-08-23 13:12:50 +09009199 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009200 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9201
Jooyung Hana0503a52023-08-23 13:12:50 +09009202 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009203 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9204
9205 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009206 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009207 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9208
9209 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009210 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009211 var builder strings.Builder
9212 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9213 androidMk := builder.String()
9214 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9215}
9216
Jooyung Han26ec8482024-07-31 15:04:05 +09009217func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009218 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009219 for _, compressionEnabled := range []bool{true, false} {
9220 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009221 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009222 ctx := testApex(t, `
9223 apex_set {
9224 name: "com.company.android.myapex",
9225 apex_name: "com.android.myapex",
9226 set: "company-myapex.apks",
9227 }
9228 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9229 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9230 }),
9231 )
9232
9233 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9234 if compressionEnabled {
9235 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9236 } else {
9237 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9238 }
9239 })
9240 }
9241}
9242
Martin Stjernholm2856c662020-12-02 15:03:42 +00009243func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009244 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009245 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009246 apex {
9247 name: "myapex",
9248 key: "myapex.key",
9249 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009250 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009251 }
9252
9253 apex_key {
9254 name: "myapex.key",
9255 public_key: "testkey.avbpubkey",
9256 private_key: "testkey.pem",
9257 }
9258
9259 cc_library {
9260 name: "mylib",
9261 srcs: ["mylib.cpp"],
9262 apex_available: ["myapex"],
9263 shared_libs: ["otherlib"],
9264 system_shared_libs: [],
9265 }
9266
9267 cc_library {
9268 name: "otherlib",
9269 srcs: ["mylib.cpp"],
9270 stubs: {
9271 versions: ["current"],
9272 },
9273 }
9274
9275 cc_prebuilt_library_shared {
9276 name: "otherlib",
9277 prefer: true,
9278 srcs: ["prebuilt.so"],
9279 stubs: {
9280 versions: ["current"],
9281 },
9282 }
9283 `)
9284
Jooyung Hana0503a52023-08-23 13:12:50 +09009285 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009286 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009287 var builder strings.Builder
9288 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9289 androidMk := builder.String()
9290
9291 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9292 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009293 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009294}
9295
Jiyong Parke3867542020-12-03 17:28:25 +09009296func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009298 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009299 apex {
9300 name: "myapex",
9301 key: "myapex.key",
9302 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009303 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009304 }
9305
9306 apex_key {
9307 name: "myapex.key",
9308 public_key: "testkey.avbpubkey",
9309 private_key: "testkey.pem",
9310 }
9311
9312 cc_library {
9313 name: "mylib",
9314 srcs: ["mylib.cpp"],
9315 system_shared_libs: [],
9316 stl: "none",
9317 apex_available: ["myapex"],
9318 shared_libs: ["mylib2"],
9319 target: {
9320 apex: {
9321 exclude_shared_libs: ["mylib2"],
9322 },
9323 },
9324 }
9325
9326 cc_library {
9327 name: "mylib2",
9328 srcs: ["mylib.cpp"],
9329 system_shared_libs: [],
9330 stl: "none",
9331 }
9332 `)
9333
9334 // Check if mylib is linked to mylib2 for the non-apex target
9335 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9336 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9337
9338 // Make sure that the link doesn't occur for the apex target
9339 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9340 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9341
9342 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009343 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009344 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9345}
9346
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009347func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009348 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009349 bpBase := `
9350 apex {
9351 name: "myapex",
9352 key: "myapex.key",
9353 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009354 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009355 }
9356 apex_key {
9357 name: "myapex.key",
9358 public_key: "testkey.avbpubkey",
9359 private_key: "testkey.pem",
9360 }
9361 cc_library {
9362 name: "mylib",
9363 srcs: ["mylib.cpp"],
9364 apex_available: ["myapex"],
9365 shared_libs: ["stublib"],
9366 system_shared_libs: [],
9367 }
9368 apex {
9369 name: "otherapex",
9370 enabled: %s,
9371 key: "myapex.key",
9372 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009373 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009374 }
9375 `
9376
9377 stublibSourceBp := `
9378 cc_library {
9379 name: "stublib",
9380 srcs: ["mylib.cpp"],
9381 apex_available: ["otherapex"],
9382 system_shared_libs: [],
9383 stl: "none",
9384 stubs: {
9385 versions: ["1"],
9386 },
9387 }
9388 `
9389
9390 stublibPrebuiltBp := `
9391 cc_prebuilt_library_shared {
9392 name: "stublib",
9393 srcs: ["prebuilt.so"],
9394 apex_available: ["otherapex"],
9395 stubs: {
9396 versions: ["1"],
9397 },
9398 %s
9399 }
9400 `
9401
9402 tests := []struct {
9403 name string
9404 stublibBp string
9405 usePrebuilt bool
9406 modNames []string // Modules to collect AndroidMkEntries for
9407 otherApexEnabled []string
9408 }{
9409 {
9410 name: "only_source",
9411 stublibBp: stublibSourceBp,
9412 usePrebuilt: false,
9413 modNames: []string{"stublib"},
9414 otherApexEnabled: []string{"true", "false"},
9415 },
9416 {
9417 name: "source_preferred",
9418 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9419 usePrebuilt: false,
9420 modNames: []string{"stublib", "prebuilt_stublib"},
9421 otherApexEnabled: []string{"true", "false"},
9422 },
9423 {
9424 name: "prebuilt_preferred",
9425 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9426 usePrebuilt: true,
9427 modNames: []string{"stublib", "prebuilt_stublib"},
9428 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9429 },
9430 {
9431 name: "only_prebuilt",
9432 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9433 usePrebuilt: true,
9434 modNames: []string{"stublib"},
9435 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9436 },
9437 }
9438
9439 for _, test := range tests {
9440 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009441 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009442 for _, otherApexEnabled := range test.otherApexEnabled {
9443 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009444 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009445 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009446
9447 type modAndMkEntries struct {
9448 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009449 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009450 }
9451 entries := []*modAndMkEntries{}
9452
9453 // Gather shared lib modules that are installable
9454 for _, modName := range test.modNames {
9455 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9456 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9457 continue
9458 }
9459 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009460 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009461 continue
9462 }
Yu Liue70976d2024-10-15 20:45:35 +00009463 info := android.AndroidMkInfoForTest(t, ctx, mod)
9464 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9465 ents = append(ents, info.ExtraInfo...)
9466 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009467 if ent.Disabled {
9468 continue
9469 }
9470 entries = append(entries, &modAndMkEntries{
9471 mod: mod,
9472 mkEntries: ent,
9473 })
9474 }
9475 }
9476 }
9477
9478 var entry *modAndMkEntries = nil
9479 for _, ent := range entries {
9480 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9481 if entry != nil {
9482 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9483 } else {
9484 entry = ent
9485 }
9486 }
9487 }
9488
9489 if entry == nil {
9490 t.Errorf("AndroidMk entry for \"stublib\" missing")
9491 } else {
9492 isPrebuilt := entry.mod.Prebuilt() != nil
9493 if isPrebuilt != test.usePrebuilt {
9494 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9495 }
9496 if !entry.mod.IsStubs() {
9497 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9498 }
9499 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9500 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9501 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009502 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009503 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009504 if !android.InList(expected, cflags) {
9505 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9506 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009507 }
9508 })
9509 }
9510 })
9511 }
9512}
9513
Colin Crossc33e5212021-05-25 18:16:02 -07009514func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009515 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009516 bp := `
9517 apex {
9518 name: "myapex",
9519 key: "myapex.key",
9520 java_libs: ["mylib"],
9521 bootclasspath_fragments: ["mybootclasspathfragment"],
9522 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9523 updatable: false,
9524 }
9525
9526 apex_key {
9527 name: "myapex.key",
9528 public_key: "testkey.avbpubkey",
9529 private_key: "testkey.pem",
9530 }
9531
9532 java_library {
9533 name: "mylib",
9534 srcs: ["mylib.java"],
9535 apex_available: ["myapex"],
9536 compile_dex: true,
9537 }
9538
9539 bootclasspath_fragment {
9540 name: "mybootclasspathfragment",
9541 contents: ["mybootclasspathlib"],
9542 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009543 hidden_api: {
9544 split_packages: ["*"],
9545 },
Colin Crossc33e5212021-05-25 18:16:02 -07009546 }
9547
9548 java_library {
9549 name: "mybootclasspathlib",
9550 srcs: ["mybootclasspathlib.java"],
9551 apex_available: ["myapex"],
9552 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009553 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009554 }
9555
9556 systemserverclasspath_fragment {
9557 name: "mysystemserverclasspathfragment",
9558 contents: ["mysystemserverclasspathlib"],
9559 apex_available: ["myapex"],
9560 }
9561
9562 java_library {
9563 name: "mysystemserverclasspathlib",
9564 srcs: ["mysystemserverclasspathlib.java"],
9565 apex_available: ["myapex"],
9566 compile_dex: true,
9567 }
9568 `
9569
9570 result := android.GroupFixturePreparers(
9571 PrepareForTestWithApexBuildComponents,
9572 prepareForTestWithMyapex,
9573 java.PrepareForTestWithJavaDefaultModules,
9574 android.PrepareForTestWithAndroidBuildComponents,
9575 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009576 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9577 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009578 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009579 ).RunTest(t)
9580
9581 // Make sure jacoco ran on both mylib and mybootclasspathlib
9582 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9583 t.Errorf("Failed to find jacoco rule for mylib")
9584 }
9585 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9586 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9587 }
9588 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9589 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9590 }
9591}
9592
Jiyong Park192600a2021-08-03 07:52:17 +00009593func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009594 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009595 testApexError(t, `executable mybin is static`, `
9596 apex {
9597 name: "myapex",
9598 key: "myapex.key",
9599 binaries: ["mybin"],
9600 min_sdk_version: "29",
9601 }
9602
9603 apex_key {
9604 name: "myapex.key",
9605 public_key: "testkey.avbpubkey",
9606 private_key: "testkey.pem",
9607 }
9608
9609 cc_binary {
9610 name: "mybin",
9611 srcs: ["mylib.cpp"],
9612 relative_install_path: "foo/bar",
9613 static_executable: true,
9614 system_shared_libs: [],
9615 stl: "none",
9616 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009617 min_sdk_version: "29",
9618 }
9619 `)
9620
9621 testApexError(t, `executable mybin.rust is static`, `
9622 apex {
9623 name: "myapex",
9624 key: "myapex.key",
9625 binaries: ["mybin.rust"],
9626 min_sdk_version: "29",
9627 }
9628
9629 apex_key {
9630 name: "myapex.key",
9631 public_key: "testkey.avbpubkey",
9632 private_key: "testkey.pem",
9633 }
9634
9635 rust_binary {
9636 name: "mybin.rust",
9637 srcs: ["foo.rs"],
9638 static_executable: true,
9639 apex_available: ["myapex"],
9640 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009641 }
9642 `)
9643}
9644
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009645func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009646 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009647 ctx := testApex(t, `
9648 apex {
9649 name: "myapex",
9650 key: "myapex.key",
9651 updatable: false,
9652 java_libs: ["foo"],
9653 }
9654
9655 apex_key {
9656 name: "myapex.key",
9657 public_key: "testkey.avbpubkey",
9658 private_key: "testkey.pem",
9659 }
9660
9661 java_library {
9662 name: "foo",
9663 srcs: ["foo.java"],
9664 apex_available: ["myapex"],
9665 installable: true,
9666 }
9667 `,
9668 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9669 )
9670
Jooyung Hana0503a52023-08-23 13:12:50 +09009671 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009672 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9673 var builder strings.Builder
9674 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9675 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009676 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 +00009677}
9678
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009679func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009680 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009681 ctx := testApex(t, `
9682 apex {
9683 name: "myapex",
9684 key: "myapex.key",
9685 updatable: false,
9686 java_libs: ["foo"],
9687 required: ["otherapex"],
9688 }
9689
9690 apex {
9691 name: "otherapex",
9692 key: "myapex.key",
9693 updatable: false,
9694 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009695 }
9696
9697 apex_key {
9698 name: "myapex.key",
9699 public_key: "testkey.avbpubkey",
9700 private_key: "testkey.pem",
9701 }
9702
9703 java_library {
9704 name: "foo",
9705 srcs: ["foo.java"],
9706 apex_available: ["myapex", "otherapex"],
9707 installable: true,
9708 }
9709 `)
9710
Jooyung Hana0503a52023-08-23 13:12:50 +09009711 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009712 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9713 var builder strings.Builder
9714 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9715 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009716 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009717}
9718
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009719func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009720 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009721 ctx := testApex(t, `
9722 apex {
9723 name: "myapex",
9724 key: "myapex.key",
9725 updatable: false,
9726 }
9727
9728 apex_key {
9729 name: "myapex.key",
9730 public_key: "testkey.avbpubkey",
9731 private_key: "testkey.pem",
9732 }
9733 `)
9734
Jooyung Hana0503a52023-08-23 13:12:50 +09009735 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009736 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009737 data := android.AndroidMkDataForTest(t, ctx, bundle)
9738 var builder strings.Builder
9739 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9740 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009741 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009742}
9743
Jooyung Hana6d36672022-02-24 13:58:07 +09009744func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009745 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009746 for _, tc := range []struct {
9747 name string
9748 ref string
9749 expected_data []string
9750 }{
9751 {
9752 name: "test_using_output",
9753 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009754 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009755 },
9756 {
9757 name: "test_using_apex",
9758 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009759 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009760 },
9761 } {
9762 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009763 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009764 ctx := testApex(t, `
9765 apex {
9766 name: "myapex",
9767 key: "myapex.key",
9768 compressible: true,
9769 updatable: false,
9770 }
9771
9772 apex_key {
9773 name: "myapex.key",
9774 public_key: "testkey.avbpubkey",
9775 private_key: "testkey.pem",
9776 }
9777
9778 java_test {
9779 name: "`+tc.name+`",
9780 srcs: ["a.java"],
9781 data: ["`+tc.ref+`"],
9782 }
9783 `,
9784 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9785 variables.CompressedApex = proptools.BoolPtr(true)
9786 }))
9787 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9788 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9789 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9790 })
9791 }
9792}
9793
satayev758968a2021-12-06 11:42:40 +00009794func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009795 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009796 preparer := android.GroupFixturePreparers(
9797 PrepareForTestWithApexBuildComponents,
9798 prepareForTestWithMyapex,
9799 java.PrepareForTestWithJavaSdkLibraryFiles,
9800 java.PrepareForTestWithJavaDefaultModules,
9801 android.PrepareForTestWithAndroidBuildComponents,
9802 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9803 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9804 )
9805
9806 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9807 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009808 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009809 preparer.RunTestWithBp(t, `
9810 apex {
9811 name: "myapex",
9812 key: "myapex.key",
9813 bootclasspath_fragments: ["mybootclasspathfragment"],
9814 min_sdk_version: "30",
9815 updatable: false,
9816 }
9817
9818 apex_key {
9819 name: "myapex.key",
9820 public_key: "testkey.avbpubkey",
9821 private_key: "testkey.pem",
9822 }
9823
9824 bootclasspath_fragment {
9825 name: "mybootclasspathfragment",
9826 contents: ["mybootclasspathlib"],
9827 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009828 hidden_api: {
9829 split_packages: ["*"],
9830 },
satayev758968a2021-12-06 11:42:40 +00009831 }
9832
9833 java_sdk_library {
9834 name: "mybootclasspathlib",
9835 srcs: ["mybootclasspathlib.java"],
9836 apex_available: ["myapex"],
9837 compile_dex: true,
9838 unsafe_ignore_missing_latest_api: true,
9839 min_sdk_version: "31",
9840 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009841 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009842 }
9843
9844 java_library {
9845 name: "util",
9846 srcs: ["a.java"],
9847 apex_available: ["myapex"],
9848 min_sdk_version: "31",
9849 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009850 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009851 }
9852
9853 java_library {
9854 name: "another_util",
9855 srcs: ["a.java"],
9856 min_sdk_version: "31",
9857 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009858 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009859 }
9860 `)
9861 })
9862
9863 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9864 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009865 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009866 preparer.RunTestWithBp(t, `
9867 apex {
9868 name: "myapex",
9869 key: "myapex.key",
9870 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9871 min_sdk_version: "30",
9872 updatable: false,
9873 }
9874
9875 apex_key {
9876 name: "myapex.key",
9877 public_key: "testkey.avbpubkey",
9878 private_key: "testkey.pem",
9879 }
9880
9881 systemserverclasspath_fragment {
9882 name: "mysystemserverclasspathfragment",
9883 contents: ["mysystemserverclasspathlib"],
9884 apex_available: ["myapex"],
9885 }
9886
9887 java_sdk_library {
9888 name: "mysystemserverclasspathlib",
9889 srcs: ["mysystemserverclasspathlib.java"],
9890 apex_available: ["myapex"],
9891 compile_dex: true,
9892 min_sdk_version: "32",
9893 unsafe_ignore_missing_latest_api: true,
9894 static_libs: ["util"],
9895 }
9896
9897 java_library {
9898 name: "util",
9899 srcs: ["a.java"],
9900 apex_available: ["myapex"],
9901 min_sdk_version: "31",
9902 static_libs: ["another_util"],
9903 }
9904
9905 java_library {
9906 name: "another_util",
9907 srcs: ["a.java"],
9908 min_sdk_version: "31",
9909 apex_available: ["myapex"],
9910 }
9911 `)
9912 })
9913
9914 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009915 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009916 preparer.
satayev758968a2021-12-06 11:42:40 +00009917 RunTestWithBp(t, `
9918 apex {
9919 name: "myapex",
9920 key: "myapex.key",
9921 bootclasspath_fragments: ["mybootclasspathfragment"],
9922 min_sdk_version: "30",
9923 updatable: false,
9924 }
9925
9926 apex_key {
9927 name: "myapex.key",
9928 public_key: "testkey.avbpubkey",
9929 private_key: "testkey.pem",
9930 }
9931
9932 bootclasspath_fragment {
9933 name: "mybootclasspathfragment",
9934 contents: ["mybootclasspathlib"],
9935 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009936 hidden_api: {
9937 split_packages: ["*"],
9938 },
satayev758968a2021-12-06 11:42:40 +00009939 }
9940
9941 java_sdk_library {
9942 name: "mybootclasspathlib",
9943 srcs: ["mybootclasspathlib.java"],
9944 apex_available: ["myapex"],
9945 compile_dex: true,
9946 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009947 sdk_version: "current",
9948 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009949 }
9950 `)
9951 })
9952
9953 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009954 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009955 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9956 RunTestWithBp(t, `
9957 apex {
9958 name: "myapex",
9959 key: "myapex.key",
9960 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9961 min_sdk_version: "30",
9962 updatable: false,
9963 }
9964
9965 apex_key {
9966 name: "myapex.key",
9967 public_key: "testkey.avbpubkey",
9968 private_key: "testkey.pem",
9969 }
9970
9971 systemserverclasspath_fragment {
9972 name: "mysystemserverclasspathfragment",
9973 contents: ["mysystemserverclasspathlib"],
9974 apex_available: ["myapex"],
9975 }
9976
9977 java_sdk_library {
9978 name: "mysystemserverclasspathlib",
9979 srcs: ["mysystemserverclasspathlib.java"],
9980 apex_available: ["myapex"],
9981 compile_dex: true,
9982 unsafe_ignore_missing_latest_api: true,
9983 }
9984 `)
9985 })
9986}
9987
Jiakai Zhang6decef92022-01-12 17:56:19 +00009988// Verifies that the APEX depends on all the Make modules in the list.
9989func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9990 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9991 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009992 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009993 }
9994}
9995
9996// Verifies that the APEX does not depend on any of the Make modules in the list.
9997func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9998 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9999 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010000 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010001 }
10002}
10003
Cole Faust24e25c02024-01-19 14:12:17 -080010004func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010005 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010006 bpTemplate := `
10007 apex {
10008 name: "myapex",
10009 key: "myapex.key",
10010 java_libs: ["myjavalib"],
10011 updatable: %v,
10012 min_sdk_version: "29",
10013 }
10014 apex_key {
10015 name: "myapex.key",
10016 }
10017 java_library {
10018 name: "myjavalib",
10019 srcs: ["MyClass.java"],
10020 apex_available: [ "myapex" ],
10021 lint: {
10022 strict_updatability_linting: %v,
10023 %s
10024 },
10025 sdk_version: "current",
10026 min_sdk_version: "29",
10027 }
10028 `
10029 fs := android.MockFS{
10030 "lint-baseline.xml": nil,
10031 }
10032
10033 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010034 testCaseName string
10035 apexUpdatable bool
10036 javaStrictUpdtabilityLint bool
10037 lintFileExists bool
10038 disallowedFlagExpectedOnApex bool
10039 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010040 }{
10041 {
Colin Cross87427352024-09-25 15:41:19 -070010042 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10043 apexUpdatable: true,
10044 javaStrictUpdtabilityLint: true,
10045 lintFileExists: false,
10046 disallowedFlagExpectedOnApex: false,
10047 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010048 },
10049 {
Colin Cross87427352024-09-25 15:41:19 -070010050 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10051 apexUpdatable: false,
10052 javaStrictUpdtabilityLint: false,
10053 lintFileExists: true,
10054 disallowedFlagExpectedOnApex: false,
10055 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010056 },
10057 {
Colin Cross87427352024-09-25 15:41:19 -070010058 testCaseName: "non-updatable apex respects strict updatability of javalib",
10059 apexUpdatable: false,
10060 javaStrictUpdtabilityLint: true,
10061 lintFileExists: true,
10062 disallowedFlagExpectedOnApex: false,
10063 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010064 },
10065 {
Colin Cross87427352024-09-25 15:41:19 -070010066 testCaseName: "updatable apex checks strict updatability of javalib",
10067 apexUpdatable: true,
10068 javaStrictUpdtabilityLint: false,
10069 lintFileExists: true,
10070 disallowedFlagExpectedOnApex: true,
10071 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010072 },
10073 }
10074
10075 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010076 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010077 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010078 fixtures := []android.FixturePreparer{}
10079 baselineProperty := ""
10080 if testCase.lintFileExists {
10081 fixtures = append(fixtures, fs.AddToFixture())
10082 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10083 }
10084 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010085
Colin Cross87427352024-09-25 15:41:19 -070010086 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010087
Colin Cross87427352024-09-25 15:41:19 -070010088 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10089 if expectStrictUpdatability {
10090 if m.Rule == nil {
10091 t.Errorf("expected strict updatability check rule on %s", name)
10092 } else {
10093 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10094 m.RuleParams.Command, "--disallowed_issues NewApi")
10095 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10096 m.Inputs.Strings(), "lint-baseline.xml")
10097 }
10098 } else {
10099 if m.Rule != nil {
10100 t.Errorf("expected no strict updatability check rule on %s", name)
10101 }
10102 }
10103 }
10104
10105 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10106 apex := result.ModuleForTests("myapex", "android_common_myapex")
10107 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10108 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10109
10110 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10111 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10112 })
Cole Faust24e25c02024-01-19 14:12:17 -080010113 }
10114}
10115
Cole Faust24e25c02024-01-19 14:12:17 -080010116// checks transtive deps of an apex coming from bootclasspath_fragment
10117func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010118 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010119 bp := `
10120 apex {
10121 name: "myapex",
10122 key: "myapex.key",
10123 bootclasspath_fragments: ["mybootclasspathfragment"],
10124 updatable: true,
10125 min_sdk_version: "29",
10126 }
10127 apex_key {
10128 name: "myapex.key",
10129 }
10130 bootclasspath_fragment {
10131 name: "mybootclasspathfragment",
10132 contents: ["myjavalib"],
10133 apex_available: ["myapex"],
10134 hidden_api: {
10135 split_packages: ["*"],
10136 },
10137 }
10138 java_library {
10139 name: "myjavalib",
10140 srcs: ["MyClass.java"],
10141 apex_available: [ "myapex" ],
10142 sdk_version: "current",
10143 min_sdk_version: "29",
10144 compile_dex: true,
10145 lint: {
10146 baseline_filename: "lint-baseline.xml",
10147 }
10148 }
10149 `
10150 fs := android.MockFS{
10151 "lint-baseline.xml": nil,
10152 }
10153
10154 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010155 apex := result.ModuleForTests("myapex", "android_common_myapex")
10156 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10157 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10158 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10159 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10160 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010161}
Spandan Das66773252022-01-15 00:23:18 +000010162
Jihoon Kang784c0052024-06-25 22:15:39 +000010163func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010164 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010165 bp := `
10166 apex {
10167 name: "myapex",
10168 key: "myapex.key",
10169 bootclasspath_fragments: ["mybootclasspathfragment"],
10170 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010171 java_libs: [
10172 "jacocoagent",
10173 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010174 }
10175 apex_key {
10176 name: "myapex.key",
10177 }
10178 bootclasspath_fragment {
10179 name: "mybootclasspathfragment",
10180 contents: ["foo"],
10181 apex_available: ["myapex"],
10182 hidden_api: {
10183 split_packages: ["*"],
10184 },
10185 }
10186 java_sdk_library {
10187 name: "foo",
10188 srcs: ["MyClass.java"],
10189 apex_available: [ "myapex" ],
10190 sdk_version: "current",
10191 min_sdk_version: "29",
10192 compile_dex: true,
10193 }
10194 `
10195 fs := android.MockFS{
10196 "lint-baseline.xml": nil,
10197 }
10198
10199 result := android.GroupFixturePreparers(
10200 prepareForApexTest,
10201 java.PrepareForTestWithJavaSdkLibraryFiles,
10202 java.PrepareForTestWithJacocoInstrumentation,
10203 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010204 android.FixtureMergeMockFs(fs),
10205 ).RunTestWithBp(t, bp)
10206
10207 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10208 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10209 android.AssertStringDoesContain(t,
10210 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10211 lintReportInputs, "foo.impl")
10212}
10213
Spandan Das42e89502022-05-06 22:12:55 +000010214// updatable apexes should propagate updatable=true to its apps
10215func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010216 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010217 bp := `
10218 apex {
10219 name: "myapex",
10220 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010221 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010222 apps: [
10223 "myapp",
10224 ],
10225 min_sdk_version: "30",
10226 }
10227 apex_key {
10228 name: "myapex.key",
10229 }
10230 android_app {
10231 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010232 apex_available: [
10233 "myapex",
10234 ],
10235 sdk_version: "current",
10236 min_sdk_version: "30",
10237 }
10238 `
Colin Cross99939e92024-10-01 16:02:46 -070010239 _ = android.GroupFixturePreparers(
10240 prepareForApexTest,
10241 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10242 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010243}
10244
Dennis Shend4f5d932023-01-31 20:27:21 +000010245func TestTrimmedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010246 t.Parallel()
Dennis Shend4f5d932023-01-31 20:27:21 +000010247 bp := `
10248 apex {
10249 name: "myapex",
10250 key: "myapex.key",
10251 native_shared_libs: ["libfoo","libbaz"],
10252 min_sdk_version: "29",
10253 trim_against: "mydcla",
10254 }
10255 apex {
10256 name: "mydcla",
10257 key: "myapex.key",
10258 native_shared_libs: ["libfoo","libbar"],
10259 min_sdk_version: "29",
10260 file_contexts: ":myapex-file_contexts",
10261 dynamic_common_lib_apex: true,
10262 }
10263 apex_key {
10264 name: "myapex.key",
10265 }
10266 cc_library {
10267 name: "libfoo",
10268 shared_libs: ["libc"],
10269 apex_available: ["myapex","mydcla"],
10270 min_sdk_version: "29",
10271 }
10272 cc_library {
10273 name: "libbar",
10274 shared_libs: ["libc"],
10275 apex_available: ["myapex","mydcla"],
10276 min_sdk_version: "29",
10277 }
10278 cc_library {
10279 name: "libbaz",
10280 shared_libs: ["libc"],
10281 apex_available: ["myapex","mydcla"],
10282 min_sdk_version: "29",
10283 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010284 `
10285 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010286 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010287 apexRule := module.MaybeRule("apexRule")
10288 if apexRule.Rule == nil {
10289 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10290 }
10291
10292 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010293 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010294 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10295 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10296 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10297 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10298}
Jingwen Chendea7a642023-03-28 11:30:50 +000010299
10300func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010301 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010302 ctx := testApex(t, `
10303 apex {
10304 name: "myapex",
10305 key: "myapex.key",
10306 updatable: false,
10307 }
10308
10309 apex_key {
10310 name: "myapex.key",
10311 public_key: "testkey.avbpubkey",
10312 private_key: "testkey.pem",
10313 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010314 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010315 generateFsRule := mod.Rule("generateFsConfig")
10316 cmd := generateFsRule.RuleParams.Command
10317
10318 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10319}
10320
10321func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010322 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010323 ctx := testApex(t, `
10324 apex {
10325 name: "myapex",
10326 key: "myapex.key",
10327 canned_fs_config: "my_config",
10328 updatable: false,
10329 }
10330
10331 apex_key {
10332 name: "myapex.key",
10333 public_key: "testkey.avbpubkey",
10334 private_key: "testkey.pem",
10335 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010336 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010337 generateFsRule := mod.Rule("generateFsConfig")
10338 cmd := generateFsRule.RuleParams.Command
10339
10340 // Ensure that canned_fs_config has "cat my_config" at the end
10341 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10342}
Spandan Das20fce2d2023-04-12 17:21:39 +000010343
10344func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010345 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010346 testCases := []struct {
10347 desc string
10348 hasStubs bool
10349 apexAvailable string
10350 expectedError string
10351 }{
10352 {
10353 desc: "non-stub library can have multiple apex_available",
10354 hasStubs: false,
10355 apexAvailable: `["myapex", "otherapex"]`,
10356 },
10357 {
10358 desc: "stub library should not be available to anyapex",
10359 hasStubs: true,
10360 apexAvailable: `["//apex_available:anyapex"]`,
10361 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10362 },
10363 {
10364 desc: "stub library should not be available to multiple apexes",
10365 hasStubs: true,
10366 apexAvailable: `["myapex", "otherapex"]`,
10367 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10368 },
10369 {
10370 desc: "stub library can be available to a core apex and a test apex",
10371 hasStubs: true,
10372 apexAvailable: `["myapex", "test_myapex"]`,
10373 },
10374 }
10375 bpTemplate := `
10376 cc_library {
10377 name: "libfoo",
10378 %v
10379 apex_available: %v,
10380 }
10381 apex {
10382 name: "myapex",
10383 key: "apex.key",
10384 updatable: false,
10385 native_shared_libs: ["libfoo"],
10386 }
10387 apex {
10388 name: "otherapex",
10389 key: "apex.key",
10390 updatable: false,
10391 }
10392 apex_test {
10393 name: "test_myapex",
10394 key: "apex.key",
10395 updatable: false,
10396 native_shared_libs: ["libfoo"],
10397 }
10398 apex_key {
10399 name: "apex.key",
10400 }
10401 `
10402 for _, tc := range testCases {
10403 stubs := ""
10404 if tc.hasStubs {
10405 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10406 }
10407 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10408 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10409 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10410 })
10411 if tc.expectedError == "" {
10412 testApex(t, bp, mockFsFixturePreparer)
10413 } else {
10414 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10415 }
10416 }
10417}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010418
10419func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010420 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010421 context := android.GroupFixturePreparers(
10422 android.PrepareForIntegrationTestWithAndroid,
10423 cc.PrepareForIntegrationTestWithCc,
10424 PrepareForTestWithApexBuildComponents,
10425 prepareForTestWithMyapex,
10426 filesystem.PrepareForTestWithFilesystemBuildComponents,
10427 )
10428 result := context.RunTestWithBp(t, `
10429 android_system_image {
10430 name: "myfilesystem",
10431 deps: [
10432 "libfoo",
10433 ],
10434 linker_config_src: "linker.config.json",
10435 }
10436
10437 cc_library {
10438 name: "libfoo",
10439 shared_libs: [
10440 "libbar",
10441 ],
10442 stl: "none",
10443 }
10444
10445 cc_library {
10446 name: "libbar",
10447 stl: "none",
10448 apex_available: ["myapex"],
10449 }
10450
10451 apex {
10452 name: "myapex",
10453 native_shared_libs: ["libbar"],
10454 key: "myapex.key",
10455 updatable: false,
10456 }
10457
10458 apex_key {
10459 name: "myapex.key",
10460 public_key: "testkey.avbpubkey",
10461 private_key: "testkey.pem",
10462 }
10463 `)
10464
Cole Faust3b806d32024-03-11 15:15:03 -070010465 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010466 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10467 inputs.Strings(),
10468 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10469}
Yu Liueae7b362023-11-16 17:05:47 -080010470
10471var apex_default_bp = `
10472 apex_key {
10473 name: "myapex.key",
10474 public_key: "testkey.avbpubkey",
10475 private_key: "testkey.pem",
10476 }
10477
10478 filegroup {
10479 name: "myapex.manifest",
10480 srcs: ["apex_manifest.json"],
10481 }
10482
10483 filegroup {
10484 name: "myapex.androidmanifest",
10485 srcs: ["AndroidManifest.xml"],
10486 }
10487`
10488
10489func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010490 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010491 ctx := testApex(t, apex_default_bp+`
10492 apex {
10493 name: "myapex",
10494 manifest: ":myapex.manifest",
10495 androidManifest: ":myapex.androidmanifest",
10496 key: "myapex.key",
10497 java_libs: [
10498 "my_java_library_foo",
10499 "my_java_library_bar",
10500 ],
10501 updatable: false,
10502 }
10503
10504 java_library {
10505 name: "my_java_library_foo",
10506 srcs: ["foo/bar/MyClass.java"],
10507 sdk_version: "none",
10508 system_modules: "none",
10509 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010510 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010511 "myapex",
10512 ],
10513 }
10514
10515 java_library {
10516 name: "my_java_library_bar",
10517 srcs: ["foo/bar/MyClass.java"],
10518 sdk_version: "none",
10519 system_modules: "none",
10520 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010521 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010522 "myapex",
10523 ],
10524 }
10525
10526 aconfig_declarations {
10527 name: "my_aconfig_declarations_foo",
10528 package: "com.example.package",
10529 container: "myapex",
10530 srcs: ["foo.aconfig"],
10531 }
10532
10533 java_aconfig_library {
10534 name: "my_java_aconfig_library_foo",
10535 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010536 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010537 "myapex",
10538 ],
10539 }
10540
10541 aconfig_declarations {
10542 name: "my_aconfig_declarations_bar",
10543 package: "com.example.package",
10544 container: "myapex",
10545 srcs: ["bar.aconfig"],
10546 }
10547
10548 java_aconfig_library {
10549 name: "my_java_aconfig_library_bar",
10550 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010551 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010552 "myapex",
10553 ],
10554 }
10555 `)
10556
10557 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10558 s := mod.Rule("apexRule").Args["copy_commands"]
10559 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010560 if len(copyCmds) != 14 {
10561 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010562 }
10563
Jooyung Hana3fddf42024-09-03 13:22:21 +090010564 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10565 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10566 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10567 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010568 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010569
Yu Liubba555e2024-02-17 00:36:42 +000010570 inputs := []string{
10571 "my_aconfig_declarations_foo/intermediate.pb",
10572 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010573 }
Yu Liubba555e2024-02-17 00:36:42 +000010574 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10575 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10576 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10577 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010578 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010579}
10580
10581func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010582 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010583 ctx := testApex(t, apex_default_bp+`
10584 apex {
10585 name: "myapex",
10586 manifest: ":myapex.manifest",
10587 androidManifest: ":myapex.androidmanifest",
10588 key: "myapex.key",
10589 java_libs: [
10590 "my_java_library_foo",
10591 ],
10592 native_shared_libs: [
10593 "my_cc_library_bar",
10594 ],
10595 binaries: [
10596 "my_cc_binary_baz",
10597 ],
10598 updatable: false,
10599 }
10600
10601 java_library {
10602 name: "my_java_library_foo",
10603 srcs: ["foo/bar/MyClass.java"],
10604 sdk_version: "none",
10605 system_modules: "none",
10606 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010607 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010608 "myapex",
10609 ],
10610 }
10611
10612 cc_library {
10613 name: "my_cc_library_bar",
10614 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010615 static_libs: [
10616 "my_cc_aconfig_library_bar",
10617 "my_cc_aconfig_library_baz",
10618 ],
Yu Liueae7b362023-11-16 17:05:47 -080010619 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010620 "myapex",
10621 ],
10622 }
10623
10624 cc_binary {
10625 name: "my_cc_binary_baz",
10626 srcs: ["foo/bar/MyClass.cc"],
10627 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010628 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010629 "myapex",
10630 ],
10631 }
10632
10633 aconfig_declarations {
10634 name: "my_aconfig_declarations_foo",
10635 package: "com.example.package",
10636 container: "myapex",
10637 srcs: ["foo.aconfig"],
10638 }
10639
10640 java_aconfig_library {
10641 name: "my_java_aconfig_library_foo",
10642 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010643 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010644 "myapex",
10645 ],
10646 }
10647
10648 aconfig_declarations {
10649 name: "my_aconfig_declarations_bar",
10650 package: "com.example.package",
10651 container: "myapex",
10652 srcs: ["bar.aconfig"],
10653 }
10654
10655 cc_aconfig_library {
10656 name: "my_cc_aconfig_library_bar",
10657 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010658 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010659 "myapex",
10660 ],
10661 }
10662
10663 aconfig_declarations {
10664 name: "my_aconfig_declarations_baz",
10665 package: "com.example.package",
10666 container: "myapex",
10667 srcs: ["baz.aconfig"],
10668 }
10669
10670 cc_aconfig_library {
10671 name: "my_cc_aconfig_library_baz",
10672 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010673 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010674 "myapex",
10675 ],
10676 }
10677
10678 cc_library {
10679 name: "server_configurable_flags",
10680 srcs: ["server_configurable_flags.cc"],
10681 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010682 cc_library {
10683 name: "libbase",
10684 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010685 apex_available: [
10686 "myapex",
10687 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010688 }
10689 cc_library {
10690 name: "libaconfig_storage_read_api_cc",
10691 srcs: ["libaconfig_storage_read_api_cc.cc"],
10692 }
Yu Liueae7b362023-11-16 17:05:47 -080010693 `)
10694
10695 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10696 s := mod.Rule("apexRule").Args["copy_commands"]
10697 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010698 if len(copyCmds) != 18 {
10699 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010700 }
10701
Jooyung Hana3fddf42024-09-03 13:22:21 +090010702 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10703 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10704 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10705 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010706 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010707
Yu Liubba555e2024-02-17 00:36:42 +000010708 inputs := []string{
10709 "my_aconfig_declarations_foo/intermediate.pb",
10710 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10711 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010712 }
Yu Liubba555e2024-02-17 00:36:42 +000010713 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10714 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10715 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10716 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010717 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010718}
10719
Yu Liucec0e412023-11-30 16:45:50 -080010720func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010721 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010722 ctx := testApex(t, apex_default_bp+`
10723 apex {
10724 name: "myapex",
10725 manifest: ":myapex.manifest",
10726 androidManifest: ":myapex.androidmanifest",
10727 key: "myapex.key",
10728 native_shared_libs: [
10729 "libmy_rust_library",
10730 ],
10731 binaries: [
10732 "my_rust_binary",
10733 ],
10734 rust_dyn_libs: [
10735 "libmy_rust_dylib",
10736 ],
10737 updatable: false,
10738 }
10739
10740 rust_library {
10741 name: "libflags_rust", // test mock
10742 crate_name: "flags_rust",
10743 srcs: ["lib.rs"],
10744 apex_available: [
10745 "myapex",
10746 ],
10747 }
10748
10749 rust_library {
10750 name: "liblazy_static", // test mock
10751 crate_name: "lazy_static",
10752 srcs: ["src/lib.rs"],
10753 apex_available: [
10754 "myapex",
10755 ],
10756 }
10757
Ted Bauer02d475c2024-03-27 20:56:26 +000010758 rust_library {
10759 name: "libaconfig_storage_read_api", // test mock
10760 crate_name: "aconfig_storage_read_api",
10761 srcs: ["src/lib.rs"],
10762 apex_available: [
10763 "myapex",
10764 ],
10765 }
10766
Ted Bauer6ef40db2024-03-29 14:04:10 +000010767 rust_library {
10768 name: "liblogger", // test mock
10769 crate_name: "logger",
10770 srcs: ["src/lib.rs"],
10771 apex_available: [
10772 "myapex",
10773 ],
10774 }
10775
10776 rust_library {
10777 name: "liblog_rust", // test mock
10778 crate_name: "log_rust",
10779 srcs: ["src/lib.rs"],
10780 apex_available: [
10781 "myapex",
10782 ],
10783 }
10784
Yu Liucec0e412023-11-30 16:45:50 -080010785 rust_ffi_shared {
10786 name: "libmy_rust_library",
10787 srcs: ["src/lib.rs"],
10788 rustlibs: ["libmy_rust_aconfig_library_foo"],
10789 crate_name: "my_rust_library",
10790 apex_available: [
10791 "myapex",
10792 ],
10793 }
10794
10795 rust_library_dylib {
10796 name: "libmy_rust_dylib",
10797 srcs: ["foo/bar/MyClass.rs"],
10798 rustlibs: ["libmy_rust_aconfig_library_bar"],
10799 crate_name: "my_rust_dylib",
10800 apex_available: [
10801 "myapex",
10802 ],
10803 }
10804
10805 rust_binary {
10806 name: "my_rust_binary",
10807 srcs: ["foo/bar/MyClass.rs"],
10808 rustlibs: [
10809 "libmy_rust_aconfig_library_baz",
10810 "libmy_rust_dylib",
10811 ],
10812 apex_available: [
10813 "myapex",
10814 ],
10815 }
10816
10817 aconfig_declarations {
10818 name: "my_aconfig_declarations_foo",
10819 package: "com.example.package",
10820 container: "myapex",
10821 srcs: ["foo.aconfig"],
10822 }
10823
10824 aconfig_declarations {
10825 name: "my_aconfig_declarations_bar",
10826 package: "com.example.package",
10827 container: "myapex",
10828 srcs: ["bar.aconfig"],
10829 }
10830
10831 aconfig_declarations {
10832 name: "my_aconfig_declarations_baz",
10833 package: "com.example.package",
10834 container: "myapex",
10835 srcs: ["baz.aconfig"],
10836 }
10837
10838 rust_aconfig_library {
10839 name: "libmy_rust_aconfig_library_foo",
10840 aconfig_declarations: "my_aconfig_declarations_foo",
10841 crate_name: "my_rust_aconfig_library_foo",
10842 apex_available: [
10843 "myapex",
10844 ],
10845 }
10846
10847 rust_aconfig_library {
10848 name: "libmy_rust_aconfig_library_bar",
10849 aconfig_declarations: "my_aconfig_declarations_bar",
10850 crate_name: "my_rust_aconfig_library_bar",
10851 apex_available: [
10852 "myapex",
10853 ],
10854 }
10855
10856 rust_aconfig_library {
10857 name: "libmy_rust_aconfig_library_baz",
10858 aconfig_declarations: "my_aconfig_declarations_baz",
10859 crate_name: "my_rust_aconfig_library_baz",
10860 apex_available: [
10861 "myapex",
10862 ],
10863 }
10864 `)
10865
10866 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10867 s := mod.Rule("apexRule").Args["copy_commands"]
10868 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010869 if len(copyCmds) != 38 {
10870 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010871 }
10872
Jooyung Hana3fddf42024-09-03 13:22:21 +090010873 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10874 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10875 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10876 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010877 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010878
Yu Liubba555e2024-02-17 00:36:42 +000010879 inputs := []string{
10880 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010881 "my_aconfig_declarations_bar/intermediate.pb",
10882 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010883 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10884 }
10885 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10886 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10887 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10888 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010889 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010890}
10891
10892func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10893 aconfigRule := mod.Description(desc)
10894 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010895 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010896 if len(aconfigArgs) != len(inputs) {
10897 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010898 }
Yu Liucec0e412023-11-30 16:45:50 -080010899
Yu Liubba555e2024-02-17 00:36:42 +000010900 ensureEquals(t, container, aconfigRule.Args["container"])
10901 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10902
10903 buildParams := aconfigRule.BuildParams
10904 for _, input := range inputs {
10905 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10906 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010907 }
Yu Liubba555e2024-02-17 00:36:42 +000010908
10909 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010910}
10911
Yu Liueae7b362023-11-16 17:05:47 -080010912func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010913 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010914 ctx := testApex(t, apex_default_bp+`
10915 apex {
10916 name: "myapex",
10917 manifest: ":myapex.manifest",
10918 androidManifest: ":myapex.androidmanifest",
10919 key: "myapex.key",
10920 java_libs: [
10921 "my_java_library_foo",
10922 "other_java_library_bar",
10923 ],
10924 updatable: false,
10925 }
10926
10927 java_library {
10928 name: "my_java_library_foo",
10929 srcs: ["foo/bar/MyClass.java"],
10930 sdk_version: "none",
10931 system_modules: "none",
10932 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010933 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010934 "myapex",
10935 ],
10936 }
10937
10938 java_library {
10939 name: "other_java_library_bar",
10940 srcs: ["foo/bar/MyClass.java"],
10941 sdk_version: "none",
10942 system_modules: "none",
10943 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010944 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010945 "myapex",
10946 ],
10947 }
10948
10949 aconfig_declarations {
10950 name: "my_aconfig_declarations_foo",
10951 package: "com.example.package",
10952 container: "myapex",
10953 srcs: ["foo.aconfig"],
10954 }
10955
10956 java_aconfig_library {
10957 name: "my_java_aconfig_library_foo",
10958 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010959 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010960 "myapex",
10961 ],
10962 }
10963
10964 aconfig_declarations {
10965 name: "other_aconfig_declarations_bar",
10966 package: "com.example.package",
10967 container: "otherapex",
10968 srcs: ["bar.aconfig"],
10969 }
10970
10971 java_aconfig_library {
10972 name: "other_java_aconfig_library_bar",
10973 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010974 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010975 "myapex",
10976 ],
10977 }
10978 `)
10979
10980 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10981 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10982 s := " " + combineAconfigRule.Args["cache_files"]
10983 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10984 if len(aconfigArgs) != 1 {
10985 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10986 }
10987 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10988
10989 buildParams := combineAconfigRule.BuildParams
10990 if len(buildParams.Inputs) != 1 {
10991 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10992 }
10993 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10994 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10995}
10996
10997func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010998 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010999 ctx := testApex(t, apex_default_bp+`
11000 apex {
11001 name: "myapex",
11002 manifest: ":myapex.manifest",
11003 androidManifest: ":myapex.androidmanifest",
11004 key: "myapex.key",
11005 java_libs: [
11006 "my_java_library_foo",
11007 "my_java_library_bar",
11008 ],
11009 updatable: false,
11010 }
11011
11012 java_library {
11013 name: "my_java_library_foo",
11014 srcs: ["foo/bar/MyClass.java"],
11015 sdk_version: "none",
11016 system_modules: "none",
11017 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011018 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011019 "myapex",
11020 ],
11021 }
11022
11023 java_library {
11024 name: "my_java_library_bar",
11025 srcs: ["foo/bar/MyClass.java"],
11026 sdk_version: "none",
11027 system_modules: "none",
11028 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011029 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011030 "myapex",
11031 ],
11032 }
11033
11034 aconfig_declarations {
11035 name: "my_aconfig_declarations_foo",
11036 package: "com.example.package",
11037 container: "myapex",
11038 srcs: ["foo.aconfig"],
11039 }
11040
11041 java_aconfig_library {
11042 name: "my_java_aconfig_library_foo",
11043 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011044 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011045 "myapex",
11046 ],
11047 }
11048
11049 java_aconfig_library {
11050 name: "my_java_aconfig_library_bar",
11051 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011052 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011053 "myapex",
11054 ],
11055 }
11056 `)
11057
11058 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11059 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11060 s := " " + combineAconfigRule.Args["cache_files"]
11061 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11062 if len(aconfigArgs) != 1 {
11063 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11064 }
11065 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11066
11067 buildParams := combineAconfigRule.BuildParams
11068 if len(buildParams.Inputs) != 1 {
11069 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11070 }
11071 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11072 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11073}
Spandan Das5be63332023-12-13 00:06:32 +000011074
11075// Test that the boot jars come from the _selected_ apex prebuilt
11076// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11077func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011078 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011079 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11080 t.Helper()
11081 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11082 foundLibfooJar := false
11083 base := stem + ".jar"
11084 for _, output := range s.AllOutputs() {
11085 if filepath.Base(output) == base {
11086 foundLibfooJar = true
11087 buildRule := s.Output(output)
11088 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11089 }
11090 }
11091 if !foundLibfooJar {
11092 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11093 }
11094 }
11095
Spandan Das64c9e0c2023-12-20 20:13:34 +000011096 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11097 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11098 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11099 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11100 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11101 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)
11102 }
11103
11104 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11105 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11106 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11107 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11108 }
11109
Spandan Das5be63332023-12-13 00:06:32 +000011110 bp := `
11111 // Source APEX.
11112
11113 java_library {
11114 name: "framework-foo",
11115 srcs: ["foo.java"],
11116 installable: true,
11117 apex_available: [
11118 "com.android.foo",
11119 ],
11120 }
11121
11122 bootclasspath_fragment {
11123 name: "foo-bootclasspath-fragment",
11124 contents: ["framework-foo"],
11125 apex_available: [
11126 "com.android.foo",
11127 ],
11128 hidden_api: {
11129 split_packages: ["*"],
11130 },
11131 }
11132
11133 apex_key {
11134 name: "com.android.foo.key",
11135 public_key: "com.android.foo.avbpubkey",
11136 private_key: "com.android.foo.pem",
11137 }
11138
11139 apex {
11140 name: "com.android.foo",
11141 key: "com.android.foo.key",
11142 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11143 updatable: false,
11144 }
11145
11146 // Prebuilt APEX.
11147
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011148 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011149 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011150 public: {
11151 jars: ["foo.jar"],
11152 },
Spandan Das5be63332023-12-13 00:06:32 +000011153 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011154 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011155 }
11156
11157 prebuilt_bootclasspath_fragment {
11158 name: "foo-bootclasspath-fragment",
11159 contents: ["framework-foo"],
11160 hidden_api: {
11161 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11162 metadata: "my-bootclasspath-fragment/metadata.csv",
11163 index: "my-bootclasspath-fragment/index.csv",
11164 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11165 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11166 },
11167 apex_available: [
11168 "com.android.foo",
11169 ],
11170 }
11171
11172 prebuilt_apex {
11173 name: "com.android.foo",
11174 apex_name: "com.android.foo",
11175 src: "com.android.foo-arm.apex",
11176 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11177 }
11178
11179 // Another Prebuilt ART APEX
11180 prebuilt_apex {
11181 name: "com.android.foo.v2",
11182 apex_name: "com.android.foo", // Used to determine the API domain
11183 src: "com.android.foo-arm.apex",
11184 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11185 }
11186
11187 // APEX contribution modules
11188
11189 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011190 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011191 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011192 contents: ["com.android.foo"],
11193 }
11194
11195 apex_contributions {
11196 name: "foo.prebuilt.contributions",
11197 api_domain: "com.android.foo",
11198 contents: ["prebuilt_com.android.foo"],
11199 }
11200
11201 apex_contributions {
11202 name: "foo.prebuilt.v2.contributions",
11203 api_domain: "com.android.foo",
11204 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011205 }
11206 `
11207
11208 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011209 desc string
11210 selectedApexContributions string
11211 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011212 }{
11213 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011214 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11215 selectedApexContributions: "foo.source.contributions",
11216 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011217 },
11218 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011219 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11220 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011221 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 +000011222 },
11223 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011224 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11225 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011226 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 +000011227 },
11228 }
11229
11230 fragment := java.ApexVariantReference{
11231 Apex: proptools.StringPtr("com.android.foo"),
11232 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11233 }
11234
11235 for _, tc := range testCases {
11236 preparer := android.GroupFixturePreparers(
11237 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11238 android.FixtureMergeMockFs(map[string][]byte{
11239 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11240 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011241 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11242 // file creation.
11243 java.FixtureConfigureBootJars("platform:foo"),
11244 android.FixtureModifyMockFS(func(fs android.MockFS) {
11245 fs["platform/Android.bp"] = []byte(`
11246 java_library {
11247 name: "foo",
11248 srcs: ["Test.java"],
11249 compile_dex: true,
11250 }
11251 `)
11252 fs["platform/Test.java"] = nil
11253 }),
11254
Colin Crossa66b4632024-08-08 15:50:47 -070011255 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011256 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011257 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011258 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011259 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11260 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011261 }
11262}
Spandan Das3576e762024-01-03 18:57:03 +000011263
11264// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11265// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11266func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011267 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011268 // for a mainline module family, check that only the flagged soong module is visible to make
11269 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11270 variation := func(moduleName string) string {
11271 ret := "android_common_com.android.foo"
11272 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011273 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011274 }
11275 return ret
11276 }
11277
11278 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11279 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11280
11281 for _, hiddenModuleName := range hiddenModuleNames {
11282 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11283 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11284
11285 }
11286 }
11287
11288 bp := `
11289 apex_key {
11290 name: "com.android.foo.key",
11291 public_key: "com.android.foo.avbpubkey",
11292 private_key: "com.android.foo.pem",
11293 }
11294
11295 // AOSP source apex
11296 apex {
11297 name: "com.android.foo",
11298 key: "com.android.foo.key",
11299 updatable: false,
11300 }
11301
11302 // Google source apex
11303 override_apex {
11304 name: "com.google.android.foo",
11305 base: "com.android.foo",
11306 key: "com.android.foo.key",
11307 }
11308
11309 // Prebuilt Google APEX.
11310
11311 prebuilt_apex {
11312 name: "com.google.android.foo",
11313 apex_name: "com.android.foo",
11314 src: "com.android.foo-arm.apex",
11315 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11316 }
11317
11318 // Another Prebuilt Google APEX
11319 prebuilt_apex {
11320 name: "com.google.android.foo.v2",
11321 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011322 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011323 src: "com.android.foo-arm.apex",
11324 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11325 }
11326
11327 // APEX contribution modules
11328
11329 apex_contributions {
11330 name: "foo.source.contributions",
11331 api_domain: "com.android.foo",
11332 contents: ["com.google.android.foo"],
11333 }
11334
11335 apex_contributions {
11336 name: "foo.prebuilt.contributions",
11337 api_domain: "com.android.foo",
11338 contents: ["prebuilt_com.google.android.foo"],
11339 }
11340
11341 apex_contributions {
11342 name: "foo.prebuilt.v2.contributions",
11343 api_domain: "com.android.foo",
11344 contents: ["prebuilt_com.google.android.foo.v2"],
11345 }
11346
11347 // This is an incompatible module because it selects multiple versions of the same mainline module
11348 apex_contributions {
11349 name: "foo.prebuilt.duplicate.contributions",
11350 api_domain: "com.android.foo",
11351 contents: [
11352 "prebuilt_com.google.android.foo",
11353 "prebuilt_com.google.android.foo.v2",
11354 ],
11355 }
11356 `
11357
11358 testCases := []struct {
11359 desc string
11360 selectedApexContributions string
11361 expectedVisibleModuleName string
11362 expectedHiddenModuleNames []string
11363 expectedError string
11364 }{
11365 {
11366 desc: "Source apex is selected, prebuilts should be hidden from make",
11367 selectedApexContributions: "foo.source.contributions",
11368 expectedVisibleModuleName: "com.google.android.foo",
11369 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11370 },
11371 {
11372 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11373 selectedApexContributions: "foo.prebuilt.contributions",
11374 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11375 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11376 },
11377 {
11378 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11379 selectedApexContributions: "foo.prebuilt.v2.contributions",
11380 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11381 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11382 },
11383 {
11384 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11385 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11386 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11387 },
11388 }
11389
11390 for _, tc := range testCases {
11391 preparer := android.GroupFixturePreparers(
11392 android.FixtureMergeMockFs(map[string][]byte{
11393 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11394 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011395 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011396 )
11397 if tc.expectedError != "" {
11398 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11399 testApex(t, bp, preparer)
11400 return
11401 }
11402 ctx := testApex(t, bp, preparer)
11403
Spandan Das3576e762024-01-03 18:57:03 +000011404 // Check that
11405 // 1. The contents of the selected apex_contributions are visible to make
11406 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11407 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11408 }
11409}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011410
Spandan Das85bd4622024-08-01 00:51:20 +000011411// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11412func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011413 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011414 // for a mainline module family, check that only the flagged soong module is visible to make
11415 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11416 variation := func(moduleName string) string {
11417 ret := "android_common_com.android.adservices"
11418 if moduleName == "com.google.android.foo" {
11419 ret = "android_common_com.google.android.foo_com.google.android.foo"
11420 }
11421 return ret
11422 }
11423
11424 for _, visibleModuleName := range visibleModuleNames {
11425 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11426 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11427 }
11428
11429 for _, hiddenModuleName := range hiddenModuleNames {
11430 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11431 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11432
11433 }
11434 }
11435
11436 bp := `
11437 apex_key {
11438 name: "com.android.adservices.key",
11439 public_key: "com.android.adservices.avbpubkey",
11440 private_key: "com.android.adservices.pem",
11441 }
11442
11443 // AOSP source apex
11444 apex {
11445 name: "com.android.adservices",
11446 key: "com.android.adservices.key",
11447 updatable: false,
11448 }
11449
11450 // Prebuilt Google APEX.
11451
11452 prebuilt_apex {
11453 name: "com.google.android.adservices",
11454 apex_name: "com.android.adservices",
11455 src: "com.android.foo-arm.apex",
11456 }
11457
11458 // Another Prebuilt Google APEX
11459 prebuilt_apex {
11460 name: "com.google.android.adservices.v2",
11461 apex_name: "com.android.adservices",
11462 src: "com.android.foo-arm.apex",
11463 }
11464
11465 // APEX contribution modules
11466
11467
11468 apex_contributions {
11469 name: "adservices.prebuilt.contributions",
11470 api_domain: "com.android.adservices",
11471 contents: ["prebuilt_com.google.android.adservices"],
11472 }
11473
11474 apex_contributions {
11475 name: "adservices.prebuilt.v2.contributions",
11476 api_domain: "com.android.adservices",
11477 contents: ["prebuilt_com.google.android.adservices.v2"],
11478 }
11479 `
11480
11481 testCases := []struct {
11482 desc string
11483 selectedApexContributions string
11484 expectedVisibleModuleNames []string
11485 expectedHiddenModuleNames []string
11486 }{
11487 {
11488 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11489 selectedApexContributions: "",
11490 expectedVisibleModuleNames: []string{"com.android.adservices"},
11491 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11492 },
11493 {
11494 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11495 selectedApexContributions: "adservices.prebuilt.contributions",
11496 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11497 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11498 },
11499 {
11500 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11501 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11502 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11503 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11504 },
11505 }
11506
11507 for _, tc := range testCases {
11508 preparer := android.GroupFixturePreparers(
11509 android.FixtureMergeMockFs(map[string][]byte{
11510 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11511 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011512 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011513 )
11514 ctx := testApex(t, bp, preparer)
11515
11516 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11517 }
11518}
11519
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011520func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011521 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011522 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11523 for _, moduleName := range moduleNames {
11524 ret += fmt.Sprintf(`
11525 aconfig_declarations {
11526 name: "%[1]s",
11527 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011528 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011529 srcs: [
11530 "%[1]s.aconfig",
11531 ],
11532 }
11533 java_aconfig_library {
11534 name: "%[1]s-lib",
11535 aconfig_declarations: "%[1]s",
11536 }
11537 `, moduleName)
11538 }
11539 return ret
11540 }
11541
11542 result := android.GroupFixturePreparers(
11543 prepareForApexTest,
11544 java.PrepareForTestWithJavaSdkLibraryFiles,
11545 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011546 ).RunTestWithBp(t, `
11547 java_library {
11548 name: "baz-java-lib",
11549 static_libs: [
11550 "baz-lib",
11551 ],
11552 }
11553 filegroup {
11554 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011555 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011556 ":qux-lib{.generated_srcjars}",
11557 ],
11558 }
11559 filegroup {
11560 name: "qux-another-filegroup",
11561 srcs: [
11562 ":qux-filegroup",
11563 ],
11564 }
11565 java_library {
11566 name: "quux-java-lib",
11567 srcs: [
11568 "a.java",
11569 ],
11570 libs: [
11571 "quux-lib",
11572 ],
11573 }
11574 java_sdk_library {
11575 name: "foo",
11576 srcs: [
11577 ":qux-another-filegroup",
11578 ],
11579 api_packages: ["foo"],
11580 system: {
11581 enabled: true,
11582 },
11583 module_lib: {
11584 enabled: true,
11585 },
11586 test: {
11587 enabled: true,
11588 },
11589 static_libs: [
11590 "bar-lib",
11591 ],
11592 libs: [
11593 "baz-java-lib",
11594 "quux-java-lib",
11595 ],
11596 aconfig_declarations: [
11597 "bar",
11598 ],
11599 }
11600 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11601
11602 m := result.ModuleForTests("foo.stubs.source", "android_common")
11603 outDir := "out/soong/.intermediates"
11604
11605 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11606 // textproto files
11607 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11608
11609 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11610 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11611 // to aconfig.
11612 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11613 "passed as an input",
11614 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11615
11616 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11617 // to metalava as classpath. Thus the cache file provided by the associated
11618 // aconfig_declarations module "baz" should be passed to aconfig.
11619 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11620 "java_aconfig_library passed as an input",
11621 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11622
11623 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11624 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11625 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11626 "input",
11627 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11628
11629 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11630 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11631 // aconfig_declarations module "quux" should not be passed to aconfig.
11632 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11633 "depend on java_aconfig_library not passed as an input",
11634 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11635}
Cole Faust7c991b42024-05-15 11:17:55 -070011636
11637func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011638 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011639 ctx := testApex(t, `
11640 apex {
11641 name: "myapex",
11642 key: "myapex.key",
11643 prebuilts: ["myetc", "myetc2"],
11644 min_sdk_version: "29",
11645 }
11646 apex_key {
11647 name: "myapex.key",
11648 public_key: "testkey.avbpubkey",
11649 private_key: "testkey.pem",
11650 }
11651
11652 prebuilt_etc {
11653 name: "myetc",
11654 src: "myprebuilt",
11655 filename: "myfilename",
11656 }
11657 prebuilt_etc {
11658 name: "myetc2",
11659 sub_dir: "mysubdir",
11660 src: "myprebuilt",
11661 filename: "myfilename",
11662 }
11663 `, withFiles(android.MockFS{
11664 "packages/modules/common/build/allowed_deps.txt": nil,
11665 }))
11666
11667 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11668 data := android.AndroidMkDataForTest(t, ctx, ab)
11669 var builder strings.Builder
11670 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11671 androidMk := builder.String()
11672
11673 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11674 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11675}
Spandan Das50801e22024-05-13 18:29:45 +000011676
11677func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011678 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011679 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11680 args := module.Rule("apexRule").Args
11681 optFlags := args["opt_flags"]
11682 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11683 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11684 }
11685 }
11686
11687 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11688 t.Helper()
11689 found := false
11690 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11691 if dep == wantDep {
11692 found = true
11693 }
11694 })
11695 if !found {
11696 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11697 }
11698 }
11699
11700 ctx := testApex(t, `
11701 apex {
11702 name: "com.android.apex30",
11703 min_sdk_version: "30",
11704 key: "apex30.key",
11705 java_libs: ["javalib"],
11706 }
11707
11708 java_library {
11709 name: "javalib",
11710 srcs: ["A.java"],
11711 apex_available: ["com.android.apex30"],
11712 min_sdk_version: "30",
11713 sdk_version: "current",
11714 }
11715
11716 override_apex {
11717 name: "com.mycompany.android.apex30",
11718 base: "com.android.apex30",
11719 }
11720
11721 override_apex {
11722 name: "com.mycompany.android.apex31",
11723 base: "com.android.apex30",
11724 min_sdk_version: "31",
11725 }
11726
11727 apex_key {
11728 name: "apex30.key",
11729 public_key: "testkey.avbpubkey",
11730 private_key: "testkey.pem",
11731 }
11732
11733 `, android.FixtureMergeMockFs(android.MockFS{
11734 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11735 }),
11736 )
11737
11738 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11739 checkMinSdkVersion(t, baseModule, "30")
11740
11741 // Override module, but uses same min_sdk_version
11742 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11743 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11744 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11745 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11746
11747 // Override module, uses different min_sdk_version
11748 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11749 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11750 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11751 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11752}
Spandan Das0b28fa02024-05-28 23:40:17 +000011753
11754func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011755 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011756 context := android.GroupFixturePreparers(
11757 android.PrepareForIntegrationTestWithAndroid,
11758 PrepareForTestWithApexBuildComponents,
11759 android.FixtureMergeMockFs(android.MockFS{
11760 "system/sepolicy/apex/foo-file_contexts": nil,
11761 }),
11762 )
11763 res := context.RunTestWithBp(t, `
11764 apex {
11765 name: "foo",
11766 key: "myapex.key",
11767 apex_available_name: "com.android.foo",
11768 variant_version: "0",
11769 updatable: false,
11770 }
11771 apex_key {
11772 name: "myapex.key",
11773 public_key: "testkey.avbpubkey",
11774 private_key: "testkey.pem",
11775 }
11776 prebuilt_apex {
11777 name: "foo",
11778 src: "foo.apex",
11779 prefer: true,
11780 }
11781 override_apex {
11782 name: "myoverrideapex",
11783 base: "foo",
11784 }
11785 `)
11786
11787 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11788}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011789
11790func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011791 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011792 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`, `
11793 apex {
11794 name: "myapex",
11795 key: "myapex.key",
11796 updatable: true,
11797 min_sdk_version: "current",
11798 }
11799
11800 apex_key {
11801 name: "myapex.key",
11802 public_key: "testkey.avbpubkey",
11803 private_key: "testkey.pem",
11804 }
11805 `)
11806}
Spandan Das2f68f192024-07-22 19:25:50 +000011807
11808func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011809 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011810 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11811 result := android.GroupFixturePreparers(
11812 prepareForApexTest,
11813 android.PrepareForTestWithAndroidMk,
11814 android.PrepareForTestWithMakevars,
11815 android.FixtureMergeMockFs(fs),
11816 ).RunTest(t)
11817
11818 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011819 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011820
11821 installRules := result.InstallMakeRulesForTesting(t)
11822
11823 var installedlibRule *android.InstallMakeRule
11824 for i, rule := range installRules {
11825 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11826 if installedlibRule != nil {
11827 t.Errorf("Duplicate install rules for %s", rule.Target)
11828 }
11829 installedlibRule = &installRules[i]
11830 }
11831 }
11832 if installedlibRule == nil {
11833 t.Errorf("No install rule found for installedlib")
11834 return
11835 }
11836
11837 if expectLibfooOnSystemLib {
11838 android.AssertStringListContains(t,
11839 "installedlib doesn't have install dependency on libfoo impl",
11840 installedlibRule.OrderOnlyDeps,
11841 "out/target/product/test_device/system/lib/libfoo.so")
11842 } else {
11843 android.AssertStringListDoesNotContain(t,
11844 "installedlib has install dependency on libfoo stub",
11845 installedlibRule.Deps,
11846 "out/target/product/test_device/system/lib/libfoo.so")
11847 android.AssertStringListDoesNotContain(t,
11848 "installedlib has order-only install dependency on libfoo stub",
11849 installedlibRule.OrderOnlyDeps,
11850 "out/target/product/test_device/system/lib/libfoo.so")
11851 }
11852 }
11853
11854 prebuiltLibfooBp := []byte(`
11855 cc_prebuilt_library {
11856 name: "libfoo",
11857 prefer: true,
11858 srcs: ["libfoo.so"],
11859 stubs: {
11860 versions: ["1"],
11861 },
11862 apex_available: ["apexfoo"],
11863 }
11864 `)
11865
11866 apexfooBp := []byte(`
11867 apex {
11868 name: "apexfoo",
11869 key: "apexfoo.key",
11870 native_shared_libs: ["libfoo"],
11871 updatable: false,
11872 compile_multilib: "both",
11873 }
11874 apex_key {
11875 name: "apexfoo.key",
11876 public_key: "testkey.avbpubkey",
11877 private_key: "testkey.pem",
11878 }
11879 `)
11880
11881 installedlibBp := []byte(`
11882 cc_library {
11883 name: "installedlib",
11884 shared_libs: ["libfoo"],
11885 }
11886 `)
11887
11888 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011889 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011890 testFunc(
11891 t,
11892 /*expectLibfooOnSystemLib=*/ false,
11893 android.MockFS{
11894 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11895 "apexfoo/Android.bp": apexfooBp,
11896 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11897 "Android.bp": installedlibBp,
11898 },
11899 )
11900 })
11901
11902 disabledSourceLibfooBp := []byte(`
11903 cc_library {
11904 name: "libfoo",
11905 enabled: false,
11906 stubs: {
11907 versions: ["1"],
11908 },
11909 apex_available: ["apexfoo"],
11910 }
11911 `)
11912
11913 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011914 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011915 testFunc(
11916 t,
11917 /*expectLibfooOnSystemLib=*/ false,
11918 android.MockFS{
11919 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11920 "impl/Android.bp": disabledSourceLibfooBp,
11921 "apexfoo/Android.bp": apexfooBp,
11922 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11923 "Android.bp": installedlibBp,
11924 },
11925 )
11926 })
11927}
Jihoon Kange246bb72024-09-18 22:26:22 +000011928
11929func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011930 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011931 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11932 // in libs of android_app and java_library does not lead to class loader context device/host
11933 // path mismatch errors.
11934 android.GroupFixturePreparers(
11935 prepareForApexTest,
11936 android.PrepareForIntegrationTestWithAndroid,
11937 PrepareForTestWithApexBuildComponents,
11938 android.FixtureModifyEnv(func(env map[string]string) {
11939 env["DISABLE_CONTAINER_CHECK"] = "true"
11940 }),
11941 withFiles(filesForSdkLibrary),
11942 android.FixtureMergeMockFs(android.MockFS{
11943 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11944 }),
11945 ).RunTestWithBp(t, `
11946 apex {
11947 name: "com.android.foo30",
11948 key: "myapex.key",
11949 updatable: true,
11950 bootclasspath_fragments: [
11951 "foo-bootclasspath-fragment",
11952 ],
11953 java_libs: [
11954 "bar",
11955 ],
11956 apps: [
11957 "bar-app",
11958 ],
11959 min_sdk_version: "30",
11960 }
11961 apex_key {
11962 name: "myapex.key",
11963 public_key: "testkey.avbpubkey",
11964 private_key: "testkey.pem",
11965 }
11966 bootclasspath_fragment {
11967 name: "foo-bootclasspath-fragment",
11968 contents: [
11969 "framework-foo",
11970 ],
11971 apex_available: [
11972 "com.android.foo30",
11973 ],
11974 hidden_api: {
11975 split_packages: ["*"]
11976 },
11977 }
11978
11979 java_sdk_library {
11980 name: "framework-foo",
11981 srcs: [
11982 "A.java"
11983 ],
11984 unsafe_ignore_missing_latest_api: true,
11985 apex_available: [
11986 "com.android.foo30",
11987 ],
11988 compile_dex: true,
11989 sdk_version: "core_current",
11990 shared_library: false,
11991 }
11992
11993 java_library {
11994 name: "bar",
11995 srcs: [
11996 "A.java"
11997 ],
11998 libs: [
11999 "framework-foo.impl",
12000 ],
12001 apex_available: [
12002 "com.android.foo30",
12003 ],
12004 sdk_version: "core_current",
12005 }
12006
12007 java_library {
12008 name: "baz",
12009 srcs: [
12010 "A.java"
12011 ],
12012 libs: [
12013 "bar",
12014 ],
12015 sdk_version: "core_current",
12016 }
12017
12018 android_app {
12019 name: "bar-app",
12020 srcs: [
12021 "A.java"
12022 ],
12023 libs: [
12024 "baz",
12025 "framework-foo.impl",
12026 ],
12027 apex_available: [
12028 "com.android.foo30",
12029 ],
12030 sdk_version: "core_current",
12031 min_sdk_version: "30",
12032 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012033 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012034 }
12035 `)
12036}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012037
12038// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12039func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012040 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012041 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12042 apex {
12043 name: "myapex",
12044 key: "myapex.key",
12045 systemserverclasspath_fragments: [
12046 "mysystemserverclasspathfragment",
12047 ],
12048 min_sdk_version: "29",
12049 updatable: true,
12050 system_ext_specific: true,
12051 }
12052
12053 apex_key {
12054 name: "myapex.key",
12055 public_key: "testkey.avbpubkey",
12056 private_key: "testkey.pem",
12057 }
12058
12059 java_library {
12060 name: "foo",
12061 srcs: ["b.java"],
12062 min_sdk_version: "29",
12063 installable: true,
12064 apex_available: [
12065 "myapex",
12066 ],
12067 sdk_version: "current",
12068 }
12069
12070 systemserverclasspath_fragment {
12071 name: "mysystemserverclasspathfragment",
12072 contents: [
12073 "foo",
12074 ],
12075 apex_available: [
12076 "myapex",
12077 ],
12078 }
12079 `,
12080 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12081 )
12082}
Spandan Das72d86c62024-10-15 19:27:41 +000012083
12084// partitions should not package the artifacts that are included inside the apex.
12085func TestFilesystemWithApexDeps(t *testing.T) {
12086 t.Parallel()
12087 result := testApex(t, `
12088 android_filesystem {
12089 name: "myfilesystem",
12090 deps: ["myapex"],
12091 }
12092 apex {
12093 name: "myapex",
12094 key: "myapex.key",
12095 binaries: ["binfoo"],
12096 native_shared_libs: ["libfoo"],
12097 apps: ["appfoo"],
12098 updatable: false,
12099 }
12100 apex_key {
12101 name: "myapex.key",
12102 }
12103 cc_binary {
12104 name: "binfoo",
12105 apex_available: ["myapex"],
12106 }
12107 cc_library {
12108 name: "libfoo",
12109 apex_available: ["myapex"],
12110 }
12111 android_app {
12112 name: "appfoo",
12113 sdk_version: "current",
12114 apex_available: ["myapex"],
12115 }
12116 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12117
12118 partition := result.ModuleForTests("myfilesystem", "android_common")
12119 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12120 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12121}
Colin Crossb614cd42024-10-11 12:52:21 -070012122
12123func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12124 t.Parallel()
12125
12126 extractDepenencyPathFromErrors := func(errs []error) []string {
12127 i := slices.IndexFunc(errs, func(err error) bool {
12128 return strings.Contains(err.Error(), "dependency path:")
12129 })
12130 if i < 0 {
12131 return nil
12132 }
12133 var dependencyPath []string
12134 for _, err := range errs[i+1:] {
12135 s := err.Error()
12136 lastSpace := strings.LastIndexByte(s, ' ')
12137 if lastSpace >= 0 {
12138 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12139 }
12140 }
12141 return dependencyPath
12142 }
12143
12144 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12145 return func(t *testing.T, result *android.TestResult) {
12146 t.Helper()
12147 if len(result.Errs) == 0 {
12148 t.Fatalf("expected errors")
12149 }
12150 t.Log("found errors:")
12151 for _, err := range result.Errs {
12152 t.Log(err)
12153 }
12154 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12155 t.Fatalf("expected error %q, got %q", w, g)
12156 }
12157 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12158 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12159 t.Errorf("expected dependency path %q, got %q", w, g)
12160 }
12161 }
12162 }
12163
12164 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12165 return func(bp *bpmodify.Blueprint) {
12166 m := bp.ModulesByName(module)
12167 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12168 if err != nil {
12169 panic(err)
12170 }
12171 props.AddStringToList(lib)
12172 }
12173 }
12174
12175 bpTemplate := `
12176 apex {
12177 name: "myapex",
12178 key: "myapex.key",
12179 native_shared_libs: ["mylib"],
12180 rust_dyn_libs: ["libmyrust"],
12181 binaries: ["mybin", "myrustbin"],
12182 jni_libs: ["libjni"],
12183 apps: ["myapp"],
12184 updatable: false,
12185 }
12186
12187 apex {
12188 name: "otherapex",
12189 key: "myapex.key",
12190 native_shared_libs: ["libotherapex"],
12191 updatable: false,
12192 }
12193
12194 apex_key {
12195 name: "myapex.key",
12196 public_key: "testkey.avbpubkey",
12197 private_key: "testkey.pem",
12198 }
12199
12200 cc_library {
12201 name: "mylib",
12202 srcs: ["foo.cpp"],
12203 apex_available: ["myapex"],
12204 }
12205
12206 cc_binary {
12207 name: "mybin",
12208 srcs: ["foo.cpp"],
12209 apex_available: ["myapex"],
12210 }
12211
12212 rust_library {
12213 name: "libmyrust",
12214 crate_name: "myrust",
12215 srcs: ["src/lib.rs"],
12216 rustlibs: ["libmyrust_transitive_dylib"],
12217 rlibs: ["libmyrust_transitive_rlib"],
12218 apex_available: ["myapex"],
12219 }
12220
12221 rust_library{
12222 name: "libmyrust_transitive_dylib",
12223 crate_name: "myrust_transitive_dylib",
12224 srcs: ["src/lib.rs"],
12225 apex_available: ["myapex"],
12226 }
12227
12228 rust_library {
12229 name: "libmyrust_transitive_rlib",
12230 crate_name: "myrust_transitive_rlib",
12231 srcs: ["src/lib.rs"],
12232 apex_available: ["myapex"],
12233 }
12234
12235 rust_binary {
12236 name: "myrustbin",
12237 srcs: ["src/main.rs"],
12238 apex_available: ["myapex"],
12239 }
12240
12241 cc_library {
12242 name: "libbar",
12243 sdk_version: "current",
12244 srcs: ["bar.cpp"],
12245 apex_available: ["myapex"],
12246 stl: "none",
12247 }
12248
12249 android_app {
12250 name: "myapp",
12251 jni_libs: ["libembeddedjni"],
12252 use_embedded_native_libs: true,
12253 sdk_version: "current",
12254 apex_available: ["myapex"],
12255 }
12256
12257 cc_library {
12258 name: "libembeddedjni",
12259 sdk_version: "current",
12260 srcs: ["bar.cpp"],
12261 apex_available: ["myapex"],
12262 stl: "none",
12263 }
12264
12265 cc_library {
12266 name: "libjni",
12267 sdk_version: "current",
12268 srcs: ["bar.cpp"],
12269 apex_available: ["myapex"],
12270 stl: "none",
12271 }
12272
12273 cc_library {
12274 name: "libotherapex",
12275 sdk_version: "current",
12276 srcs: ["otherapex.cpp"],
12277 apex_available: ["otherapex"],
12278 stubs: {
12279 symbol_file: "libotherapex.map.txt",
12280 versions: ["1", "2", "3"],
12281 },
12282 stl: "none",
12283 }
12284
12285 cc_library {
12286 name: "libplatform",
12287 sdk_version: "current",
12288 srcs: ["libplatform.cpp"],
12289 stubs: {
12290 symbol_file: "libplatform.map.txt",
12291 versions: ["1", "2", "3"],
12292 },
12293 stl: "none",
12294 system_shared_libs: [],
12295 }
12296 `
12297
12298 testCases := []struct {
12299 name string
12300 bpModifier func(bp *bpmodify.Blueprint)
12301 dependencyPath []string
12302 }{
12303 {
12304 name: "library dependency in other apex",
12305 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12306 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12307 },
12308 {
12309 name: "transitive library dependency in other apex",
12310 bpModifier: func(bp *bpmodify.Blueprint) {
12311 addToSharedLibs("mylib", "libbar")(bp)
12312 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12313 },
12314 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12315 },
12316 {
12317 name: "library dependency in platform",
12318 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12319 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12320 },
12321 {
12322 name: "jni library dependency in other apex",
12323 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12324 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12325 },
12326 {
12327 name: "transitive jni library dependency in other apex",
12328 bpModifier: func(bp *bpmodify.Blueprint) {
12329 addToSharedLibs("libjni", "libbar")(bp)
12330 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12331 },
12332 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12333 },
12334 {
12335 name: "jni library dependency in platform",
12336 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12337 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12338 },
12339 {
12340 name: "transitive jni library dependency in platform",
12341 bpModifier: func(bp *bpmodify.Blueprint) {
12342 addToSharedLibs("libjni", "libbar")(bp)
12343 addToSharedLibs("libbar", "libplatform#impl")(bp)
12344 },
12345 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12346 },
12347 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12348 // JNI libraries even if they came from another apex.
12349 //{
12350 // name: "app jni library dependency in other apex",
12351 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12352 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12353 //},
12354 //{
12355 // name: "transitive app jni library dependency in other apex",
12356 // bpModifier: func(bp *bpmodify.Blueprint) {
12357 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12358 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12359 // },
12360 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12361 //},
12362 //{
12363 // name: "app jni library dependency in platform",
12364 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12365 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12366 //},
12367 //{
12368 // name: "transitive app jni library dependency in platform",
12369 // bpModifier: func(bp *bpmodify.Blueprint) {
12370 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12371 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12372 // },
12373 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12374 //},
12375 {
12376 name: "binary dependency in other apex",
12377 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12378 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12379 },
12380 {
12381 name: "transitive binary dependency in other apex",
12382 bpModifier: func(bp *bpmodify.Blueprint) {
12383 addToSharedLibs("mybin", "libbar")(bp)
12384 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12385 },
12386 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12387 },
12388 {
12389 name: "binary dependency in platform",
12390 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12391 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12392 },
12393 {
12394 name: "transitive binary dependency in platform",
12395 bpModifier: func(bp *bpmodify.Blueprint) {
12396 addToSharedLibs("mybin", "libbar")(bp)
12397 addToSharedLibs("libbar", "libplatform#impl")(bp)
12398 },
12399 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12400 },
12401
12402 {
12403 name: "rust library dependency in other apex",
12404 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12405 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12406 },
12407 {
12408 name: "transitive rust library dependency in other apex",
12409 bpModifier: func(bp *bpmodify.Blueprint) {
12410 addToSharedLibs("libmyrust", "libbar")(bp)
12411 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12412 },
12413 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12414 },
12415 {
12416 name: "rust library dependency in platform",
12417 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12418 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12419 },
12420 {
12421 name: "transitive rust library dependency in platform",
12422 bpModifier: func(bp *bpmodify.Blueprint) {
12423 addToSharedLibs("libmyrust", "libbar")(bp)
12424 addToSharedLibs("libbar", "libplatform#impl")(bp)
12425 },
12426 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12427 },
12428 {
12429 name: "transitive rust library dylib dependency in other apex",
12430 bpModifier: func(bp *bpmodify.Blueprint) {
12431 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12432 },
12433 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12434 },
12435 {
12436 name: "transitive rust library dylib dependency in platform",
12437 bpModifier: func(bp *bpmodify.Blueprint) {
12438 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12439 },
12440 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12441 },
12442 {
12443 name: "transitive rust library rlib dependency in other apex",
12444 bpModifier: func(bp *bpmodify.Blueprint) {
12445 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12446 },
12447 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12448 },
12449 {
12450 name: "transitive rust library rlib dependency in platform",
12451 bpModifier: func(bp *bpmodify.Blueprint) {
12452 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12453 },
12454 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12455 },
12456 {
12457 name: "rust binary dependency in other apex",
12458 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12459 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12460 },
12461 {
12462 name: "transitive rust binary dependency in other apex",
12463 bpModifier: func(bp *bpmodify.Blueprint) {
12464 addToSharedLibs("myrustbin", "libbar")(bp)
12465 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12466 },
12467 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12468 },
12469 {
12470 name: "rust binary dependency in platform",
12471 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12472 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12473 },
12474 {
12475 name: "transitive rust binary dependency in platform",
12476 bpModifier: func(bp *bpmodify.Blueprint) {
12477 addToSharedLibs("myrustbin", "libbar")(bp)
12478 addToSharedLibs("libbar", "libplatform#impl")(bp)
12479 },
12480 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12481 },
12482 }
12483
12484 for _, testCase := range testCases {
12485 t.Run(testCase.name, func(t *testing.T) {
12486 t.Parallel()
12487 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12488 if err != nil {
12489 t.Fatal(err)
12490 }
12491 if testCase.bpModifier != nil {
12492 func() {
12493 defer func() {
12494 if r := recover(); r != nil {
12495 t.Fatalf("panic in bpModifier: %v", r)
12496 }
12497 }()
12498 testCase.bpModifier(bp)
12499 }()
12500 }
12501 android.GroupFixturePreparers(
12502 android.PrepareForTestWithAndroidBuildComponents,
12503 cc.PrepareForTestWithCcBuildComponents,
12504 java.PrepareForTestWithDexpreopt,
12505 rust.PrepareForTestWithRustDefaultModules,
12506 PrepareForTestWithApexBuildComponents,
12507 prepareForTestWithMyapex,
12508 prepareForTestWithOtherapex,
12509 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12510 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12511 }),
12512 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12513 RunTestWithBp(t, bp.String())
12514 })
12515 }
12516}