blob: 6cdb225ff7c0a5c9eecea64c18cba0bcf8e99b72 [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 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800498 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900499 }
500
Jiyong Park77acec62020-06-01 21:39:15 +0900501 dex_import {
502 name: "myjar_dex",
503 jars: ["prebuilt.jar"],
504 apex_available: [
505 "//apex_available:platform",
506 "myapex",
507 ],
508 }
509
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 java_library {
511 name: "myotherjar",
512 srcs: ["foo/bar/MyClass.java"],
513 sdk_version: "none",
514 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900515 // TODO: remove //apex_available:platform
516 apex_available: [
517 "//apex_available:platform",
518 "myapex",
519 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900520 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900521
522 java_library {
523 name: "mysharedjar",
524 srcs: ["foo/bar/MyClass.java"],
525 sdk_version: "none",
526 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900527 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900528 `)
529
Jooyung Hana0503a52023-08-23 13:12:50 +0900530 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900531
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900532 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900533 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700534 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900535 var builder strings.Builder
536 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
537
538 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000539 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900540 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
541
Jiyong Park42cca6c2019-04-01 11:15:50 +0900542 optFlags := apexRule.Args["opt_flags"]
543 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700544 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900545 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900546
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547 copyCmds := apexRule.Args["copy_commands"]
548
549 // Ensure that main rule creates an output
550 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
551
552 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700560 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
561 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
563 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700564 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900567
568 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800569 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
570 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900571 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900572 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900573 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900575 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
576 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900577 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900578 // .. but not for java libs
579 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900580 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800581
Colin Cross7113d202019-11-20 16:39:12 -0800582 // Ensure that the platform variant ends with _shared or _common
583 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
584 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900585 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900587 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
588
589 // Ensure that dynamic dependency to java libs are not included
590 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800591
592 // Ensure that all symlinks are present.
593 found_foo_link_64 := false
594 found_foo := false
595 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900596 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800597 if strings.HasSuffix(cmd, "bin/foo") {
598 found_foo = true
599 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
600 found_foo_link_64 = true
601 }
602 }
603 }
604 good := found_foo && found_foo_link_64
605 if !good {
606 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
607 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900608
Colin Crossf61d03d2023-11-02 16:56:39 -0700609 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
610 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100612 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
613 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
614 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100615
Colin Crossf61d03d2023-11-02 16:56:39 -0700616 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
617 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100618 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100619 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
620 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
621 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800622}
623
Jooyung Hanf21c7972019-12-16 22:32:06 +0900624func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700625 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800626 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 apex_defaults {
628 name: "myapex-defaults",
629 key: "myapex.key",
630 prebuilts: ["myetc"],
631 native_shared_libs: ["mylib"],
632 java_libs: ["myjar"],
633 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900634 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800635 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000636 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900637 }
638
639 prebuilt_etc {
640 name: "myetc",
641 src: "myprebuilt",
642 }
643
644 apex {
645 name: "myapex",
646 defaults: ["myapex-defaults"],
647 }
648
649 apex_key {
650 name: "myapex.key",
651 public_key: "testkey.avbpubkey",
652 private_key: "testkey.pem",
653 }
654
655 cc_library {
656 name: "mylib",
657 system_shared_libs: [],
658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000659 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 }
661
662 java_library {
663 name: "myjar",
664 srcs: ["foo/bar/MyClass.java"],
665 sdk_version: "none",
666 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000667 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800668 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900669 }
670
671 android_app {
672 name: "AppFoo",
673 srcs: ["foo/bar/MyClass.java"],
674 sdk_version: "none",
675 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000676 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900678
679 runtime_resource_overlay {
680 name: "rro",
681 theme: "blue",
682 }
683
markchien2f59ec92020-09-02 16:23:38 +0800684 bpf {
685 name: "bpf",
686 srcs: ["bpf.c", "bpf2.c"],
687 }
688
Ken Chenfad7f9d2021-11-10 22:02:57 +0800689 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800690 name: "netdTest",
691 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800692 sub_dir: "netd",
693 }
694
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900696 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900697 "etc/myetc",
698 "javalib/myjar.jar",
699 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000700 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900701 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800702 "etc/bpf/bpf.o",
703 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800704 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900705 })
706}
707
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700709 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800710 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711 apex {
712 name: "myapex",
713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000714 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715 }
716
717 apex_key {
718 name: "myapex.key",
719 public_key: "testkey.avbpubkey",
720 private_key: "testkey.pem",
721 }
722 `)
723
Jooyung Hana0503a52023-08-23 13:12:50 +0900724 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900725 args := module.Rule("apexRule").Args
726 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
727 t.Error("manifest should be apex_manifest.pb, but " + manifest)
728 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900729}
730
Liz Kammer4854a7d2021-05-27 14:28:27 -0400731func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700732 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400733 ctx := testApex(t, `
734 apex_defaults {
735 name: "my_defaults",
736 key: "myapex.key",
737 product_specific: true,
738 file_contexts: ":my-file-contexts",
739 updatable: false,
740 }
741 apex {
742 name: "myapex_30",
743 min_sdk_version: "30",
744 defaults: ["my_defaults"],
745 }
746
747 apex {
748 name: "myapex_current",
749 min_sdk_version: "current",
750 defaults: ["my_defaults"],
751 }
752
753 apex {
754 name: "myapex_none",
755 defaults: ["my_defaults"],
756 }
757
758 apex_key {
759 name: "myapex.key",
760 public_key: "testkey.avbpubkey",
761 private_key: "testkey.pem",
762 }
763
764 filegroup {
765 name: "my-file-contexts",
766 srcs: ["product_specific_file_contexts"],
767 }
768 `, withFiles(map[string][]byte{
769 "product_specific_file_contexts": nil,
770 }), android.FixtureModifyProductVariables(
771 func(variables android.FixtureProductVariables) {
772 variables.Unbundled_build = proptools.BoolPtr(true)
773 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
774 }), android.FixtureMergeEnv(map[string]string{
775 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
776 }))
777
778 testCases := []struct {
779 module string
780 minSdkVersion string
781 }{
782 {
783 module: "myapex_30",
784 minSdkVersion: "30",
785 },
786 {
787 module: "myapex_current",
788 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
789 },
790 {
791 module: "myapex_none",
792 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
793 },
794 }
795 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900796 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400797 args := module.Rule("apexRule").Args
798 optFlags := args["opt_flags"]
799 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
800 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
801 }
802 }
803}
804
Jihoon Kang842b9992024-02-08 01:41:51 +0000805func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700806 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000807 ctx := testApex(t, `
808 apex_defaults {
809 name: "my_defaults",
810 key: "myapex.key",
811 product_specific: true,
812 file_contexts: ":my-file-contexts",
813 updatable: false,
814 }
815 apex {
816 name: "myapex_30",
817 min_sdk_version: "30",
818 defaults: ["my_defaults"],
819 }
820
821 apex {
822 name: "myapex_current",
823 min_sdk_version: "current",
824 defaults: ["my_defaults"],
825 }
826
827 apex {
828 name: "myapex_none",
829 defaults: ["my_defaults"],
830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 filegroup {
839 name: "my-file-contexts",
840 srcs: ["product_specific_file_contexts"],
841 }
842 `, withFiles(map[string][]byte{
843 "product_specific_file_contexts": nil,
844 }), android.FixtureModifyProductVariables(
845 func(variables android.FixtureProductVariables) {
846 variables.Unbundled_build = proptools.BoolPtr(true)
847 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
848 }), android.FixtureMergeEnv(map[string]string{
849 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 }))
851
852 testCases := []struct {
853 module string
854 minSdkVersion string
855 }{
856 {
857 module: "myapex_30",
858 minSdkVersion: "30",
859 },
860 {
861 module: "myapex_current",
862 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
863 },
864 {
865 module: "myapex_none",
866 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
867 },
868 }
869 for _, tc := range testCases {
870 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
871 args := module.Rule("apexRule").Args
872 optFlags := args["opt_flags"]
873 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
874 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
875 }
876 }
877}
878
Jooyung Hanaf730952023-02-28 14:13:38 +0900879func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700880 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900881 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 if vendor {
884 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900885 }
886 ctx := testApex(t, `
887 apex {
888 name: "myapex",
889 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900891 `+prop+`
892 }
893
894 apex_key {
895 name: "myapex.key",
896 public_key: "testkey.avbpubkey",
897 private_key: "testkey.pem",
898 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900899 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900900
Jooyung Hana0503a52023-08-23 13:12:50 +0900901 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900902 if vendor {
903 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
904 rule.RuleParams.Command,
905 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900906 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900907 android.AssertStringDoesContain(t, "should force-label as system_file",
908 rule.RuleParams.Command,
909 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900910 }
911 }
912}
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700915 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800916 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 apex {
918 name: "myapex",
919 key: "myapex.key",
920 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900921 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000922 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 }
924
925 apex_key {
926 name: "myapex.key",
927 public_key: "testkey.avbpubkey",
928 private_key: "testkey.pem",
929 }
930
931 cc_library {
932 name: "mylib",
933 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800934 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 system_shared_libs: [],
936 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 }
939
940 cc_library {
941 name: "mylib2",
942 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900943 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 system_shared_libs: [],
945 stl: "none",
946 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000947 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900948 versions: ["1", "2", "3"],
949 },
950 }
951
952 cc_library {
953 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 srcs: ["mylib.cpp"],
955 shared_libs: ["mylib4"],
956 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957 stl: "none",
958 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000959 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960 versions: ["10", "11", "12"],
961 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900964
965 cc_library {
966 name: "mylib4",
967 srcs: ["mylib.cpp"],
968 system_shared_libs: [],
969 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000970 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900971 }
Jiyong Park105dc322021-06-11 17:22:09 +0900972
Spandan Das357ffcc2024-07-24 18:07:48 +0000973 cc_prebuilt_library_shared {
974 name: "my_prebuilt_platform_lib",
975 stubs: {
976 symbol_file: "my_prebuilt_platform_lib.map.txt",
977 versions: ["1", "2", "3"],
978 },
979 srcs: ["foo.so"],
980 }
981
982 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
983 cc_prebuilt_library_shared {
984 name: "my_prebuilt_platform_stub_only_lib",
985 stubs: {
986 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
987 versions: ["1", "2", "3"],
988 }
989 }
990
Jiyong Park105dc322021-06-11 17:22:09 +0900991 rust_binary {
992 name: "foo.rust",
993 srcs: ["foo.rs"],
994 shared_libs: ["libfoo.shared_from_rust"],
995 prefer_rlib: true,
996 apex_available: ["myapex"],
997 }
998
999 cc_library_shared {
1000 name: "libfoo.shared_from_rust",
1001 srcs: ["mylib.cpp"],
1002 system_shared_libs: [],
1003 stl: "none",
1004 stubs: {
1005 versions: ["10", "11", "12"],
1006 },
1007 }
1008
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009 `)
1010
Jooyung Hana0503a52023-08-23 13:12:50 +09001011 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 copyCmds := apexRule.Args["copy_commands"]
1013
1014 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001015 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016
1017 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001018 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001019
1020 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001021 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
Colin Crossaede88c2020-08-11 12:17:01 -07001023 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001024
1025 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001028 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001029
Colin Crossea91a172024-11-05 16:14:05 -08001030 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001031 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001032 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001033 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001034
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001035 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1036 // is replaced by sharing of "cFlags" in cc/builder.go.
1037 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1038 // module variable representing "cflags". So it was not detected by ensureNotContains.
1039 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1040 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1041 // including the original cflags's "-include mylib.h".
1042 //
Jiyong Park64379952018-12-13 18:37:29 +09001043 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001044 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1045 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001046
Jiyong Park85cc35a2022-07-17 11:30:47 +09001047 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1048 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1049 // Ensure that genstub for apex-provided lib is invoked with --apex
1050 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051
Jooyung Hana0503a52023-08-23 13:12:50 +09001052 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001053 "lib64/mylib.so",
1054 "lib64/mylib3.so",
1055 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001056 "bin/foo.rust",
1057 "lib64/libc++.so", // by the implicit dependency from foo.rust
1058 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001059 })
Jiyong Park105dc322021-06-11 17:22:09 +09001060
1061 // Ensure that stub dependency from a rust module is not included
1062 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1063 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001064 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001065 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1066 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001067
Jooyung Hana0503a52023-08-23 13:12:50 +09001068 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001069 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001070
1071 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1072 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1073 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1074 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1075 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1076 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1077
1078 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1079 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1080 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1081 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1082 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1083 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 +09001084}
1085
Jooyung Han20348752023-12-05 15:23:56 +09001086func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001087 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001088 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 vendor: true,
1093 updatable: false,
1094 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1095 }
1096
1097 apex_key {
1098 name: "myapex.key",
1099 public_key: "testkey.avbpubkey",
1100 private_key: "testkey.pem",
1101 }
1102
1103 cc_library {
1104 name: "libbar",
1105 srcs: ["mylib.cpp"],
1106 llndk: {
1107 symbol_file: "libbar.map.txt",
1108 }
1109 }
1110 `)
1111}
1112
Jiyong Park1bc84122021-06-22 20:23:05 +09001113func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001114 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001115 ctx := testApex(t, `
1116 apex {
1117 name: "myapex",
1118 key: "myapex.key",
1119 native_shared_libs: ["mylib"],
1120 binaries: ["foo.rust"],
1121 updatable: false,
1122 platform_apis: true,
1123 }
1124
1125 apex_key {
1126 name: "myapex.key",
1127 public_key: "testkey.avbpubkey",
1128 private_key: "testkey.pem",
1129 }
1130
1131 cc_library {
1132 name: "mylib",
1133 srcs: ["mylib.cpp"],
1134 shared_libs: ["mylib2"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 apex_available: [ "myapex" ],
1138 }
1139
1140 cc_library {
1141 name: "mylib2",
1142 srcs: ["mylib.cpp"],
1143 cflags: ["-include mylib.h"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 stubs: {
1147 versions: ["1", "2", "3"],
1148 },
1149 }
1150
1151 rust_binary {
1152 name: "foo.rust",
1153 srcs: ["foo.rs"],
1154 shared_libs: ["libfoo.shared_from_rust"],
1155 prefer_rlib: true,
1156 apex_available: ["myapex"],
1157 }
1158
1159 cc_library_shared {
1160 name: "libfoo.shared_from_rust",
1161 srcs: ["mylib.cpp"],
1162 system_shared_libs: [],
1163 stl: "none",
1164 stubs: {
1165 versions: ["10", "11", "12"],
1166 },
1167 }
1168 `)
1169
Jooyung Hana0503a52023-08-23 13:12:50 +09001170 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001171 copyCmds := apexRule.Args["copy_commands"]
1172
1173 // Ensure that indirect stubs dep is not included
1174 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1175 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1176
1177 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1178 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001179 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001180 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1181 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001182 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001183 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1184 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1185}
1186
Colin Cross7812fd32020-09-25 12:35:10 -07001187func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1188 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001189 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001190 apex {
1191 name: "myapex",
1192 key: "myapex.key",
1193 native_shared_libs: ["mylib", "mylib3"],
1194 min_sdk_version: "29",
1195 }
1196
1197 apex_key {
1198 name: "myapex.key",
1199 public_key: "testkey.avbpubkey",
1200 private_key: "testkey.pem",
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001206 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001207 system_shared_libs: [],
1208 stl: "none",
1209 apex_available: [ "myapex" ],
1210 min_sdk_version: "28",
1211 }
1212
1213 cc_library {
1214 name: "mylib2",
1215 srcs: ["mylib.cpp"],
1216 cflags: ["-include mylib.h"],
1217 system_shared_libs: [],
1218 stl: "none",
1219 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001220 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001221 versions: ["28", "29", "30", "current"],
1222 },
1223 min_sdk_version: "28",
1224 }
1225
1226 cc_library {
1227 name: "mylib3",
1228 srcs: ["mylib.cpp"],
1229 shared_libs: ["mylib4"],
1230 system_shared_libs: [],
1231 stl: "none",
1232 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001233 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001234 versions: ["28", "29", "30", "current"],
1235 },
1236 apex_available: [ "myapex" ],
1237 min_sdk_version: "28",
1238 }
1239
1240 cc_library {
1241 name: "mylib4",
1242 srcs: ["mylib.cpp"],
1243 system_shared_libs: [],
1244 stl: "none",
1245 apex_available: [ "myapex" ],
1246 min_sdk_version: "28",
1247 }
1248 `)
1249
Jooyung Hana0503a52023-08-23 13:12:50 +09001250 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001251 copyCmds := apexRule.Args["copy_commands"]
1252
1253 // Ensure that direct non-stubs dep is always included
1254 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1255
1256 // Ensure that indirect stubs dep is not included
1257 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1258
1259 // Ensure that direct stubs dep is included
1260 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1261
1262 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1263
Jiyong Park55549df2021-02-26 23:57:23 +09001264 // Ensure that mylib is linking with the latest version of stub for mylib2
1265 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001266 // ... and not linking to the non-stub (impl) variant of mylib2
1267 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1268
Colin Crossea91a172024-11-05 16:14:05 -08001269 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001270 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1271 // .. and not linking to the stubs variant of mylib3
1272 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1273
1274 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001275 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001276 ensureNotContains(t, mylib2Cflags, "-include ")
1277
Jiyong Park85cc35a2022-07-17 11:30:47 +09001278 // Ensure that genstub is invoked with --systemapi
1279 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001280
Jooyung Hana0503a52023-08-23 13:12:50 +09001281 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001282 "lib64/mylib.so",
1283 "lib64/mylib3.so",
1284 "lib64/mylib4.so",
1285 })
1286}
1287
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001288func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1289 t.Parallel()
1290 // myapex (Z)
1291 // mylib -----------------.
1292 // |
1293 // otherapex (29) |
1294 // libstub's versions: 29 Z current
1295 // |
1296 // <platform> |
1297 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001298 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 apex {
1300 name: "myapex",
1301 key: "myapex.key",
1302 native_shared_libs: ["mylib"],
1303 min_sdk_version: "Z", // non-final
1304 }
1305
1306 cc_library {
1307 name: "mylib",
1308 srcs: ["mylib.cpp"],
1309 shared_libs: ["libstub"],
1310 apex_available: ["myapex"],
1311 min_sdk_version: "Z",
1312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 apex {
1321 name: "otherapex",
1322 key: "myapex.key",
1323 native_shared_libs: ["libstub"],
1324 min_sdk_version: "29",
1325 }
1326
1327 cc_library {
1328 name: "libstub",
1329 srcs: ["mylib.cpp"],
1330 stubs: {
1331 versions: ["29", "Z", "current"],
1332 },
1333 apex_available: ["otherapex"],
1334 min_sdk_version: "29",
1335 }
1336
1337 // platform module depending on libstub from otherapex should use the latest stub("current")
1338 cc_library {
1339 name: "libplatform",
1340 srcs: ["mylib.cpp"],
1341 shared_libs: ["libstub"],
1342 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001343 `,
1344 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1345 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1346 variables.Platform_sdk_final = proptools.BoolPtr(false)
1347 variables.Platform_version_active_codenames = []string{"Z"}
1348 }),
1349 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001350
Jiyong Park55549df2021-02-26 23:57:23 +09001351 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001352 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001353 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001354 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001355 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001356
1357 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1358 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1359 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1360 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1361 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1362}
1363
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001364func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001365 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001366 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001367 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001368 name: "myapex2",
1369 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001371 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001372 }
1373
1374 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001375 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001376 public_key: "testkey.avbpubkey",
1377 private_key: "testkey.pem",
1378 }
1379
1380 cc_library {
1381 name: "mylib",
1382 srcs: ["mylib.cpp"],
1383 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001384 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001385 system_shared_libs: [],
1386 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001387 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001388 }
1389
1390 cc_library {
1391 name: "libfoo",
1392 srcs: ["mylib.cpp"],
1393 shared_libs: ["libbar"],
1394 system_shared_libs: [],
1395 stl: "none",
1396 stubs: {
1397 versions: ["10", "20", "30"],
1398 },
1399 }
1400
1401 cc_library {
1402 name: "libbar",
1403 srcs: ["mylib.cpp"],
1404 system_shared_libs: [],
1405 stl: "none",
1406 }
1407
Jiyong Park678c8812020-02-07 17:25:49 +09001408 cc_library_static {
1409 name: "libbaz",
1410 srcs: ["mylib.cpp"],
1411 system_shared_libs: [],
1412 stl: "none",
1413 apex_available: [ "myapex2" ],
1414 }
1415
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416 `)
1417
Jooyung Hana0503a52023-08-23 13:12:50 +09001418 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419 copyCmds := apexRule.Args["copy_commands"]
1420
1421 // Ensure that direct non-stubs dep is always included
1422 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1423
1424 // Ensure that indirect stubs dep is not included
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1426
1427 // Ensure that dependency of stubs is not included
1428 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1429
Colin Crossaede88c2020-08-11 12:17:01 -07001430 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001431
1432 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001433 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001434 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001436
Jiyong Park3ff16992019-12-27 14:11:47 +09001437 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001438
1439 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1440 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001441
Colin Crossf61d03d2023-11-02 16:56:39 -07001442 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1443 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001444 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001445
Colin Crossf61d03d2023-11-02 16:56:39 -07001446 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1447 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001448 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001449}
1450
Jooyung Hand3639552019-08-09 12:57:43 +09001451func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001452 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001453 /*
1454 myapex
1455 |
1456 v (runtime_libs)
1457 mylib ------+------> libfoo [provides stub]
1458 |
1459 `------> libbar
1460 */
Colin Cross1c460562021-02-16 17:55:47 -08001461 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001462 apex {
1463 name: "myapex",
1464 key: "myapex.key",
1465 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001466 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001467 }
1468
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474
1475 cc_library {
1476 name: "mylib",
1477 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001478 static_libs: ["libstatic"],
1479 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001480 runtime_libs: ["libfoo", "libbar"],
1481 system_shared_libs: [],
1482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001483 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001484 }
1485
1486 cc_library {
1487 name: "libfoo",
1488 srcs: ["mylib.cpp"],
1489 system_shared_libs: [],
1490 stl: "none",
1491 stubs: {
1492 versions: ["10", "20", "30"],
1493 },
1494 }
1495
1496 cc_library {
1497 name: "libbar",
1498 srcs: ["mylib.cpp"],
1499 system_shared_libs: [],
1500 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001501 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001502 }
1503
Liz Kammer5f108fa2023-05-11 14:33:17 -04001504 cc_library {
1505 name: "libstatic",
1506 srcs: ["mylib.cpp"],
1507 system_shared_libs: [],
1508 stl: "none",
1509 apex_available: [ "myapex" ],
1510 runtime_libs: ["libstatic_to_runtime"],
1511 }
1512
1513 cc_library {
1514 name: "libshared",
1515 srcs: ["mylib.cpp"],
1516 system_shared_libs: [],
1517 stl: "none",
1518 apex_available: [ "myapex" ],
1519 runtime_libs: ["libshared_to_runtime"],
1520 }
1521
1522 cc_library {
1523 name: "libstatic_to_runtime",
1524 srcs: ["mylib.cpp"],
1525 system_shared_libs: [],
1526 stl: "none",
1527 apex_available: [ "myapex" ],
1528 }
1529
1530 cc_library {
1531 name: "libshared_to_runtime",
1532 srcs: ["mylib.cpp"],
1533 system_shared_libs: [],
1534 stl: "none",
1535 apex_available: [ "myapex" ],
1536 }
Jooyung Hand3639552019-08-09 12:57:43 +09001537 `)
1538
Jooyung Hana0503a52023-08-23 13:12:50 +09001539 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001540 copyCmds := apexRule.Args["copy_commands"]
1541
1542 // Ensure that direct non-stubs dep is always included
1543 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1544
1545 // Ensure that indirect stubs dep is not included
1546 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1547
1548 // Ensure that runtime_libs dep in included
1549 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001550 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1551 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1552
1553 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001554
Jooyung Hana0503a52023-08-23 13:12:50 +09001555 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001556 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1557 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001558}
1559
Paul Duffina02cae32021-03-09 01:44:06 +00001560var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1561 cc.PrepareForTestWithCcBuildComponents,
1562 PrepareForTestWithApexBuildComponents,
1563 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001564 apex {
1565 name: "com.android.runtime",
1566 key: "com.android.runtime.key",
1567 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001568 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569 }
1570
1571 apex_key {
1572 name: "com.android.runtime.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
Paul Duffina02cae32021-03-09 01:44:06 +00001576 `),
1577 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1578)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001579
Paul Duffina02cae32021-03-09 01:44:06 +00001580func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001581 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001582 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 cc_library {
1584 name: "libc",
1585 no_libcrt: true,
1586 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001587 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 stl: "none",
1589 system_shared_libs: [],
1590 stubs: { versions: ["1"] },
1591 apex_available: ["com.android.runtime"],
1592
1593 sanitize: {
1594 hwaddress: true,
1595 }
1596 }
1597
1598 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001599 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 no_libcrt: true,
1601 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001602 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001603 stl: "none",
1604 system_shared_libs: [],
1605 srcs: [""],
1606 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001607 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001608
1609 sanitize: {
1610 never: true,
1611 },
Spandan Das4de7b492023-05-05 21:13:01 +00001612 apex_available: [
1613 "//apex_available:anyapex",
1614 "//apex_available:platform",
1615 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001616 } `)
1617 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001618
Jooyung Hana0503a52023-08-23 13:12:50 +09001619 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001620 "lib64/bionic/libc.so",
1621 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1622 })
1623
Colin Cross4c4c1be2022-02-10 11:41:18 -08001624 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625
1626 installed := hwasan.Description("install libclang_rt.hwasan")
1627 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1628
1629 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1630 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1631 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1632}
1633
1634func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001635 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001636 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001637 prepareForTestOfRuntimeApexWithHwasan,
1638 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1639 variables.SanitizeDevice = []string{"hwaddress"}
1640 }),
1641 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001642 cc_library {
1643 name: "libc",
1644 no_libcrt: true,
1645 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001646 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001647 stl: "none",
1648 system_shared_libs: [],
1649 stubs: { versions: ["1"] },
1650 apex_available: ["com.android.runtime"],
1651 }
1652
1653 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001654 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001655 no_libcrt: true,
1656 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001657 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001658 stl: "none",
1659 system_shared_libs: [],
1660 srcs: [""],
1661 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001662 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001663
1664 sanitize: {
1665 never: true,
1666 },
Spandan Das4de7b492023-05-05 21:13:01 +00001667 apex_available: [
1668 "//apex_available:anyapex",
1669 "//apex_available:platform",
1670 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001671 }
Paul Duffina02cae32021-03-09 01:44:06 +00001672 `)
1673 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001674
Jooyung Hana0503a52023-08-23 13:12:50 +09001675 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001676 "lib64/bionic/libc.so",
1677 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1678 })
1679
Colin Cross4c4c1be2022-02-10 11:41:18 -08001680 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001681
1682 installed := hwasan.Description("install libclang_rt.hwasan")
1683 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1684
1685 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1686 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1687 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1688}
1689
Jooyung Han61b66e92020-03-21 14:21:46 +00001690func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001691 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 testcases := []struct {
1693 name string
1694 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001695 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001696 shouldLink string
1697 shouldNotLink []string
1698 }{
1699 {
Jiyong Park55549df2021-02-26 23:57:23 +09001700 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001701 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001702 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001703 shouldLink: "current",
1704 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001705 },
1706 {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001708 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001709 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001710 shouldLink: "current",
1711 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 },
1713 }
1714 for _, tc := range testcases {
1715 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001716 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001717 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 apex {
1719 name: "myapex",
1720 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001722 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001723 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001725
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001731
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 cc_library {
1733 name: "mylib",
1734 srcs: ["mylib.cpp"],
1735 vendor_available: true,
1736 shared_libs: ["libbar"],
1737 system_shared_libs: [],
1738 stl: "none",
1739 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001740 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001741 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001742
Jooyung Han61b66e92020-03-21 14:21:46 +00001743 cc_library {
1744 name: "libbar",
1745 srcs: ["mylib.cpp"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001749 llndk: {
1750 symbol_file: "libbar.map.txt",
1751 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001752 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001753 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001754 withUnbundledBuild,
1755 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001756
Jooyung Han61b66e92020-03-21 14:21:46 +00001757 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001758 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 "lib64/mylib.so",
1760 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001763 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001764 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1765 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001766
Steven Moreland2c4000c2021-04-27 02:08:49 +00001767 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1768 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001769 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001770 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001771 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001772
Steven Moreland2c4000c2021-04-27 02:08:49 +00001773 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001774 ver := tc.shouldLink
1775 if tc.shouldLink == "current" {
1776 ver = strconv.Itoa(android.FutureApiLevelInt)
1777 }
1778 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001779 })
1780 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001781}
1782
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001785 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 apex {
1787 name: "myapex",
1788 key: "myapex.key",
1789 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001790 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 }
1792
1793 apex_key {
1794 name: "myapex.key",
1795 public_key: "testkey.avbpubkey",
1796 private_key: "testkey.pem",
1797 }
1798
1799 cc_library {
1800 name: "mylib",
1801 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001802 system_shared_libs: ["libc"],
1803 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001805 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806 }
1807
1808 cc_library_shared {
1809 name: "mylib_shared",
1810 srcs: ["mylib.cpp"],
1811 shared_libs: ["libdl#27"],
1812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001813 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814 }
1815
1816 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001817 name: "libBootstrap",
1818 srcs: ["mylib.cpp"],
1819 stl: "none",
1820 bootstrap: true,
1821 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 `)
1823
Jooyung Hana0503a52023-08-23 13:12:50 +09001824 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001825 copyCmds := apexRule.Args["copy_commands"]
1826
1827 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001828 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001829 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1830 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831
1832 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001833 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001834
Colin Crossaede88c2020-08-11 12:17:01 -07001835 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1836 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1837 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001838
1839 // For dependency to libc
1840 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001842 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001843 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001844 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001845 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1846 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001847
1848 // For dependency to libm
1849 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001850 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001851 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001852 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001853 // ... and is not compiling with the stub
1854 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1855 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1856
1857 // For dependency to libdl
1858 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001859 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001860 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001861 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1862 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001863 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001864 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001865 // ... Cflags from stub is correctly exported to mylib
1866 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1867 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001868
1869 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001870 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1871 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1872 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1873 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001874}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001877 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001878 // there are three links between liba --> libz.
1879 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001880 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001881 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001882 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001883 apex {
1884 name: "myapex",
1885 key: "myapex.key",
1886 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001887 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001888 }
1889
1890 apex {
1891 name: "otherapex",
1892 key: "myapex.key",
1893 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001894 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001895 }
1896
1897 apex_key {
1898 name: "myapex.key",
1899 public_key: "testkey.avbpubkey",
1900 private_key: "testkey.pem",
1901 }
1902
1903 cc_library {
1904 name: "libx",
1905 shared_libs: ["liba"],
1906 system_shared_libs: [],
1907 stl: "none",
1908 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001909 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001910 }
1911
1912 cc_library {
1913 name: "liby",
1914 shared_libs: ["liba"],
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001918 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001919 }
1920
1921 cc_library {
1922 name: "liba",
1923 shared_libs: ["libz"],
1924 system_shared_libs: [],
1925 stl: "none",
1926 apex_available: [
1927 "//apex_available:anyapex",
1928 "//apex_available:platform",
1929 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001930 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001931 }
1932
1933 cc_library {
1934 name: "libz",
1935 system_shared_libs: [],
1936 stl: "none",
1937 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001938 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001939 },
1940 }
Jooyung Han749dc692020-04-15 11:03:39 +09001941 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001942
1943 expectLink := func(from, from_variant, to, to_variant string) {
1944 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1945 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1946 }
1947 expectNoLink := func(from, from_variant, to, to_variant string) {
1948 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1949 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1950 }
1951 // platform liba is linked to non-stub version
1952 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001953 // liba in myapex is linked to current
1954 expectLink("liba", "shared_apex29", "libz", "shared_current")
1955 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001956 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001957 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001958 // liba in otherapex is linked to current
1959 expectLink("liba", "shared_apex30", "libz", "shared_current")
1960 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001961 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1962 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001963}
1964
Jooyung Hanaed150d2020-04-02 01:41:41 +09001965func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001967 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 apex {
1969 name: "myapex",
1970 key: "myapex.key",
1971 native_shared_libs: ["libx"],
1972 min_sdk_version: "R",
1973 }
1974
1975 apex_key {
1976 name: "myapex.key",
1977 public_key: "testkey.avbpubkey",
1978 private_key: "testkey.pem",
1979 }
1980
1981 cc_library {
1982 name: "libx",
1983 shared_libs: ["libz"],
1984 system_shared_libs: [],
1985 stl: "none",
1986 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001987 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001988 }
1989
1990 cc_library {
1991 name: "libz",
1992 system_shared_libs: [],
1993 stl: "none",
1994 stubs: {
1995 versions: ["29", "R"],
1996 },
1997 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001998 `,
1999 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2000 variables.Platform_version_active_codenames = []string{"R"}
2001 }),
2002 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002003
2004 expectLink := func(from, from_variant, to, to_variant string) {
2005 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2006 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2007 }
2008 expectNoLink := func(from, from_variant, to, to_variant string) {
2009 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2010 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2011 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002012 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2013 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002014 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2015 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002016}
2017
Jooyung Han4c4da062021-06-23 10:23:16 +09002018func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002019 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002020 testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 java_libs: ["libx"],
2025 min_sdk_version: "S",
2026 }
2027
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033
2034 java_library {
2035 name: "libx",
2036 srcs: ["a.java"],
2037 apex_available: [ "myapex" ],
2038 sdk_version: "current",
2039 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002040 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002041 }
2042 `,
2043 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2044 variables.Platform_version_active_codenames = []string{"S"}
2045 variables.Platform_sdk_codename = proptools.StringPtr("S")
2046 }),
2047 )
2048}
2049
Jooyung Han749dc692020-04-15 11:03:39 +09002050func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002051 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002052 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002057 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002058 }
2059
2060 apex_key {
2061 name: "myapex.key",
2062 public_key: "testkey.avbpubkey",
2063 private_key: "testkey.pem",
2064 }
2065
2066 cc_library {
2067 name: "libx",
2068 shared_libs: ["libz"],
2069 system_shared_libs: [],
2070 stl: "none",
2071 apex_available: [ "myapex" ],
2072 }
2073
2074 cc_library {
2075 name: "libz",
2076 system_shared_libs: [],
2077 stl: "none",
2078 stubs: {
2079 versions: ["1", "2"],
2080 },
2081 }
2082 `)
2083
2084 expectLink := func(from, from_variant, to, to_variant string) {
2085 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2086 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2087 }
2088 expectNoLink := func(from, from_variant, to, to_variant string) {
2089 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2090 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2091 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002092 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002093 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002094 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002095 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002096}
2097
Jooyung Handfc864c2023-03-20 18:19:07 +09002098func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002099 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 ctx := testApex(t, `
2101 apex {
2102 name: "myapex",
2103 key: "myapex.key",
2104 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002105 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002106 vendor: true,
2107 min_sdk_version: "29",
2108 }
2109
2110 apex_key {
2111 name: "myapex.key",
2112 public_key: "testkey.avbpubkey",
2113 private_key: "testkey.pem",
2114 }
2115
2116 cc_library {
2117 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002118 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002119 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002120 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002121 shared_libs: ["libbar"],
2122 }
2123
2124 cc_library {
2125 name: "libbar",
2126 stubs: { versions: ["29", "30"] },
2127 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002128 }
2129 `)
2130
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002131 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002132
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002133 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002134
2135 // Ensure that mylib links with "current" LLNDK
2136 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002137 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002138
2139 // Ensure that mylib is targeting 29
2140 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2141 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2142
2143 // Ensure that the correct variant of crtbegin_so is used.
2144 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2145 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002146
2147 // Ensure that the crtbegin_so used by the APEX is targeting 29
2148 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2149 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2150}
2151
Jooyung Han4495f842023-04-25 16:39:59 +09002152func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002153 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002154 ctx := testApex(t, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 updatable: true,
2159 native_shared_libs: [
2160 "mylib",
2161 "yourlib",
2162 ],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex {
2167 name: "myapex2",
2168 key: "myapex.key",
2169 updatable: false,
2170 native_shared_libs: ["yourlib"],
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "mylib",
2181 srcs: ["mylib.cpp"],
2182 shared_libs: ["libbar"],
2183 min_sdk_version: "29",
2184 apex_available: ["myapex"],
2185 }
2186
2187 cc_library {
2188 name: "libbar",
2189 stubs: { versions: ["29", "30"] },
2190 }
2191
2192 cc_library {
2193 name: "yourlib",
2194 srcs: ["mylib.cpp"],
2195 min_sdk_version: "29",
2196 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2197 }
2198 `, withFiles(android.MockFS{
2199 "packages/modules/common/build/allowed_deps.txt": nil,
2200 }))
2201
2202 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2203 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2204 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002205 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002206 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002207 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002208
Jooyung Hana0503a52023-08-23 13:12:50 +09002209 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002210 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2211 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002212 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2213 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2214 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2215 flatlist, "mylib:(minSdkVersion:29)")
2216 android.AssertStringListContains(t, "track platform-available lib",
2217 flatlist, "yourlib(minSdkVersion:29)")
2218}
2219
Nouby Mohamed8609a552024-09-04 22:19:51 +00002220func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002221 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002222 ctx := testApex(t, `
2223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
2226 updatable: true,
2227 native_shared_libs: [
2228 "mylib",
2229 "yourlib",
2230 ],
2231 min_sdk_version: "29",
2232 }
2233
2234 apex {
2235 name: "myapex2",
2236 key: "myapex.key",
2237 updatable: false,
2238 native_shared_libs: ["yourlib"],
2239 }
2240
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246
2247 cc_library {
2248 name: "mylib",
2249 srcs: ["mylib.cpp"],
2250 shared_libs: ["libbar"],
2251 min_sdk_version: "29",
2252 apex_available: ["myapex"],
2253 }
2254
2255 cc_library {
2256 name: "libbar",
2257 stubs: { versions: ["29", "30"] },
2258 }
2259
2260 cc_library {
2261 name: "yourlib",
2262 srcs: ["mylib.cpp"],
2263 min_sdk_version: "29",
2264 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2265 }
2266 `, withFiles(android.MockFS{
2267 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2268 }),
2269 android.FixtureModifyProductVariables(
2270 func(variables android.FixtureProductVariables) {
2271 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2272 },
2273 ))
2274
2275 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2276 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2277 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2278 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2279 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2280 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2281
2282 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2283 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2284 myapex.Output("depsinfo/flatlist.txt")), "\n")
2285 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2286 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2287 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2288 flatlist, "mylib:(minSdkVersion:29)")
2289 android.AssertStringListContains(t, "track platform-available lib",
2290 flatlist, "yourlib(minSdkVersion:29)")
2291}
2292
2293func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002294 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002295 ctx := testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 updatable: true,
2300 native_shared_libs: [
2301 "mylib",
2302 "yourlib",
2303 ],
2304 min_sdk_version: "29",
2305 }
2306
2307 apex {
2308 name: "myapex2",
2309 key: "myapex.key",
2310 updatable: false,
2311 native_shared_libs: ["yourlib"],
2312 }
2313
2314 apex_key {
2315 name: "myapex.key",
2316 public_key: "testkey.avbpubkey",
2317 private_key: "testkey.pem",
2318 }
2319
2320 cc_library {
2321 name: "mylib",
2322 srcs: ["mylib.cpp"],
2323 shared_libs: ["libbar"],
2324 min_sdk_version: "29",
2325 apex_available: ["myapex"],
2326 }
2327
2328 cc_library {
2329 name: "libbar",
2330 stubs: { versions: ["29", "30"] },
2331 }
2332
2333 cc_library {
2334 name: "yourlib",
2335 srcs: ["mylib.cpp"],
2336 min_sdk_version: "29",
2337 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2338 }
2339 `, withFiles(android.MockFS{
2340 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2341 "packages/modules/common/build/allowed_deps.txt": nil,
2342 }),
2343 android.FixtureModifyProductVariables(
2344 func(variables android.FixtureProductVariables) {
2345 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2346 },
2347 ))
2348
2349 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2350 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2351 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2352 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2353 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2354 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2355
2356 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2357 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2358 myapex.Output("depsinfo/flatlist.txt")), "\n")
2359 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2360 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2361 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2362 flatlist, "mylib:(minSdkVersion:29)")
2363 android.AssertStringListContains(t, "track platform-available lib",
2364 flatlist, "yourlib(minSdkVersion:29)")
2365}
2366
Jooyung Han4495f842023-04-25 16:39:59 +09002367func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002368 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002369 ctx := testApex(t, `
2370 apex {
2371 name: "myapex",
2372 key: "myapex.key",
2373 updatable: true,
2374 min_sdk_version: "29",
2375 }
2376
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382 `)
2383 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2384 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2385 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2386 }
2387}
2388
Jooyung Han03b51852020-02-26 22:45:42 +09002389func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002390 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002391 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002396 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002397 }
2398
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404
2405 cc_library {
2406 name: "libx",
2407 system_shared_libs: [],
2408 stl: "none",
2409 apex_available: [ "myapex" ],
2410 stubs: {
2411 versions: ["1", "2"],
2412 },
2413 }
2414
2415 cc_library {
2416 name: "libz",
2417 shared_libs: ["libx"],
2418 system_shared_libs: [],
2419 stl: "none",
2420 }
2421 `)
2422
2423 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002424 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2426 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2427 }
2428 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002429 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002430 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2431 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2432 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002433 expectLink("libz", "shared", "libx", "shared_current")
2434 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002435 expectNoLink("libz", "shared", "libz", "shared_1")
2436 expectNoLink("libz", "shared", "libz", "shared")
2437}
2438
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002439var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2440 func(variables android.FixtureProductVariables) {
2441 variables.SanitizeDevice = []string{"hwaddress"}
2442 },
2443)
2444
Jooyung Han75568392020-03-20 04:29:24 +09002445func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002446 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002447 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 native_shared_libs: ["libx"],
2452 min_sdk_version: "29",
2453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "libx",
2463 shared_libs: ["libbar"],
2464 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002465 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002466 }
2467
2468 cc_library {
2469 name: "libbar",
2470 stubs: {
2471 versions: ["29", "30"],
2472 },
2473 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002474 `,
2475 prepareForTestWithSantitizeHwaddress,
2476 )
Jooyung Han03b51852020-02-26 22:45:42 +09002477 expectLink := func(from, from_variant, to, to_variant string) {
2478 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2479 libFlags := ld.Args["libFlags"]
2480 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2481 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002482 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002483}
2484
Jooyung Han75568392020-03-20 04:29:24 +09002485func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002486 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002487 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002488 apex {
2489 name: "myapex",
2490 key: "myapex.key",
2491 native_shared_libs: ["libx"],
2492 min_sdk_version: "29",
2493 }
2494
2495 apex_key {
2496 name: "myapex.key",
2497 public_key: "testkey.avbpubkey",
2498 private_key: "testkey.pem",
2499 }
2500
2501 cc_library {
2502 name: "libx",
2503 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002504 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002505 }
Jooyung Han75568392020-03-20 04:29:24 +09002506 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002507
2508 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002509 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002510 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002511 // note that platform variant is not.
2512 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002513 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002514}
2515
Jooyung Han749dc692020-04-15 11:03:39 +09002516func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002517 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002518 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002522 native_shared_libs: ["mylib"],
2523 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002524 }
2525
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
Jooyung Han749dc692020-04-15 11:03:39 +09002531
2532 cc_library {
2533 name: "mylib",
2534 srcs: ["mylib.cpp"],
2535 system_shared_libs: [],
2536 stl: "none",
2537 apex_available: [
2538 "myapex",
2539 ],
2540 min_sdk_version: "30",
2541 }
2542 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002543
2544 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2545 apex {
2546 name: "myapex",
2547 key: "myapex.key",
2548 native_shared_libs: ["libfoo.ffi"],
2549 min_sdk_version: "29",
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
2558 rust_ffi_shared {
2559 name: "libfoo.ffi",
2560 srcs: ["foo.rs"],
2561 crate_name: "foo",
2562 apex_available: [
2563 "myapex",
2564 ],
2565 min_sdk_version: "30",
2566 }
2567 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002568
2569 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2570 apex {
2571 name: "myapex",
2572 key: "myapex.key",
2573 java_libs: ["libfoo"],
2574 min_sdk_version: "29",
2575 }
2576
2577 apex_key {
2578 name: "myapex.key",
2579 public_key: "testkey.avbpubkey",
2580 private_key: "testkey.pem",
2581 }
2582
2583 java_import {
2584 name: "libfoo",
2585 jars: ["libfoo.jar"],
2586 apex_available: [
2587 "myapex",
2588 ],
2589 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002590 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002591 }
2592 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002593
2594 // Skip check for modules compiling against core API surface
2595 testApex(t, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 java_libs: ["libfoo"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 java_library {
2610 name: "libfoo",
2611 srcs: ["Foo.java"],
2612 apex_available: [
2613 "myapex",
2614 ],
2615 // Compile against core API surface
2616 sdk_version: "core_current",
2617 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002618 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002619 }
2620 `)
2621
Jooyung Han749dc692020-04-15 11:03:39 +09002622}
2623
2624func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002625 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002626 testApex(t, `
2627 apex {
2628 name: "myapex",
2629 key: "myapex.key",
2630 native_shared_libs: ["libfoo"],
2631 java_libs: ["libbar"],
2632 min_sdk_version: "29",
2633 }
2634
2635 apex_key {
2636 name: "myapex.key",
2637 public_key: "testkey.avbpubkey",
2638 private_key: "testkey.pem",
2639 }
2640
2641 cc_library {
2642 name: "libfoo",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["libfoo_dep"],
2645 apex_available: ["myapex"],
2646 min_sdk_version: "29",
2647 }
2648
2649 cc_library {
2650 name: "libfoo_dep",
2651 srcs: ["mylib.cpp"],
2652 apex_available: ["myapex"],
2653 min_sdk_version: "29",
2654 }
2655
2656 java_library {
2657 name: "libbar",
2658 sdk_version: "current",
2659 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002660 static_libs: [
2661 "libbar_dep",
2662 "libbar_import_dep",
2663 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002664 apex_available: ["myapex"],
2665 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002666 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002667 }
2668
2669 java_library {
2670 name: "libbar_dep",
2671 sdk_version: "current",
2672 srcs: ["a.java"],
2673 apex_available: ["myapex"],
2674 min_sdk_version: "29",
2675 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002676
2677 java_import {
2678 name: "libbar_import_dep",
2679 jars: ["libbar.jar"],
2680 apex_available: ["myapex"],
2681 min_sdk_version: "29",
2682 }
Jooyung Han03b51852020-02-26 22:45:42 +09002683 `)
2684}
2685
Colin Cross8ca61c12022-10-06 21:00:14 -07002686func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002687 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002688 // Tests that an apex dependency with min_sdk_version higher than the
2689 // min_sdk_version of the apex is allowed as long as the dependency's
2690 // min_sdk_version is less than or equal to the api level that the
2691 // architecture was introduced in. In this case, arm64 didn't exist
2692 // until api level 21, so the arm64 code will never need to run on
2693 // an api level 20 device, even if other architectures of the apex
2694 // will.
2695 testApex(t, `
2696 apex {
2697 name: "myapex",
2698 key: "myapex.key",
2699 native_shared_libs: ["libfoo"],
2700 min_sdk_version: "20",
2701 }
2702
2703 apex_key {
2704 name: "myapex.key",
2705 public_key: "testkey.avbpubkey",
2706 private_key: "testkey.pem",
2707 }
2708
2709 cc_library {
2710 name: "libfoo",
2711 srcs: ["mylib.cpp"],
2712 apex_available: ["myapex"],
2713 min_sdk_version: "21",
2714 stl: "none",
2715 }
2716 `)
2717}
2718
Artur Satayev8cf899a2020-04-15 17:29:42 +01002719func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002720 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002721 testCases := []struct {
2722 name string
2723 expectedError string
2724 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002725 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002726 }{
2727 {
2728 name: "Non-updatable apex with non-stable dep",
2729 bp: `
2730 apex {
2731 name: "myapex",
2732 java_libs: ["myjar"],
2733 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002734 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002735 }
2736 apex_key {
2737 name: "myapex.key",
2738 public_key: "testkey.avbpubkey",
2739 private_key: "testkey.pem",
2740 }
2741 java_library {
2742 name: "myjar",
2743 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002744 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002745 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002746 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002747 }
2748 `,
2749 },
2750 {
2751 name: "Updatable apex with stable dep",
2752 bp: `
2753 apex {
2754 name: "myapex",
2755 java_libs: ["myjar"],
2756 key: "myapex.key",
2757 updatable: true,
2758 min_sdk_version: "29",
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765 java_library {
2766 name: "myjar",
2767 srcs: ["foo/bar/MyClass.java"],
2768 sdk_version: "current",
2769 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002770 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002771 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002772 }
2773 `,
2774 },
2775 {
2776 name: "Updatable apex with non-stable dep",
2777 expectedError: "cannot depend on \"myjar\"",
2778 bp: `
2779 apex {
2780 name: "myapex",
2781 java_libs: ["myjar"],
2782 key: "myapex.key",
2783 updatable: true,
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 java_library {
2791 name: "myjar",
2792 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002793 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002794 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002795 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002796 }
2797 `,
2798 },
2799 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 name: "Updatable apex with non-stable legacy core platform dep",
2801 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2802 bp: `
2803 apex {
2804 name: "myapex",
2805 java_libs: ["myjar-uses-legacy"],
2806 key: "myapex.key",
2807 updatable: true,
2808 }
2809 apex_key {
2810 name: "myapex.key",
2811 public_key: "testkey.avbpubkey",
2812 private_key: "testkey.pem",
2813 }
2814 java_library {
2815 name: "myjar-uses-legacy",
2816 srcs: ["foo/bar/MyClass.java"],
2817 sdk_version: "core_platform",
2818 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002819 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002820 }
2821 `,
2822 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2823 },
2824 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002825 name: "Updatable apex with non-stable transitive dep",
2826 // This is not actually detecting that the transitive dependency is unstable, rather it is
2827 // detecting that the transitive dependency is building against a wider API surface than the
2828 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002829 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002830 bp: `
2831 apex {
2832 name: "myapex",
2833 java_libs: ["myjar"],
2834 key: "myapex.key",
2835 updatable: true,
2836 }
2837 apex_key {
2838 name: "myapex.key",
2839 public_key: "testkey.avbpubkey",
2840 private_key: "testkey.pem",
2841 }
2842 java_library {
2843 name: "myjar",
2844 srcs: ["foo/bar/MyClass.java"],
2845 sdk_version: "current",
2846 apex_available: ["myapex"],
2847 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002848 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
2850 java_library {
2851 name: "transitive-jar",
2852 srcs: ["foo/bar/MyClass.java"],
2853 sdk_version: "core_platform",
2854 apex_available: ["myapex"],
2855 }
2856 `,
2857 },
2858 }
2859
2860 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002861 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2862 continue
2863 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002864 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002865 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002866 errorHandler := android.FixtureExpectsNoErrors
2867 if test.expectedError != "" {
2868 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002869 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002870 android.GroupFixturePreparers(
2871 java.PrepareForTestWithJavaDefaultModules,
2872 PrepareForTestWithApexBuildComponents,
2873 prepareForTestWithMyapex,
2874 android.OptionalFixturePreparer(test.preparer),
2875 ).
2876 ExtendWithErrorHandler(errorHandler).
2877 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002878 })
2879 }
2880}
2881
Jooyung Han749dc692020-04-15 11:03:39 +09002882func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2883 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2884 apex {
2885 name: "myapex",
2886 key: "myapex.key",
2887 native_shared_libs: ["mylib"],
2888 min_sdk_version: "29",
2889 }
2890
2891 apex_key {
2892 name: "myapex.key",
2893 public_key: "testkey.avbpubkey",
2894 private_key: "testkey.pem",
2895 }
2896
2897 cc_library {
2898 name: "mylib",
2899 srcs: ["mylib.cpp"],
2900 shared_libs: ["mylib2"],
2901 system_shared_libs: [],
2902 stl: "none",
2903 apex_available: [
2904 "myapex",
2905 ],
2906 min_sdk_version: "29",
2907 }
2908
2909 // indirect part of the apex
2910 cc_library {
2911 name: "mylib2",
2912 srcs: ["mylib.cpp"],
2913 system_shared_libs: [],
2914 stl: "none",
2915 apex_available: [
2916 "myapex",
2917 ],
2918 min_sdk_version: "30",
2919 }
2920 `)
2921}
2922
2923func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002924 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002925 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 apps: ["AppFoo"],
2930 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002931 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939
2940 android_app {
2941 name: "AppFoo",
2942 srcs: ["foo/bar/MyClass.java"],
2943 sdk_version: "current",
2944 min_sdk_version: "29",
2945 system_modules: "none",
2946 stl: "none",
2947 static_libs: ["bar"],
2948 apex_available: [ "myapex" ],
2949 }
2950
2951 java_library {
2952 name: "bar",
2953 sdk_version: "current",
2954 srcs: ["a.java"],
2955 apex_available: [ "myapex" ],
2956 }
2957 `)
2958}
2959
2960func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002961 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002962 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002963 apex {
2964 name: "myapex",
2965 key: "myapex.key",
2966 native_shared_libs: ["mylib"],
2967 min_sdk_version: "29",
2968 }
2969
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }
2975
Colin Crossea91a172024-11-05 16:14:05 -08002976 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002977 cc_library {
2978 name: "mylib",
2979 srcs: ["mylib.cpp"],
2980 shared_libs: ["mylib2"],
2981 system_shared_libs: [],
2982 stl: "none",
2983 apex_available: ["myapex", "otherapex"],
2984 min_sdk_version: "29",
2985 }
2986
2987 cc_library {
2988 name: "mylib2",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 apex_available: ["otherapex"],
2993 stubs: { versions: ["29", "30"] },
2994 min_sdk_version: "30",
2995 }
2996
2997 apex {
2998 name: "otherapex",
2999 key: "myapex.key",
3000 native_shared_libs: ["mylib", "mylib2"],
3001 min_sdk_version: "30",
3002 }
3003 `)
3004 expectLink := func(from, from_variant, to, to_variant string) {
3005 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3006 libFlags := ld.Args["libFlags"]
3007 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3008 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003009 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003010 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003011}
3012
Jooyung Haned124c32021-01-26 11:43:46 +09003013func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003014 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003015 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3016 func(variables android.FixtureProductVariables) {
3017 variables.Platform_sdk_codename = proptools.StringPtr("S")
3018 variables.Platform_version_active_codenames = []string{"S"}
3019 },
3020 )
Jooyung Haned124c32021-01-26 11:43:46 +09003021 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3022 apex {
3023 name: "myapex",
3024 key: "myapex.key",
3025 native_shared_libs: ["libfoo"],
3026 min_sdk_version: "S",
3027 }
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033 cc_library {
3034 name: "libfoo",
3035 shared_libs: ["libbar"],
3036 apex_available: ["myapex"],
3037 min_sdk_version: "29",
3038 }
3039 cc_library {
3040 name: "libbar",
3041 apex_available: ["myapex"],
3042 }
3043 `, withSAsActiveCodeNames)
3044}
3045
3046func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003047 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003048 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3049 variables.Platform_sdk_codename = proptools.StringPtr("S")
3050 variables.Platform_version_active_codenames = []string{"S", "T"}
3051 })
Colin Cross1c460562021-02-16 17:55:47 -08003052 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003053 apex {
3054 name: "myapex",
3055 key: "myapex.key",
3056 native_shared_libs: ["libfoo"],
3057 min_sdk_version: "S",
3058 }
3059 apex_key {
3060 name: "myapex.key",
3061 public_key: "testkey.avbpubkey",
3062 private_key: "testkey.pem",
3063 }
3064 cc_library {
3065 name: "libfoo",
3066 shared_libs: ["libbar"],
3067 apex_available: ["myapex"],
3068 min_sdk_version: "S",
3069 }
3070 cc_library {
3071 name: "libbar",
3072 stubs: {
3073 symbol_file: "libbar.map.txt",
3074 versions: ["30", "S", "T"],
3075 },
3076 }
3077 `, withSAsActiveCodeNames)
3078
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003079 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003080 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3081 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003082 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003083}
3084
Jiyong Park7c2ee712018-12-07 00:42:25 +09003085func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003087 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003088 apex {
3089 name: "myapex",
3090 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003091 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003092 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003093 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003094 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003095 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003096 }
3097
3098 apex_key {
3099 name: "myapex.key",
3100 public_key: "testkey.avbpubkey",
3101 private_key: "testkey.pem",
3102 }
3103
3104 prebuilt_etc {
3105 name: "myetc",
3106 src: "myprebuilt",
3107 sub_dir: "foo/bar",
3108 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003109
3110 cc_library {
3111 name: "mylib",
3112 srcs: ["mylib.cpp"],
3113 relative_install_path: "foo/bar",
3114 system_shared_libs: [],
3115 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003116 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003117 }
3118
3119 cc_binary {
3120 name: "mybin",
3121 srcs: ["mylib.cpp"],
3122 relative_install_path: "foo/bar",
3123 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003125 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003126 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003127
3128 rust_binary {
3129 name: "mybin.rust",
3130 srcs: ["foo.rs"],
3131 relative_install_path: "rust_subdir",
3132 apex_available: [ "myapex" ],
3133 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003134 `)
3135
Jooyung Hana0503a52023-08-23 13:12:50 +09003136 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003137 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003138
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003139 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003140 ensureContains(t, cmd, "/etc ")
3141 ensureContains(t, cmd, "/etc/foo ")
3142 ensureContains(t, cmd, "/etc/foo/bar ")
3143 ensureContains(t, cmd, "/lib64 ")
3144 ensureContains(t, cmd, "/lib64/foo ")
3145 ensureContains(t, cmd, "/lib64/foo/bar ")
3146 ensureContains(t, cmd, "/lib ")
3147 ensureContains(t, cmd, "/lib/foo ")
3148 ensureContains(t, cmd, "/lib/foo/bar ")
3149 ensureContains(t, cmd, "/bin ")
3150 ensureContains(t, cmd, "/bin/foo ")
3151 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003152 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003153}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003154
Jooyung Han35155c42020-02-06 17:33:20 +09003155func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003156 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003157 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003158 apex {
3159 name: "myapex",
3160 key: "myapex.key",
3161 multilib: {
3162 both: {
3163 native_shared_libs: ["mylib"],
3164 binaries: ["mybin"],
3165 },
3166 },
3167 compile_multilib: "both",
3168 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003169 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003170 }
3171
3172 apex_key {
3173 name: "myapex.key",
3174 public_key: "testkey.avbpubkey",
3175 private_key: "testkey.pem",
3176 }
3177
3178 cc_library {
3179 name: "mylib",
3180 relative_install_path: "foo/bar",
3181 system_shared_libs: [],
3182 stl: "none",
3183 apex_available: [ "myapex" ],
3184 native_bridge_supported: true,
3185 }
3186
3187 cc_binary {
3188 name: "mybin",
3189 relative_install_path: "foo/bar",
3190 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003191 stl: "none",
3192 apex_available: [ "myapex" ],
3193 native_bridge_supported: true,
3194 compile_multilib: "both", // default is "first" for binary
3195 multilib: {
3196 lib64: {
3197 suffix: "64",
3198 },
3199 },
3200 }
3201 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003202 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003203 "bin/foo/bar/mybin",
3204 "bin/foo/bar/mybin64",
3205 "bin/arm/foo/bar/mybin",
3206 "bin/arm64/foo/bar/mybin64",
3207 "lib/foo/bar/mylib.so",
3208 "lib/arm/foo/bar/mylib.so",
3209 "lib64/foo/bar/mylib.so",
3210 "lib64/arm64/foo/bar/mylib.so",
3211 })
3212}
3213
Jooyung Han85d61762020-06-24 23:50:26 +09003214func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003215 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003216 result := android.GroupFixturePreparers(
3217 prepareForApexTest,
3218 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3219 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003220 apex {
3221 name: "myapex",
3222 key: "myapex.key",
3223 binaries: ["mybin"],
3224 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003225 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003226 }
3227 apex_key {
3228 name: "myapex.key",
3229 public_key: "testkey.avbpubkey",
3230 private_key: "testkey.pem",
3231 }
3232 cc_binary {
3233 name: "mybin",
3234 vendor: true,
3235 shared_libs: ["libfoo"],
3236 }
3237 cc_library {
3238 name: "libfoo",
3239 proprietary: true,
3240 }
3241 `)
3242
Jooyung Hana0503a52023-08-23 13:12:50 +09003243 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003244 "bin/mybin",
3245 "lib64/libfoo.so",
3246 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3247 "lib64/libc++.so",
3248 })
3249
Jooyung Hana0503a52023-08-23 13:12:50 +09003250 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003251 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003252 name := apexBundle.BaseModuleName()
3253 prefix := "TARGET_"
3254 var builder strings.Builder
3255 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003256 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003257 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003258 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003259
Jooyung Hana0503a52023-08-23 13:12:50 +09003260 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003261 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3262 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003263}
3264
Justin Yun13decfb2021-03-08 19:25:55 +09003265func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003266 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003267 ctx := testApex(t, `
3268 apex {
3269 name: "myapex",
3270 key: "myapex.key",
3271 updatable: false,
3272 product_specific: true,
3273 binaries: ["foo"],
3274 }
3275
3276 apex_key {
3277 name: "myapex.key",
3278 public_key: "testkey.avbpubkey",
3279 private_key: "testkey.pem",
3280 }
3281
3282 cc_binary {
3283 name: "foo",
3284 product_available: true,
3285 apex_available: ["myapex"],
3286 srcs: ["foo.cpp"],
3287 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003288 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003289
3290 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003291 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003292 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3293 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3294 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3295 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3296}
3297
Jooyung Han8e5685d2020-09-21 11:02:57 +09003298func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003299 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003300 testCases := []struct {
3301 name string
3302 additionalProp string
3303 }{
3304 {"system apex with prebuilt_firmware", ""},
3305 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3306 }
3307 for _, tc := range testCases {
3308 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003309 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003310 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 apex {
3312 name: "myapex",
3313 key: "myapex.key",
3314 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003315 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003316 `+tc.additionalProp+`
3317 }
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323 prebuilt_firmware {
3324 name: "myfirmware",
3325 src: "myfirmware.bin",
3326 filename_from_src: true,
3327 `+tc.additionalProp+`
3328 }
3329 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003330 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003331 "etc/firmware/myfirmware.bin",
3332 })
3333 })
3334 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003335}
3336
Jooyung Hanefb184e2020-06-25 17:14:25 +09003337func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003338 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003339 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003340 apex {
3341 name: "myapex",
3342 key: "myapex.key",
3343 vendor: true,
3344 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003345 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003346 }
3347
3348 apex_key {
3349 name: "myapex.key",
3350 public_key: "testkey.avbpubkey",
3351 private_key: "testkey.pem",
3352 }
3353
3354 cc_library {
3355 name: "mylib",
3356 vendor_available: true,
3357 }
3358 `)
3359
Jooyung Hana0503a52023-08-23 13:12:50 +09003360 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003361 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003362 name := apexBundle.BaseModuleName()
3363 prefix := "TARGET_"
3364 var builder strings.Builder
3365 data.Custom(&builder, name, prefix, "", data)
3366 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003367 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 +09003368}
3369
Jooyung Han2ed99d02020-06-24 23:26:26 +09003370func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003372 apex {
3373 name: "myapex",
3374 key: "myapex.key",
3375 vintf_fragments: ["fragment.xml"],
3376 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003377 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378 }
3379 apex_key {
3380 name: "myapex.key",
3381 public_key: "testkey.avbpubkey",
3382 private_key: "testkey.pem",
3383 }
3384 cc_binary {
3385 name: "mybin",
3386 }
3387 `)
3388
Jooyung Hana0503a52023-08-23 13:12:50 +09003389 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003390 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003391 name := apexBundle.BaseModuleName()
3392 prefix := "TARGET_"
3393 var builder strings.Builder
3394 data.Custom(&builder, name, prefix, "", data)
3395 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003396 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003397 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003398}
3399
Jiyong Park16e91a02018-12-20 18:18:08 +09003400func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003401 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003403 apex {
3404 name: "myapex",
3405 key: "myapex.key",
3406 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003407 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003408 }
3409
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415
3416 cc_library {
3417 name: "mylib",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 stubs: {
3422 versions: ["1", "2", "3"],
3423 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003424 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003425 }
3426
3427 cc_binary {
3428 name: "not_in_apex",
3429 srcs: ["mylib.cpp"],
3430 static_libs: ["mylib"],
3431 static_executable: true,
3432 system_shared_libs: [],
3433 stl: "none",
3434 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003435 `)
3436
Colin Cross7113d202019-11-20 16:39:12 -08003437 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003438
3439 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003440 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003441}
Jiyong Park9335a262018-12-24 11:31:58 +09003442
3443func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003444 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003445 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003446 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003447 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003448 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003450 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003451 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003452 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003453 }
3454
3455 cc_library {
3456 name: "mylib",
3457 srcs: ["mylib.cpp"],
3458 system_shared_libs: [],
3459 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003461 }
3462
3463 apex_key {
3464 name: "myapex.key",
3465 public_key: "testkey.avbpubkey",
3466 private_key: "testkey.pem",
3467 }
3468
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003469 android_app_certificate {
3470 name: "myapex.certificate",
3471 certificate: "testkey",
3472 }
3473
3474 android_app_certificate {
3475 name: "myapex.certificate.override",
3476 certificate: "testkey.override",
3477 }
3478
Jiyong Park9335a262018-12-24 11:31:58 +09003479 `)
3480
3481 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003482 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003483
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003484 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3485 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003486 "vendor/foo/devkeys/testkey.avbpubkey")
3487 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003488 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3489 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003490 "vendor/foo/devkeys/testkey.pem")
3491 }
3492
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003493 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003494 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003495 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003496 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003497 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003498 }
3499}
Jiyong Park58e364a2019-01-19 19:24:06 +09003500
Jooyung Hanf121a652019-12-17 14:30:11 +09003501func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003502 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003503 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003504 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003505 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 apex {
3507 name: "myapex",
3508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003516 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003517 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3518 if actual := rule.Args["certificates"]; actual != expected {
3519 t.Errorf("certificates should be %q, not %q", expected, actual)
3520 }
3521 })
3522 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003523 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003524 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003525 apex {
3526 name: "myapex_keytest",
3527 key: "myapex.key",
3528 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003529 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003530 }
3531 apex_key {
3532 name: "myapex.key",
3533 public_key: "testkey.avbpubkey",
3534 private_key: "testkey.pem",
3535 }
3536 android_app_certificate {
3537 name: "myapex.certificate.override",
3538 certificate: "testkey.override",
3539 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003540 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003541 expected := "testkey.override.x509.pem testkey.override.pk8"
3542 if actual := rule.Args["certificates"]; actual != expected {
3543 t.Errorf("certificates should be %q, not %q", expected, actual)
3544 }
3545 })
3546 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003547 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003548 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003549 apex {
3550 name: "myapex",
3551 key: "myapex.key",
3552 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003553 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003554 }
3555 apex_key {
3556 name: "myapex.key",
3557 public_key: "testkey.avbpubkey",
3558 private_key: "testkey.pem",
3559 }
3560 android_app_certificate {
3561 name: "myapex.certificate",
3562 certificate: "testkey",
3563 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003564 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003565 expected := "testkey.x509.pem testkey.pk8"
3566 if actual := rule.Args["certificates"]; actual != expected {
3567 t.Errorf("certificates should be %q, not %q", expected, actual)
3568 }
3569 })
3570 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003571 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003573 apex {
3574 name: "myapex_keytest",
3575 key: "myapex.key",
3576 file_contexts: ":myapex-file_contexts",
3577 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003578 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003579 }
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585 android_app_certificate {
3586 name: "myapex.certificate.override",
3587 certificate: "testkey.override",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "testkey.override.x509.pem testkey.override.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex",
3600 key: "myapex.key",
3601 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003602 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003603 }
3604 apex_key {
3605 name: "myapex.key",
3606 public_key: "testkey.avbpubkey",
3607 private_key: "testkey.pem",
3608 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003609 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003610 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3611 if actual := rule.Args["certificates"]; actual != expected {
3612 t.Errorf("certificates should be %q, not %q", expected, actual)
3613 }
3614 })
3615 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003616 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003618 apex {
3619 name: "myapex_keytest",
3620 key: "myapex.key",
3621 file_contexts: ":myapex-file_contexts",
3622 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003623 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003624 }
3625 apex_key {
3626 name: "myapex.key",
3627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630 android_app_certificate {
3631 name: "myapex.certificate.override",
3632 certificate: "testkey.override",
3633 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003634 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003635 expected := "testkey.override.x509.pem testkey.override.pk8"
3636 if actual := rule.Args["certificates"]; actual != expected {
3637 t.Errorf("certificates should be %q, not %q", expected, actual)
3638 }
3639 })
3640}
3641
Jiyong Park58e364a2019-01-19 19:24:06 +09003642func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003643 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003644 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003645 apex {
3646 name: "myapex",
3647 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003648 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003649 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003650 }
3651
3652 apex {
3653 name: "otherapex",
3654 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003655 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003656 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003657 }
3658
3659 apex_key {
3660 name: "myapex.key",
3661 public_key: "testkey.avbpubkey",
3662 private_key: "testkey.pem",
3663 }
3664
3665 cc_library {
3666 name: "mylib",
3667 srcs: ["mylib.cpp"],
3668 system_shared_libs: [],
3669 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003670 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003671 "myapex",
3672 "otherapex",
3673 ],
Jooyung Han24282772020-03-21 23:20:55 +09003674 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003675 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003676 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003677 cc_library {
3678 name: "mylib2",
3679 srcs: ["mylib.cpp"],
3680 system_shared_libs: [],
3681 stl: "none",
3682 apex_available: [
3683 "myapex",
3684 "otherapex",
3685 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003686 static_libs: ["mylib3"],
3687 recovery_available: true,
3688 min_sdk_version: "29",
3689 }
3690 cc_library {
3691 name: "mylib3",
3692 srcs: ["mylib.cpp"],
3693 system_shared_libs: [],
3694 stl: "none",
3695 apex_available: [
3696 "myapex",
3697 "otherapex",
3698 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003699 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003700 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003701 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003702 `)
3703
Jooyung Hanc87a0592020-03-02 17:44:33 +09003704 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003705 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707
Vinh Tranf9754732023-01-19 22:41:46 -05003708 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003709 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003710 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711
Vinh Tranf9754732023-01-19 22:41:46 -05003712 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003713 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003714 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003715
Colin Crossaede88c2020-08-11 12:17:01 -07003716 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3717 // each variant defines additional macros to distinguish which apex variant it is built for
3718
3719 // non-APEX variant does not have __ANDROID_APEX__ defined
3720 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3721 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3722
Vinh Tranf9754732023-01-19 22:41:46 -05003723 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003724 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3725 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003726
Jooyung Hanc87a0592020-03-02 17:44:33 +09003727 // non-APEX variant does not have __ANDROID_APEX__ defined
3728 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3729 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3730
Vinh Tranf9754732023-01-19 22:41:46 -05003731 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003732 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003733 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003734}
Jiyong Park7e636d02019-01-28 16:16:54 +09003735
3736func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003737 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003738 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003739 apex {
3740 name: "myapex",
3741 key: "myapex.key",
3742 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003743 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003744 }
3745
3746 apex_key {
3747 name: "myapex.key",
3748 public_key: "testkey.avbpubkey",
3749 private_key: "testkey.pem",
3750 }
3751
3752 cc_library_headers {
3753 name: "mylib_headers",
3754 export_include_dirs: ["my_include"],
3755 system_shared_libs: [],
3756 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003757 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003758 }
3759
3760 cc_library {
3761 name: "mylib",
3762 srcs: ["mylib.cpp"],
3763 system_shared_libs: [],
3764 stl: "none",
3765 header_libs: ["mylib_headers"],
3766 export_header_lib_headers: ["mylib_headers"],
3767 stubs: {
3768 versions: ["1", "2", "3"],
3769 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003770 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003771 }
3772
3773 cc_library {
3774 name: "otherlib",
3775 srcs: ["mylib.cpp"],
3776 system_shared_libs: [],
3777 stl: "none",
3778 shared_libs: ["mylib"],
3779 }
3780 `)
3781
Colin Cross7113d202019-11-20 16:39:12 -08003782 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003783
3784 // Ensure that the include path of the header lib is exported to 'otherlib'
3785 ensureContains(t, cFlags, "-Imy_include")
3786}
Alex Light9670d332019-01-29 18:07:33 -08003787
Jiyong Park7cd10e32020-01-14 09:22:18 +09003788type fileInApex struct {
3789 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003790 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003791 isLink bool
3792}
3793
Jooyung Han1724d582022-12-21 10:17:44 +09003794func (f fileInApex) String() string {
3795 return f.src + ":" + f.path
3796}
3797
3798func (f fileInApex) match(expectation string) bool {
3799 parts := strings.Split(expectation, ":")
3800 if len(parts) == 1 {
3801 match, _ := path.Match(parts[0], f.path)
3802 return match
3803 }
3804 if len(parts) == 2 {
3805 matchSrc, _ := path.Match(parts[0], f.src)
3806 matchDst, _ := path.Match(parts[1], f.path)
3807 return matchSrc && matchDst
3808 }
3809 panic("invalid expected file specification: " + expectation)
3810}
3811
Jooyung Hana57af4a2020-01-23 05:36:59 +00003812func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003814 module := ctx.ModuleForTests(moduleName, variant)
3815 apexRule := module.MaybeRule("apexRule")
3816 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003818 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003819 for _, cmd := range strings.Split(copyCmds, "&&") {
3820 cmd = strings.TrimSpace(cmd)
3821 if cmd == "" {
3822 continue
3823 }
3824 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003825 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003826 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003827 switch terms[0] {
3828 case "mkdir":
3829 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003830 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 t.Fatal("copyCmds contains invalid cp command", cmd)
3832 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003833 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003834 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003835 isLink = false
3836 case "ln":
3837 if len(terms) != 3 && len(terms) != 4 {
3838 // ln LINK TARGET or ln -s LINK TARGET
3839 t.Fatal("copyCmds contains invalid ln command", cmd)
3840 }
3841 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003842 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003843 isLink = true
3844 default:
3845 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3846 }
3847 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003848 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003850 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 }
Jooyung Han1724d582022-12-21 10:17:44 +09003852 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003853 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003854 }
3855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 return ret
3857}
3858
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003859func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003860 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003861 var failed bool
3862 var surplus []string
3863 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003865 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003867 if file.match(expected) {
3868 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003869 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003870 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003871 }
3872 }
Jooyung Han1724d582022-12-21 10:17:44 +09003873 if !matchFound {
3874 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003875 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003876 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003877
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003879 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 t.Log("surplus files", surplus)
3881 failed = true
3882 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887 if !filesMatched[expected] {
3888 missing = append(missing, expected)
3889 }
3890 }
3891 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 t.Log("missing files", missing)
3893 failed = true
3894 }
3895 if failed {
3896 t.Fail()
3897 }
3898}
3899
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003900func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3901 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3902}
3903
3904func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003905 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003906 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3907 if deapexer.Output != nil {
3908 outputs = append(outputs, deapexer.Output.String())
3909 }
3910 for _, output := range deapexer.ImplicitOutputs {
3911 outputs = append(outputs, output.String())
3912 }
3913 actualFiles := make([]fileInApex, 0, len(outputs))
3914 for _, output := range outputs {
3915 dir := "/deapexer/"
3916 pos := strings.LastIndex(output, dir)
3917 if pos == -1 {
3918 t.Fatal("Unknown deapexer output ", output)
3919 }
3920 path := output[pos+len(dir):]
3921 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3922 }
3923 assertFileListEquals(t, files, actualFiles)
3924}
3925
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926func vndkLibrariesTxtFiles(vers ...string) (result string) {
3927 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003928 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003929 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930 prebuilt_etc {
3931 name: "` + txt + `.libraries.` + v + `.txt",
3932 src: "dummy.txt",
3933 }
3934 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003935 }
3936 }
3937 return
3938}
3939
Jooyung Han344d5432019-08-23 11:17:39 +09003940func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003942 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003943 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003944 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003945 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003946 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003947 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003948 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003949 }
3950
3951 apex_key {
3952 name: "myapex.key",
3953 public_key: "testkey.avbpubkey",
3954 private_key: "testkey.pem",
3955 }
3956
Jooyung Han31c470b2019-10-18 16:26:59 +09003957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "arm64",
3966 arch: {
3967 arm: {
3968 srcs: ["libvndk27_arm.so"],
3969 },
3970 arm64: {
3971 srcs: ["libvndk27_arm64.so"],
3972 },
3973 },
Colin Cross2807f002021-03-02 10:15:29 -08003974 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003975 }
3976
3977 vndk_prebuilt_shared {
3978 name: "libvndk27",
3979 version: "27",
3980 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003981 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003982 vndk: {
3983 enabled: true,
3984 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 target_arch: "x86_64",
3986 arch: {
3987 x86: {
3988 srcs: ["libvndk27_x86.so"],
3989 },
3990 x86_64: {
3991 srcs: ["libvndk27_x86_64.so"],
3992 },
3993 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }
3995 `+vndkLibrariesTxtFiles("27"),
3996 withFiles(map[string][]byte{
3997 "libvndk27_arm.so": nil,
3998 "libvndk27_arm64.so": nil,
3999 "libvndk27_x86.so": nil,
4000 "libvndk27_x86_64.so": nil,
4001 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004002
Jooyung Hana0503a52023-08-23 13:12:50 +09004003 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004004 "lib/libvndk27_arm.so",
4005 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004006 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004007 })
Jooyung Han344d5432019-08-23 11:17:39 +09004008}
4009
Jooyung Han90eee022019-10-01 20:02:42 +09004010func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004011 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004012 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004013 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004014 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004015 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004017 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004018 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004019 }
4020 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004021 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004022 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004023 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004025 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004026 }
4027 apex_key {
4028 name: "myapex.key",
4029 public_key: "testkey.avbpubkey",
4030 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004031 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004032
4033 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004034 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004035 apexManifestRule := module.Rule("apexManifestRule")
4036 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004039 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004040 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004041}
4042
Jooyung Han344d5432019-08-23 11:17:39 +09004043func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004044 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004046 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004047 name: "com.android.vndk.v30",
4048 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004049 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
4051 }
4052
4053 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004054 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004055 public_key: "testkey.avbpubkey",
4056 private_key: "testkey.pem",
4057 }
4058
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004059 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004060 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004061 version: "30",
4062 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004063 srcs: ["mylib.cpp"],
4064 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004065 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004067 vndk: {
4068 enabled: true,
4069 },
Jooyung Han344d5432019-08-23 11:17:39 +09004070 }
4071 `)
4072}
4073
Jooyung Han31c470b2019-10-18 16:26:59 +09004074func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004075 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004076 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004078 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004079 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004080 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004082 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 }
4084
4085 apex_key {
4086 name: "myapex.key",
4087 public_key: "testkey.avbpubkey",
4088 private_key: "testkey.pem",
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004096 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 vndk: {
4098 enabled: true,
4099 },
4100 arch: {
4101 arm: {
4102 srcs: ["libvndk27.so"],
4103 }
4104 },
4105 }
4106
4107 vndk_prebuilt_shared {
4108 name: "libvndk27",
4109 version: "27",
4110 target_arch: "arm",
4111 binder32bit: true,
4112 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004113 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004114 vndk: {
4115 enabled: true,
4116 },
4117 arch: {
4118 arm: {
4119 srcs: ["libvndk27binder32.so"],
4120 }
4121 },
Colin Cross2807f002021-03-02 10:15:29 -08004122 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004124 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 withFiles(map[string][]byte{
4126 "libvndk27.so": nil,
4127 "libvndk27binder32.so": nil,
4128 }),
4129 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004130 android.FixtureModifyConfig(func(config android.Config) {
4131 target := android.Target{
4132 Os: android.Android,
4133 Arch: android.Arch{
4134 ArchType: android.Arm,
4135 ArchVariant: "armv7-a-neon",
4136 Abi: []string{"armeabi-v7a"},
4137 },
4138 NativeBridge: android.NativeBridgeDisabled,
4139 NativeBridgeHostArchName: "",
4140 NativeBridgeRelativePath: "",
4141 }
4142 config.Targets[android.Android] = []android.Target{target}
4143 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }),
4145 )
4146
Jooyung Hana0503a52023-08-23 13:12:50 +09004147 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004149 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004150 })
4151}
4152
Jooyung Hane1633032019-08-01 17:41:43 +09004153func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004154 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004155 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004156 apex {
4157 name: "myapex_nodep",
4158 key: "myapex.key",
4159 native_shared_libs: ["lib_nodep"],
4160 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004162 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004163 }
4164
4165 apex {
4166 name: "myapex_dep",
4167 key: "myapex.key",
4168 native_shared_libs: ["lib_dep"],
4169 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004170 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004171 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004172 }
4173
4174 apex {
4175 name: "myapex_provider",
4176 key: "myapex.key",
4177 native_shared_libs: ["libfoo"],
4178 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004179 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004180 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004181 }
4182
4183 apex {
4184 name: "myapex_selfcontained",
4185 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004186 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004187 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004188 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004189 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004190 }
4191
4192 apex_key {
4193 name: "myapex.key",
4194 public_key: "testkey.avbpubkey",
4195 private_key: "testkey.pem",
4196 }
4197
4198 cc_library {
4199 name: "lib_nodep",
4200 srcs: ["mylib.cpp"],
4201 system_shared_libs: [],
4202 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004203 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004204 }
4205
4206 cc_library {
4207 name: "lib_dep",
4208 srcs: ["mylib.cpp"],
4209 shared_libs: ["libfoo"],
4210 system_shared_libs: [],
4211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004212 apex_available: [
4213 "myapex_dep",
4214 "myapex_provider",
4215 "myapex_selfcontained",
4216 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004217 }
4218
4219 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004220 name: "lib_dep_on_bar",
4221 srcs: ["mylib.cpp"],
4222 shared_libs: ["libbar"],
4223 system_shared_libs: [],
4224 stl: "none",
4225 apex_available: [
4226 "myapex_selfcontained",
4227 ],
4228 }
4229
4230
4231 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004232 name: "libfoo",
4233 srcs: ["mytest.cpp"],
4234 stubs: {
4235 versions: ["1"],
4236 },
4237 system_shared_libs: [],
4238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004239 apex_available: [
4240 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004241 ],
4242 }
4243
4244 cc_library {
4245 name: "libbar",
4246 srcs: ["mytest.cpp"],
4247 stubs: {
4248 versions: ["1"],
4249 },
4250 system_shared_libs: [],
4251 stl: "none",
4252 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 "myapex_selfcontained",
4254 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004255 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004256
Jooyung Hane1633032019-08-01 17:41:43 +09004257 `)
4258
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004260 var provideNativeLibs, requireNativeLibs []string
4261
Jooyung Hana0503a52023-08-23 13:12:50 +09004262 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004263 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4264 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004265 ensureListEmpty(t, provideNativeLibs)
4266 ensureListEmpty(t, requireNativeLibs)
4267
Jooyung Hana0503a52023-08-23 13:12:50 +09004268 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004269 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4270 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004271 ensureListEmpty(t, provideNativeLibs)
4272 ensureListContains(t, requireNativeLibs, "libfoo.so")
4273
Jooyung Hana0503a52023-08-23 13:12:50 +09004274 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004275 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4276 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004277 ensureListContains(t, provideNativeLibs, "libfoo.so")
4278 ensureListEmpty(t, requireNativeLibs)
4279
Jooyung Hana0503a52023-08-23 13:12:50 +09004280 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004281 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4282 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004283 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004284 ensureListEmpty(t, requireNativeLibs)
4285}
4286
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004287func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004288 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004289 ctx := testApex(t, `
4290 apex {
4291 name: "myapex",
4292 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004293 native_shared_libs: ["mylib"],
4294 updatable: false,
4295 }
4296
4297 apex_key {
4298 name: "myapex.key",
4299 public_key: "testkey.avbpubkey",
4300 private_key: "testkey.pem",
4301 }
4302
4303 cc_library {
4304 name: "mylib",
4305 srcs: ["mylib.cpp"],
4306 system_shared_libs: [],
4307 stl: "none",
4308 apex_available: [
4309 "//apex_available:platform",
4310 "myapex",
4311 ],
4312 }
4313 `, android.FixtureMergeEnv(map[string]string{
4314 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4315 }))
4316
Jooyung Hana0503a52023-08-23 13:12:50 +09004317 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004318 apexManifestRule := module.Rule("apexManifestRule")
4319 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4320}
4321
Vinh Tran8f5310f2022-10-07 18:16:47 -04004322func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004323 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004324 testCases := []struct {
4325 compileMultiLibProp string
4326 containedLibs []string
4327 notContainedLibs []string
4328 }{
4329 {
4330 containedLibs: []string{
4331 "image.apex/lib64/mylib.so",
4332 "image.apex/lib/mylib.so",
4333 },
4334 compileMultiLibProp: `compile_multilib: "both",`,
4335 },
4336 {
4337 containedLibs: []string{"image.apex/lib64/mylib.so"},
4338 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4339 compileMultiLibProp: `compile_multilib: "first",`,
4340 },
4341 {
4342 containedLibs: []string{"image.apex/lib64/mylib.so"},
4343 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4344 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4345 },
4346 {
4347 containedLibs: []string{"image.apex/lib64/mylib.so"},
4348 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4349 compileMultiLibProp: `compile_multilib: "64",`,
4350 },
4351 {
4352 containedLibs: []string{"image.apex/lib/mylib.so"},
4353 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4354 compileMultiLibProp: `compile_multilib: "32",`,
4355 },
4356 }
4357 for _, testCase := range testCases {
4358 ctx := testApex(t, fmt.Sprintf(`
4359 apex {
4360 name: "myapex",
4361 key: "myapex.key",
4362 %s
4363 native_shared_libs: ["mylib"],
4364 updatable: false,
4365 }
4366 apex_key {
4367 name: "myapex.key",
4368 public_key: "testkey.avbpubkey",
4369 private_key: "testkey.pem",
4370 }
4371 cc_library {
4372 name: "mylib",
4373 srcs: ["mylib.cpp"],
4374 apex_available: [
4375 "//apex_available:platform",
4376 "myapex",
4377 ],
4378 }
4379 `, testCase.compileMultiLibProp),
4380 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004381 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004382 apexRule := module.Rule("apexRule")
4383 copyCmds := apexRule.Args["copy_commands"]
4384 for _, containedLib := range testCase.containedLibs {
4385 ensureContains(t, copyCmds, containedLib)
4386 }
4387 for _, notContainedLib := range testCase.notContainedLibs {
4388 ensureNotContains(t, copyCmds, notContainedLib)
4389 }
4390 }
4391}
4392
Alex Light0851b882019-02-07 13:20:53 -08004393func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004394 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
4399 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004401 }
4402
4403 apex_key {
4404 name: "myapex.key",
4405 public_key: "testkey.avbpubkey",
4406 private_key: "testkey.pem",
4407 }
4408
4409 cc_library {
4410 name: "mylib_common",
4411 srcs: ["mylib.cpp"],
4412 system_shared_libs: [],
4413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004414 apex_available: [
4415 "//apex_available:platform",
4416 "myapex",
4417 ],
Alex Light0851b882019-02-07 13:20:53 -08004418 }
4419 `)
4420
Jooyung Hana0503a52023-08-23 13:12:50 +09004421 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004422 apexRule := module.Rule("apexRule")
4423 copyCmds := apexRule.Args["copy_commands"]
4424
4425 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4426 t.Log("Apex was a test apex!")
4427 t.Fail()
4428 }
4429 // Ensure that main rule creates an output
4430 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4431
4432 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004433 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004434
4435 // Ensure that both direct and indirect deps are copied into apex
4436 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4437
Colin Cross7113d202019-11-20 16:39:12 -08004438 // Ensure that the platform variant ends with _shared
4439 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004440
Colin Cross56a83212020-09-15 18:30:11 -07004441 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004442 t.Log("Found mylib_common not in any apex!")
4443 t.Fail()
4444 }
4445}
4446
4447func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004448 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004449 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004450 apex_test {
4451 name: "myapex",
4452 key: "myapex.key",
4453 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004454 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004455 }
4456
4457 apex_key {
4458 name: "myapex.key",
4459 public_key: "testkey.avbpubkey",
4460 private_key: "testkey.pem",
4461 }
4462
4463 cc_library {
4464 name: "mylib_common_test",
4465 srcs: ["mylib.cpp"],
4466 system_shared_libs: [],
4467 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 // TODO: remove //apex_available:platform
4469 apex_available: [
4470 "//apex_available:platform",
4471 "myapex",
4472 ],
Alex Light0851b882019-02-07 13:20:53 -08004473 }
4474 `)
4475
Jooyung Hana0503a52023-08-23 13:12:50 +09004476 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004477 apexRule := module.Rule("apexRule")
4478 copyCmds := apexRule.Args["copy_commands"]
4479
4480 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4481 t.Log("Apex was not a test apex!")
4482 t.Fail()
4483 }
4484 // Ensure that main rule creates an output
4485 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4486
4487 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004489
4490 // Ensure that both direct and indirect deps are copied into apex
4491 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4492
Colin Cross7113d202019-11-20 16:39:12 -08004493 // Ensure that the platform variant ends with _shared
4494 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004495}
4496
Jooyung Han85707de2023-12-01 14:21:13 +09004497func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004498 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004499 ctx := testApex(t, `
4500 apex {
4501 name: "myapex",
4502 key: "myapex.key",
4503 updatable: false,
4504 binaries: ["mybin"],
4505 }
4506 apex {
4507 name: "myvendorapex",
4508 key: "myapex.key",
4509 file_contexts: "myvendorapex_file_contexts",
4510 vendor: true,
4511 updatable: false,
4512 binaries: ["mybin"],
4513 }
4514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
4519 cc_binary {
4520 name: "mybin",
4521 vendor_available: true,
4522 system_shared_libs: [],
4523 stl: "none",
4524 shared_libs: ["libz"],
4525 apex_available: ["//apex_available:anyapex"],
4526 }
4527 cc_library {
4528 name: "libz",
4529 vendor_available: true,
4530 system_shared_libs: [],
4531 stl: "none",
4532 stubs: {
4533 versions: ["28", "30"],
4534 },
4535 target: {
4536 vendor: {
4537 no_stubs: true,
4538 },
4539 },
4540 }
4541 `, withFiles(map[string][]byte{
4542 "myvendorapex_file_contexts": nil,
4543 }))
4544
4545 // libz provides stubs for core variant.
4546 {
4547 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4548 "bin/mybin",
4549 })
4550 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4551 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4552 }
4553 // libz doesn't provide stubs for vendor variant.
4554 {
4555 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4556 "bin/mybin",
4557 "lib64/libz.so",
4558 })
4559 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4560 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4561 }
4562}
4563
Alex Light9670d332019-01-29 18:07:33 -08004564func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004565 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004566 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004570 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004571 multilib: {
4572 first: {
4573 native_shared_libs: ["mylib_common"],
4574 }
4575 },
4576 target: {
4577 android: {
4578 multilib: {
4579 first: {
4580 native_shared_libs: ["mylib"],
4581 }
4582 }
4583 },
4584 host: {
4585 multilib: {
4586 first: {
4587 native_shared_libs: ["mylib2"],
4588 }
4589 }
4590 }
4591 }
4592 }
4593
4594 apex_key {
4595 name: "myapex.key",
4596 public_key: "testkey.avbpubkey",
4597 private_key: "testkey.pem",
4598 }
4599
4600 cc_library {
4601 name: "mylib",
4602 srcs: ["mylib.cpp"],
4603 system_shared_libs: [],
4604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004605 // TODO: remove //apex_available:platform
4606 apex_available: [
4607 "//apex_available:platform",
4608 "myapex",
4609 ],
Alex Light9670d332019-01-29 18:07:33 -08004610 }
4611
4612 cc_library {
4613 name: "mylib_common",
4614 srcs: ["mylib.cpp"],
4615 system_shared_libs: [],
4616 stl: "none",
4617 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004618 // TODO: remove //apex_available:platform
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
Alex Light9670d332019-01-29 18:07:33 -08004623 }
4624
4625 cc_library {
4626 name: "mylib2",
4627 srcs: ["mylib.cpp"],
4628 system_shared_libs: [],
4629 stl: "none",
4630 compile_multilib: "first",
4631 }
4632 `)
4633
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 // Ensure that main rule creates an output
4638 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4639
4640 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4643 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004644
4645 // Ensure that both direct and indirect deps are copied into apex
4646 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4647 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4648 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4649
Colin Cross7113d202019-11-20 16:39:12 -08004650 // Ensure that the platform variant ends with _shared
4651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4652 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4653 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004654}
Jiyong Park04480cf2019-02-06 00:16:29 +09004655
Jiyong Park59140302020-12-14 18:44:04 +09004656func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004659 apex {
4660 name: "myapex",
4661 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004662 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004663 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004664 arch: {
4665 arm64: {
4666 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004667 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004668 },
4669 x86_64: {
4670 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004671 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004672 },
4673 }
4674 }
4675
4676 apex_key {
4677 name: "myapex.key",
4678 public_key: "testkey.avbpubkey",
4679 private_key: "testkey.pem",
4680 }
4681
4682 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004683 name: "mylib.generic",
4684 srcs: ["mylib.cpp"],
4685 system_shared_libs: [],
4686 stl: "none",
4687 // TODO: remove //apex_available:platform
4688 apex_available: [
4689 "//apex_available:platform",
4690 "myapex",
4691 ],
4692 }
4693
4694 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004695 name: "mylib.arm64",
4696 srcs: ["mylib.cpp"],
4697 system_shared_libs: [],
4698 stl: "none",
4699 // TODO: remove //apex_available:platform
4700 apex_available: [
4701 "//apex_available:platform",
4702 "myapex",
4703 ],
4704 }
4705
4706 cc_library {
4707 name: "mylib.x64",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
4711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
4716 }
4717 `)
4718
Jooyung Hana0503a52023-08-23 13:12:50 +09004719 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004720 copyCmds := apexRule.Args["copy_commands"]
4721
4722 // Ensure that apex variant is created for the direct dep
4723 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004724 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004725 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4726
4727 // Ensure that both direct and indirect deps are copied into apex
4728 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4729 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4730}
4731
Jiyong Park04480cf2019-02-06 00:16:29 +09004732func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004733 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004734 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004735 apex {
4736 name: "myapex",
4737 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004738 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004739 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004740 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004741 }
4742
4743 apex_key {
4744 name: "myapex.key",
4745 public_key: "testkey.avbpubkey",
4746 private_key: "testkey.pem",
4747 }
4748
4749 sh_binary {
4750 name: "myscript",
4751 src: "mylib.cpp",
4752 filename: "myscript.sh",
4753 sub_dir: "script",
4754 }
4755 `)
4756
Jooyung Hana0503a52023-08-23 13:12:50 +09004757 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004758 copyCmds := apexRule.Args["copy_commands"]
4759
4760 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4761}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004762
Jooyung Han91df2082019-11-20 01:49:42 +09004763func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004764 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004765 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004766 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004767 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004768 {"", "system"},
4769 {"product_specific: true", "product"},
4770 {"soc_specific: true", "vendor"},
4771 {"proprietary: true", "vendor"},
4772 {"vendor: true", "vendor"},
4773 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004774 }
4775 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004776 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004777 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004778 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004779 apex {
4780 name: "myapex",
4781 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004782 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004783 `+tc.propName+`
4784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785
Jooyung Han91df2082019-11-20 01:49:42 +09004786 apex_key {
4787 name: "myapex.key",
4788 public_key: "testkey.avbpubkey",
4789 private_key: "testkey.pem",
4790 }
4791 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004792
Jooyung Hana0503a52023-08-23 13:12:50 +09004793 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004794 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004795 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004796 if actual != expected {
4797 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4798 }
Jooyung Han91df2082019-11-20 01:49:42 +09004799 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004800 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004801}
Jiyong Park67882562019-03-21 01:11:21 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004805 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004809 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004811
Jooyung Han580eb4f2020-06-24 19:33:06 +09004812 apex_key {
4813 name: "myapex.key",
4814 public_key: "testkey.avbpubkey",
4815 private_key: "testkey.pem",
4816 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004817 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004818 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004819 rule := module.Output("file_contexts")
4820 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004830 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004831 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004832
Jooyung Han580eb4f2020-06-24 19:33:06 +09004833 apex_key {
4834 name: "myapex.key",
4835 public_key: "testkey.avbpubkey",
4836 private_key: "testkey.pem",
4837 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004838 `, withFiles(map[string][]byte{
4839 "my_own_file_contexts": nil,
4840 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004841}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004842
Jooyung Han580eb4f2020-06-24 19:33:06 +09004843func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004844 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004845 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `)
4860
Colin Cross1c460562021-02-16 17:55:47 -08004861 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004862 apex {
4863 name: "myapex",
4864 key: "myapex.key",
4865 product_specific: true,
4866 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004867 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004868 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004869
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex_key {
4871 name: "myapex.key",
4872 public_key: "testkey.avbpubkey",
4873 private_key: "testkey.pem",
4874 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004875 `, withFiles(map[string][]byte{
4876 "product_specific_file_contexts": nil,
4877 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004878 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004879 rule := module.Output("file_contexts")
4880 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4881}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004882
Jooyung Han580eb4f2020-06-24 19:33:06 +09004883func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004885 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004886 apex {
4887 name: "myapex",
4888 key: "myapex.key",
4889 product_specific: true,
4890 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004891 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004893
Jooyung Han580eb4f2020-06-24 19:33:06 +09004894 apex_key {
4895 name: "myapex.key",
4896 public_key: "testkey.avbpubkey",
4897 private_key: "testkey.pem",
4898 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004899
Jooyung Han580eb4f2020-06-24 19:33:06 +09004900 filegroup {
4901 name: "my-file-contexts",
4902 srcs: ["product_specific_file_contexts"],
4903 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004904 `, withFiles(map[string][]byte{
4905 "product_specific_file_contexts": nil,
4906 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004907 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004908 rule := module.Output("file_contexts")
4909 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004910}
4911
Jiyong Park67882562019-03-21 01:11:21 +09004912func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004915 apex_key {
4916 name: "myapex.key",
4917 public_key: ":my.avbpubkey",
4918 private_key: ":my.pem",
4919 product_specific: true,
4920 }
4921
4922 filegroup {
4923 name: "my.avbpubkey",
4924 srcs: ["testkey2.avbpubkey"],
4925 }
4926
4927 filegroup {
4928 name: "my.pem",
4929 srcs: ["testkey2.pem"],
4930 }
4931 `)
4932
4933 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4934 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004935 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004936 if actual_pubkey != expected_pubkey {
4937 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4938 }
4939 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004940 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004941 if actual_privkey != expected_privkey {
4942 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4943 }
4944}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004945
4946func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004947 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004949 prebuilt_apex {
4950 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004951 arch: {
4952 arm64: {
4953 src: "myapex-arm64.apex",
4954 },
4955 arm: {
4956 src: "myapex-arm.apex",
4957 },
4958 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959 }
4960 `)
4961
Wei Li340ee8e2022-03-18 17:33:24 -07004962 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4963 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004964
Jiyong Parkc95714e2019-03-29 14:23:10 +09004965 expectedInput := "myapex-arm64.apex"
4966 if prebuilt.inputApex.String() != expectedInput {
4967 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4968 }
Wei Li340ee8e2022-03-18 17:33:24 -07004969 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4970 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4971 rule := testingModule.Rule("genProvenanceMetaData")
4972 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4973 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4974 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4975 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004976
4977 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4978 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004979}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004980
Paul Duffinc0609c62021-03-01 17:27:16 +00004981func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004982 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004983 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004984 prebuilt_apex {
4985 name: "myapex",
4986 }
4987 `)
4988}
4989
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004990func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004992 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004993 prebuilt_apex {
4994 name: "myapex",
4995 src: "myapex-arm.apex",
4996 filename: "notmyapex.apex",
4997 }
4998 `)
4999
Wei Li340ee8e2022-03-18 17:33:24 -07005000 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5001 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005002
5003 expected := "notmyapex.apex"
5004 if p.installFilename != expected {
5005 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5006 }
Wei Li340ee8e2022-03-18 17:33:24 -07005007 rule := testingModule.Rule("genProvenanceMetaData")
5008 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5009 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5010 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5011 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005012}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005013
Samiul Islam7c02e262021-09-08 17:48:28 +01005014func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005015 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005016 testApex(t, `
5017 apex_set {
5018 name: "com.company.android.myapex",
5019 apex_name: "com.android.myapex",
5020 set: "company-myapex.apks",
5021 filename: "com.company.android.myapex.apex"
5022 }
5023 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5024
5025 testApex(t, `
5026 apex_set {
5027 name: "com.company.android.myapex",
5028 apex_name: "com.android.myapex",
5029 set: "company-myapex.apks",
5030 filename: "com.company.android.myapex.capex"
5031 }
5032 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5033
5034 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5035 apex_set {
5036 name: "com.company.android.myapex",
5037 apex_name: "com.android.myapex",
5038 set: "company-myapex.apks",
5039 filename: "some-random-suffix"
5040 }
5041 `)
5042}
5043
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005044func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005045 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005046 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 prebuilt_apex {
5048 name: "myapex.prebuilt",
5049 src: "myapex-arm.apex",
5050 overrides: [
5051 "myapex",
5052 ],
5053 }
5054 `)
5055
Wei Li340ee8e2022-03-18 17:33:24 -07005056 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5057 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005058
5059 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005060 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005061 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005062 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005063 }
Wei Li340ee8e2022-03-18 17:33:24 -07005064 rule := testingModule.Rule("genProvenanceMetaData")
5065 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5066 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5067 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5068 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005069}
5070
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005071func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005072 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005073 testApex(t, `
5074 prebuilt_apex {
5075 name: "com.company.android.myapex",
5076 apex_name: "com.android.myapex",
5077 src: "company-myapex-arm.apex",
5078 }
5079 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5080
5081 testApex(t, `
5082 apex_set {
5083 name: "com.company.android.myapex",
5084 apex_name: "com.android.myapex",
5085 set: "company-myapex.apks",
5086 }
5087 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5088}
5089
5090func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005091 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005092 _ = android.GroupFixturePreparers(
5093 java.PrepareForTestWithJavaDefaultModules,
5094 PrepareForTestWithApexBuildComponents,
5095 android.FixtureWithRootAndroidBp(`
5096 platform_bootclasspath {
5097 name: "platform-bootclasspath",
5098 fragments: [
5099 {
5100 apex: "com.android.art",
5101 module: "art-bootclasspath-fragment",
5102 },
5103 ],
5104 }
5105
5106 prebuilt_apex {
5107 name: "com.company.android.art",
5108 apex_name: "com.android.art",
5109 src: "com.company.android.art-arm.apex",
5110 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5111 }
5112
5113 prebuilt_bootclasspath_fragment {
5114 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005115 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005116 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005117 hidden_api: {
5118 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5119 metadata: "my-bootclasspath-fragment/metadata.csv",
5120 index: "my-bootclasspath-fragment/index.csv",
5121 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5122 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5123 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005124 }
5125
5126 java_import {
5127 name: "core-oj",
5128 jars: ["prebuilt.jar"],
5129 }
5130 `),
5131 ).RunTest(t)
5132}
5133
Spandan Das59a4a2b2024-01-09 21:35:56 +00005134// A minimal context object for use with DexJarBuildPath
5135type moduleErrorfTestCtx struct {
5136}
5137
5138func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5139}
5140
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005142 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005143 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005144 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005145 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5146 // is disabled.
5147 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005148
5149 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5150 // file creation.
5151 java.FixtureConfigureBootJars("platform:foo"),
5152 android.FixtureModifyMockFS(func(fs android.MockFS) {
5153 fs["platform/Android.bp"] = []byte(`
5154 java_library {
5155 name: "foo",
5156 srcs: ["Test.java"],
5157 compile_dex: true,
5158 }
5159 `)
5160 fs["platform/Test.java"] = nil
5161 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005162 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163
Paul Duffin40a3f652021-07-19 13:11:24 +01005164 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005165 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005166 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005167 var rule android.TestingBuildParams
5168
5169 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5170 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005171 }
5172
Paul Duffin40a3f652021-07-19 13:11:24 +01005173 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5174 t.Helper()
5175 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5176 var rule android.TestingBuildParams
5177
5178 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5179 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5180 }
5181
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 fragment := java.ApexVariantReference{
5183 Apex: proptools.StringPtr("myapex"),
5184 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5185 }
5186
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005187 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005188 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005189 bp := `
5190 prebuilt_apex {
5191 name: "myapex",
5192 arch: {
5193 arm64: {
5194 src: "myapex-arm64.apex",
5195 },
5196 arm: {
5197 src: "myapex-arm.apex",
5198 },
5199 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005200 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5201 }
5202
5203 prebuilt_bootclasspath_fragment {
5204 name: "my-bootclasspath-fragment",
5205 contents: ["libfoo", "libbar"],
5206 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005207 hidden_api: {
5208 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5209 metadata: "my-bootclasspath-fragment/metadata.csv",
5210 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005211 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5212 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5213 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005214 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 }
5216
Spandan Das52c01a12024-09-20 01:09:48 +00005217 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005219 public: {
5220 jars: ["libfoo.jar"],
5221 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005223 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005224 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 }
Paul Duffin37856732021-02-26 14:24:15 +00005226
5227 java_sdk_library_import {
5228 name: "libbar",
5229 public: {
5230 jars: ["libbar.jar"],
5231 },
5232 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005233 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005234 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005235 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005236 `
5237
Paul Duffin89f570a2021-06-16 01:42:33 +01005238 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005239
Paul Duffin537ea3d2021-05-14 10:38:00 +01005240 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005241 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005242 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005243 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005244 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005245 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 +01005246 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005247 })
5248
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005249 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005250 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 bp := `
5252 apex_set {
5253 name: "myapex",
5254 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005255 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005256 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5257 }
5258
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 prebuilt_bootclasspath_fragment {
5260 name: "my-bootclasspath-fragment",
5261 contents: ["libfoo", "libbar"],
5262 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005263 hidden_api: {
5264 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5265 metadata: "my-bootclasspath-fragment/metadata.csv",
5266 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005267 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5268 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5269 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005270 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Liz Kammer2dc72442023-04-20 10:10:48 -04005273 prebuilt_systemserverclasspath_fragment {
5274 name: "my-systemserverclasspath-fragment",
5275 contents: ["libbaz"],
5276 apex_available: ["myapex"],
5277 }
5278
Spandan Das52c01a12024-09-20 01:09:48 +00005279 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005280 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005281 public: {
5282 jars: ["libfoo.jar"],
5283 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005284 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005285 shared_library: false,
5286 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005287 }
5288
Spandan Das52c01a12024-09-20 01:09:48 +00005289
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005290 java_sdk_library_import {
5291 name: "libbar",
5292 public: {
5293 jars: ["libbar.jar"],
5294 },
5295 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005296 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005297 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005298 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005299
5300 java_sdk_library_import {
5301 name: "libbaz",
5302 public: {
5303 jars: ["libbaz.jar"],
5304 },
5305 apex_available: ["myapex"],
5306 shared_library: false,
5307 permitted_packages: ["baz"],
5308 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005309 `
5310
Paul Duffin89f570a2021-06-16 01:42:33 +01005311 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005312
Paul Duffin537ea3d2021-05-14 10:38:00 +01005313 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005314 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005315 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005316 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005317 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005318 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 +01005319 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005320
5321 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5322
5323 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005324 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005325 "myjavalib.myapex",
5326 "libfoo.myapex",
5327 "libbar.myapex",
5328 "libbaz.myapex",
5329 }
5330 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5331 for i, e := range mkEntries {
5332 g := e.OverrideName
5333 if w := overrideNames[i]; w != g {
5334 t.Errorf("Expected override name %q, got %q", w, g)
5335 }
5336 }
5337
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005338 })
5339
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005340 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005341 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005342 bp := `
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005353 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5354 }
5355
5356 prebuilt_bootclasspath_fragment {
5357 name: "my-bootclasspath-fragment",
5358 contents: ["libfoo", "libbar"],
5359 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005360 hidden_api: {
5361 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5362 metadata: "my-bootclasspath-fragment/metadata.csv",
5363 index: "my-bootclasspath-fragment/index.csv",
5364 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5365 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 jars: ["libfoo.jar"],
5372 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005373 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 }
5375
5376 java_library {
5377 name: "libfoo",
5378 srcs: ["foo/bar/MyClass.java"],
5379 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005380 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005381 }
Paul Duffin37856732021-02-26 14:24:15 +00005382
5383 java_sdk_library_import {
5384 name: "libbar",
5385 public: {
5386 jars: ["libbar.jar"],
5387 },
5388 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005390 }
5391
5392 java_sdk_library {
5393 name: "libbar",
5394 srcs: ["foo/bar/MyClass.java"],
5395 unsafe_ignore_missing_latest_api: true,
5396 apex_available: ["myapex"],
5397 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005398 `
5399
5400 // In this test the source (java_library) libfoo is active since the
5401 // prebuilt (java_import) defaults to prefer:false. However the
5402 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5403 // find the dex boot jar in it. We either need to disable the source libfoo
5404 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005405 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005406 // dexbootjar check is skipped if AllowMissingDependencies is true
5407 preparerAllowMissingDeps := android.GroupFixturePreparers(
5408 preparer,
5409 android.PrepareForTestWithAllowMissingDependencies,
5410 )
5411 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 })
5413
5414 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005415 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005416 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 apex {
5418 name: "myapex",
5419 key: "myapex.key",
5420 updatable: false,
5421 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
5430 bootclasspath_fragment {
5431 name: "my-bootclasspath-fragment",
5432 contents: ["libfoo", "libbar"],
5433 apex_available: ["myapex"],
5434 hidden_api: {
5435 split_packages: ["*"],
5436 },
5437 }
5438
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 prebuilt_apex {
5440 name: "myapex",
5441 arch: {
5442 arm64: {
5443 src: "myapex-arm64.apex",
5444 },
5445 arm: {
5446 src: "myapex-arm.apex",
5447 },
5448 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005449 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5450 }
5451
5452 prebuilt_bootclasspath_fragment {
5453 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005454 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005455 contents: ["libfoo", "libbar"],
5456 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005457 hidden_api: {
5458 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5459 metadata: "my-bootclasspath-fragment/metadata.csv",
5460 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005461 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5462 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5463 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005464 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
Spandan Das52c01a12024-09-20 01:09:48 +00005467 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 name: "libfoo",
5469 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005470 public: {
5471 jars: ["libfoo.jar"],
5472 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005474 shared_library: false,
5475 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 }
5477
5478 java_library {
5479 name: "libfoo",
5480 srcs: ["foo/bar/MyClass.java"],
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005483 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 }
Paul Duffin37856732021-02-26 14:24:15 +00005485
5486 java_sdk_library_import {
5487 name: "libbar",
5488 prefer: true,
5489 public: {
5490 jars: ["libbar.jar"],
5491 },
5492 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005493 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005494 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005495 }
5496
5497 java_sdk_library {
5498 name: "libbar",
5499 srcs: ["foo/bar/MyClass.java"],
5500 unsafe_ignore_missing_latest_api: true,
5501 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005502 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005503 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 `
5505
Paul Duffin89f570a2021-06-16 01:42:33 +01005506 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005507
Paul Duffin537ea3d2021-05-14 10:38:00 +01005508 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005509 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005510 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005511 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005512 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 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 +01005514 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 })
5516
5517 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005518 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 bp := `
5520 apex {
5521 name: "myapex",
5522 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005523 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005524 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525 }
5526
5527 apex_key {
5528 name: "myapex.key",
5529 public_key: "testkey.avbpubkey",
5530 private_key: "testkey.pem",
5531 }
5532
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005533 bootclasspath_fragment {
5534 name: "my-bootclasspath-fragment",
5535 contents: ["libfoo", "libbar"],
5536 apex_available: ["myapex"],
5537 hidden_api: {
5538 split_packages: ["*"],
5539 },
5540 }
5541
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005542 prebuilt_apex {
5543 name: "myapex",
5544 arch: {
5545 arm64: {
5546 src: "myapex-arm64.apex",
5547 },
5548 arm: {
5549 src: "myapex-arm.apex",
5550 },
5551 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005552 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5553 }
5554
5555 prebuilt_bootclasspath_fragment {
5556 name: "my-bootclasspath-fragment",
5557 contents: ["libfoo", "libbar"],
5558 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005559 hidden_api: {
5560 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5561 metadata: "my-bootclasspath-fragment/metadata.csv",
5562 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005563 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5564 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5565 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005566 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
5568
5569 java_import {
5570 name: "libfoo",
5571 jars: ["libfoo.jar"],
5572 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005573 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575
5576 java_library {
5577 name: "libfoo",
5578 srcs: ["foo/bar/MyClass.java"],
5579 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005580 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005581 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005582 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 }
Paul Duffin37856732021-02-26 14:24:15 +00005584
5585 java_sdk_library_import {
5586 name: "libbar",
5587 public: {
5588 jars: ["libbar.jar"],
5589 },
5590 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005592 }
5593
5594 java_sdk_library {
5595 name: "libbar",
5596 srcs: ["foo/bar/MyClass.java"],
5597 unsafe_ignore_missing_latest_api: true,
5598 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005599 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005600 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005601 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005602 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005603 `
5604
Paul Duffin89f570a2021-06-16 01:42:33 +01005605 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005606
Paul Duffin537ea3d2021-05-14 10:38:00 +01005607 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005608 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005609 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5610 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005611 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5612 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 +01005613 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 })
5615
5616 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005617 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618 bp := `
5619 apex {
5620 name: "myapex",
5621 enabled: false,
5622 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 }
5625
5626 apex_key {
5627 name: "myapex.key",
5628 public_key: "testkey.avbpubkey",
5629 private_key: "testkey.pem",
5630 }
5631
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005632 bootclasspath_fragment {
5633 name: "my-bootclasspath-fragment",
5634 enabled: false,
5635 contents: ["libfoo", "libbar"],
5636 apex_available: ["myapex"],
5637 hidden_api: {
5638 split_packages: ["*"],
5639 },
5640 }
5641
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 prebuilt_apex {
5643 name: "myapex",
5644 arch: {
5645 arm64: {
5646 src: "myapex-arm64.apex",
5647 },
5648 arm: {
5649 src: "myapex-arm.apex",
5650 },
5651 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005652 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5653 }
5654
5655 prebuilt_bootclasspath_fragment {
5656 name: "my-bootclasspath-fragment",
5657 contents: ["libfoo", "libbar"],
5658 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005659 hidden_api: {
5660 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5661 metadata: "my-bootclasspath-fragment/metadata.csv",
5662 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005663 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5664 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5665 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005666 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005667 }
5668
5669 java_import {
5670 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005671 jars: ["libfoo.jar"],
5672 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005673 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_library {
5677 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005678 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005679 srcs: ["foo/bar/MyClass.java"],
5680 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005681 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
Paul Duffin37856732021-02-26 14:24:15 +00005683
5684 java_sdk_library_import {
5685 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005686 public: {
5687 jars: ["libbar.jar"],
5688 },
5689 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005691 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005692 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005693 }
5694
5695 java_sdk_library {
5696 name: "libbar",
5697 srcs: ["foo/bar/MyClass.java"],
5698 unsafe_ignore_missing_latest_api: true,
5699 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005700 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005701 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702 `
Cole Fausta963b942024-04-11 17:43:00 -07005703 // This test disables libbar, which causes the ComponentDepsMutator to add
5704 // deps on libbar.stubs and other sub-modules that don't exist. We can
5705 // enable AllowMissingDependencies to work around that, but enabling that
5706 // causes extra checks for missing source files to dex_bootjars, so add those
5707 // to the mock fs as well.
5708 preparer2 := android.GroupFixturePreparers(
5709 preparer,
5710 android.PrepareForTestWithAllowMissingDependencies,
5711 android.FixtureMergeMockFs(map[string][]byte{
5712 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005713 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005714 }),
5715 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716
Cole Fausta963b942024-04-11 17:43:00 -07005717 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005718
Paul Duffin537ea3d2021-05-14 10:38:00 +01005719 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005720 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005721 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005722 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005723 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005724 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 +01005725 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005726 })
Spandan Das3a392012024-01-17 18:26:27 +00005727
Spandan Dasf2c10572024-02-27 04:49:52 +00005728 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005729 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005730 bp := `
5731 // Source
5732 apex {
5733 name: "myapex",
5734 enabled: false,
5735 key: "myapex.key",
5736 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5737 }
5738
5739 apex_key {
5740 name: "myapex.key",
5741 public_key: "testkey.avbpubkey",
5742 private_key: "testkey.pem",
5743 }
5744
5745 // Prebuilt
5746 prebuilt_apex {
5747 name: "myapex.v1",
5748 source_apex_name: "myapex",
5749 arch: {
5750 arm64: {
5751 src: "myapex-arm64.apex",
5752 },
5753 arm: {
5754 src: "myapex-arm.apex",
5755 },
5756 },
5757 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5758 prefer: true,
5759 }
5760 prebuilt_apex {
5761 name: "myapex.v2",
5762 source_apex_name: "myapex",
5763 arch: {
5764 arm64: {
5765 src: "myapex-arm64.apex",
5766 },
5767 arm: {
5768 src: "myapex-arm.apex",
5769 },
5770 },
5771 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5772 prefer: true,
5773 }
5774
5775 prebuilt_bootclasspath_fragment {
5776 name: "my-bootclasspath-fragment",
5777 contents: ["libfoo", "libbar"],
5778 apex_available: ["myapex"],
5779 hidden_api: {
5780 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5781 metadata: "my-bootclasspath-fragment/metadata.csv",
5782 index: "my-bootclasspath-fragment/index.csv",
5783 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5784 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5785 },
5786 prefer: true,
5787 }
5788
5789 java_import {
5790 name: "libfoo",
5791 jars: ["libfoo.jar"],
5792 apex_available: ["myapex"],
5793 prefer: true,
5794 }
5795 java_import {
5796 name: "libbar",
5797 jars: ["libbar.jar"],
5798 apex_available: ["myapex"],
5799 prefer: true,
5800 }
5801 `
5802
Spandan Dasf2c10572024-02-27 04:49:52 +00005803 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 +00005804 })
5805
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005806}
5807
Roland Levillain630846d2019-06-26 12:48:34 +01005808func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005809 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005810 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005811 apex_test {
5812 name: "myapex",
5813 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005814 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005815 tests: [
5816 "mytest",
5817 ],
5818 }
5819
5820 apex_key {
5821 name: "myapex.key",
5822 public_key: "testkey.avbpubkey",
5823 private_key: "testkey.pem",
5824 }
5825
Liz Kammer1c14a212020-05-12 15:26:55 -07005826 filegroup {
5827 name: "fg",
5828 srcs: [
5829 "baz",
5830 "bar/baz"
5831 ],
5832 }
5833
Roland Levillain630846d2019-06-26 12:48:34 +01005834 cc_test {
5835 name: "mytest",
5836 gtest: false,
5837 srcs: ["mytest.cpp"],
5838 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005839 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005840 system_shared_libs: [],
5841 static_executable: true,
5842 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005843 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005844 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005845
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005846 cc_library {
5847 name: "mylib",
5848 srcs: ["mylib.cpp"],
5849 system_shared_libs: [],
5850 stl: "none",
5851 }
5852
Liz Kammer5bd365f2020-05-27 15:15:11 -07005853 filegroup {
5854 name: "fg2",
5855 srcs: [
5856 "testdata/baz"
5857 ],
5858 }
Roland Levillain630846d2019-06-26 12:48:34 +01005859 `)
5860
Jooyung Hana0503a52023-08-23 13:12:50 +09005861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005862 copyCmds := apexRule.Args["copy_commands"]
5863
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005864 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005865 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005866 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005867
Liz Kammer1c14a212020-05-12 15:26:55 -07005868 //Ensure that test data are copied into apex.
5869 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5870 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5871
Roland Levillainf89cd092019-07-29 16:22:59 +01005872 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005873 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005874 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005875 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005876 prefix := "TARGET_"
5877 var builder strings.Builder
5878 data.Custom(&builder, name, prefix, "", data)
5879 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005880 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005881 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005882}
5883
Jooyung Hand48f3c32019-08-23 11:18:57 +09005884func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005885 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005886 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 native_shared_libs: ["libfoo"],
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 cc_library {
5900 name: "libfoo",
5901 stl: "none",
5902 system_shared_libs: [],
5903 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005904 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005905 }
5906 `)
5907 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5908 apex {
5909 name: "myapex",
5910 key: "myapex.key",
5911 java_libs: ["myjar"],
5912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 java_library {
5921 name: "myjar",
5922 srcs: ["foo/bar/MyClass.java"],
5923 sdk_version: "none",
5924 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005925 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005926 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005927 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005928 }
5929 `)
5930}
5931
Bill Peckhama41a6962021-01-11 10:58:54 -08005932func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005933 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005934 apex {
5935 name: "myapex",
5936 key: "myapex.key",
5937 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005938 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 }
5940
5941 apex_key {
5942 name: "myapex.key",
5943 public_key: "testkey.avbpubkey",
5944 private_key: "testkey.pem",
5945 }
5946
5947 java_import {
5948 name: "myjavaimport",
5949 apex_available: ["myapex"],
5950 jars: ["my.jar"],
5951 compile_dex: true,
5952 }
5953 `)
5954
Jooyung Hana0503a52023-08-23 13:12:50 +09005955 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005956 apexRule := module.Rule("apexRule")
5957 copyCmds := apexRule.Args["copy_commands"]
5958 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5959}
5960
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005961func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005962 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005963 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005964 apex {
5965 name: "myapex",
5966 key: "myapex.key",
5967 apps: [
5968 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005969 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005970 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005971 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
5973
5974 apex_key {
5975 name: "myapex.key",
5976 public_key: "testkey.avbpubkey",
5977 private_key: "testkey.pem",
5978 }
5979
5980 android_app {
5981 name: "AppFoo",
5982 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005983 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005984 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005985 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005986 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005988 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005989 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005990
5991 android_app {
5992 name: "AppFooPriv",
5993 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005994 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005995 system_modules: "none",
5996 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005997 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005999 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006000 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006001
6002 cc_library_shared {
6003 name: "libjni",
6004 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006005 shared_libs: ["libfoo"],
6006 stl: "none",
6007 system_shared_libs: [],
6008 apex_available: [ "myapex" ],
6009 sdk_version: "current",
6010 }
6011
6012 cc_library_shared {
6013 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006014 stl: "none",
6015 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006016 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006017 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006018 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006019 `)
6020
Jooyung Hana0503a52023-08-23 13:12:50 +09006021 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006022 apexRule := module.Rule("apexRule")
6023 copyCmds := apexRule.Args["copy_commands"]
6024
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006025 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6026 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006027 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006028
Colin Crossaede88c2020-08-11 12:17:01 -07006029 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006030 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006031 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006032 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006033 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006034 // JNI libraries including transitive deps are
6035 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006036 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006037 // ... embedded inside APK (jnilibs.zip)
6038 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6039 // ... and not directly inside the APEX
6040 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6041 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006042
6043 apexBundle := module.Module().(*apexBundle)
6044 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6045 var builder strings.Builder
6046 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6047 androidMk := builder.String()
6048 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6049 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6050 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6051 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6052 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6053 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 +01006054}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006055
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006056func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006057 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006058 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6059 for _, id := range invalidBuildIds {
6060 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6061 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6062 variables.BuildId = proptools.StringPtr(id)
6063 })
6064 testApexError(t, message, `apex {
6065 name: "myapex",
6066 key: "myapex.key",
6067 apps: ["AppFooPrebuilt"],
6068 updatable: false,
6069 }
6070
6071 apex_key {
6072 name: "myapex.key",
6073 public_key: "testkey.avbpubkey",
6074 private_key: "testkey.pem",
6075 }
6076
6077 android_app_import {
6078 name: "AppFooPrebuilt",
6079 apk: "PrebuiltAppFoo.apk",
6080 presigned: true,
6081 apex_available: ["myapex"],
6082 }
6083 `, fixture)
6084 }
6085}
6086
Dario Frenicde2a032019-10-27 00:29:22 +01006087func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006088 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006089 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006090 apex {
6091 name: "myapex",
6092 key: "myapex.key",
6093 apps: [
6094 "AppFooPrebuilt",
6095 "AppFooPrivPrebuilt",
6096 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006097 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006098 }
6099
6100 apex_key {
6101 name: "myapex.key",
6102 public_key: "testkey.avbpubkey",
6103 private_key: "testkey.pem",
6104 }
6105
6106 android_app_import {
6107 name: "AppFooPrebuilt",
6108 apk: "PrebuiltAppFoo.apk",
6109 presigned: true,
6110 dex_preopt: {
6111 enabled: false,
6112 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006113 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006114 }
6115
6116 android_app_import {
6117 name: "AppFooPrivPrebuilt",
6118 apk: "PrebuiltAppFooPriv.apk",
6119 privileged: true,
6120 presigned: true,
6121 dex_preopt: {
6122 enabled: false,
6123 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006124 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006125 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006126 }
6127 `)
6128
Jooyung Hana0503a52023-08-23 13:12:50 +09006129 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006130 apexRule := module.Rule("apexRule")
6131 copyCmds := apexRule.Args["copy_commands"]
6132
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006133 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6134 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006135}
6136
6137func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006139 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 apps: [
6144 "AppFoo",
6145 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006146 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 android_app {
6156 name: "AppFoo",
6157 srcs: ["foo/bar/MyClass.java"],
6158 sdk_version: "none",
6159 system_modules: "none",
6160 apex_available: [ "myapex" ],
6161 }
6162
6163 android_app_import {
6164 name: "AppFoo",
6165 apk: "AppFooPrebuilt.apk",
6166 filename: "AppFooPrebuilt.apk",
6167 presigned: true,
6168 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006169 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006170 }
6171 `, withFiles(map[string][]byte{
6172 "AppFooPrebuilt.apk": nil,
6173 }))
6174
Jooyung Hana0503a52023-08-23 13:12:50 +09006175 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006176 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006177 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006178}
6179
Dario Freni6f3937c2019-12-20 22:58:03 +00006180func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006181 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006182 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006183 apex {
6184 name: "myapex",
6185 key: "myapex.key",
6186 apps: [
6187 "TesterHelpAppFoo",
6188 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006189 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006190 }
6191
6192 apex_key {
6193 name: "myapex.key",
6194 public_key: "testkey.avbpubkey",
6195 private_key: "testkey.pem",
6196 }
6197
6198 android_test_helper_app {
6199 name: "TesterHelpAppFoo",
6200 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006201 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006202 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006203 }
6204
6205 `)
6206
Jooyung Hana0503a52023-08-23 13:12:50 +09006207 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006208 apexRule := module.Rule("apexRule")
6209 copyCmds := apexRule.Args["copy_commands"]
6210
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006211 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006212}
6213
Jooyung Han18020ea2019-11-13 10:50:48 +09006214func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006215 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006216 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006217 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006218 apex {
6219 name: "myapex",
6220 key: "myapex.key",
6221 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006222 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 apex {
6232 name: "otherapex",
6233 key: "myapex.key",
6234 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006235 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006236 }
6237
6238 cc_defaults {
6239 name: "libfoo-defaults",
6240 apex_available: ["otherapex"],
6241 }
6242
6243 cc_library {
6244 name: "libfoo",
6245 defaults: ["libfoo-defaults"],
6246 stl: "none",
6247 system_shared_libs: [],
6248 }`)
6249}
6250
Paul Duffine52e66f2020-03-30 17:54:29 +01006251func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006252 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006254 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006255 apex {
6256 name: "myapex",
6257 key: "myapex.key",
6258 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006259 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006260 }
6261
6262 apex_key {
6263 name: "myapex.key",
6264 public_key: "testkey.avbpubkey",
6265 private_key: "testkey.pem",
6266 }
6267
6268 apex {
6269 name: "otherapex",
6270 key: "otherapex.key",
6271 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006272 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006273 }
6274
6275 apex_key {
6276 name: "otherapex.key",
6277 public_key: "testkey.avbpubkey",
6278 private_key: "testkey.pem",
6279 }
6280
6281 cc_library {
6282 name: "libfoo",
6283 stl: "none",
6284 system_shared_libs: [],
6285 apex_available: ["otherapex"],
6286 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006287
6288 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6289 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6290 testApex(t, `
6291 apex {
6292 name: "com.sdv.myapex",
6293 key: "myapex.key",
6294 native_shared_libs: ["libfoo"],
6295 updatable: false,
6296 product_specific: true,
6297 }
6298
6299 apex_key {
6300 name: "myapex.key",
6301 public_key: "testkey.avbpubkey",
6302 private_key: "testkey.pem",
6303 }
6304
6305 apex {
6306 name: "com.any.otherapex",
6307 key: "otherapex.key",
6308 native_shared_libs: ["libfoo"],
6309 updatable: false,
6310 }
6311
6312 apex_key {
6313 name: "otherapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 cc_library {
6319 name: "libfoo",
6320 stl: "none",
6321 system_shared_libs: [],
6322 apex_available: ["com.any.otherapex"],
6323 product_specific: true,
6324 }`,
6325 android.FixtureMergeMockFs(android.MockFS{
6326 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6327 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6328 }))
6329
6330 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6331 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6332 apex {
6333 name: "com.sdv.myapex",
6334 key: "myapex.key",
6335 native_shared_libs: ["libfoo"],
6336 updatable: false,
6337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
6345 apex {
6346 name: "com.any.otherapex",
6347 key: "otherapex.key",
6348 native_shared_libs: ["libfoo"],
6349 updatable: false,
6350 }
6351
6352 apex_key {
6353 name: "otherapex.key",
6354 public_key: "testkey.avbpubkey",
6355 private_key: "testkey.pem",
6356 }
6357
6358 cc_library {
6359 name: "libfoo",
6360 stl: "none",
6361 system_shared_libs: [],
6362 apex_available: ["com.any.otherapex"],
6363 }`,
6364 android.FixtureMergeMockFs(android.MockFS{
6365 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6366 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6367 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006368}
Jiyong Park127b40b2019-09-30 16:04:35 +09006369
Paul Duffine52e66f2020-03-30 17:54:29 +01006370func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006371 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006372 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006373 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006374.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006375.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006376.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006377.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006378.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006379.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006380 apex {
6381 name: "myapex",
6382 key: "myapex.key",
6383 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006384 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006385 }
6386
6387 apex_key {
6388 name: "myapex.key",
6389 public_key: "testkey.avbpubkey",
6390 private_key: "testkey.pem",
6391 }
6392
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 cc_library {
6394 name: "libfoo",
6395 stl: "none",
6396 shared_libs: ["libbar"],
6397 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006398 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006399 }
6400
6401 cc_library {
6402 name: "libbar",
6403 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006404 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006406 apex_available: ["myapex"],
6407 }
6408
6409 cc_library {
6410 name: "libbaz",
6411 stl: "none",
6412 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006413 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006414
6415 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6416 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6417 testApex(t, `
6418 apex {
6419 name: "com.sdv.myapex",
6420 key: "myapex.key",
6421 native_shared_libs: ["libfoo"],
6422 updatable: false,
6423 product_specific: true,
6424 }
6425
6426 apex_key {
6427 name: "myapex.key",
6428 public_key: "testkey.avbpubkey",
6429 private_key: "testkey.pem",
6430 }
6431
6432 cc_library {
6433 name: "libfoo",
6434 stl: "none",
6435 shared_libs: ["libbar"],
6436 system_shared_libs: [],
6437 apex_available: ["com.sdv.myapex"],
6438 product_specific: true,
6439 }
6440
6441 cc_library {
6442 name: "libbar",
6443 stl: "none",
6444 shared_libs: ["libbaz"],
6445 system_shared_libs: [],
6446 apex_available: ["com.sdv.myapex"],
6447 product_specific: true,
6448 }
6449
6450 cc_library {
6451 name: "libbaz",
6452 stl: "none",
6453 system_shared_libs: [],
6454 product_specific: true,
6455 }`,
6456 android.FixtureMergeMockFs(android.MockFS{
6457 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6458 }))
6459
6460 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6461 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6462 apex {
6463 name: "com.sdv.myapex",
6464 key: "myapex.key",
6465 native_shared_libs: ["libfoo"],
6466 updatable: false,
6467 }
6468
6469 apex_key {
6470 name: "myapex.key",
6471 public_key: "testkey.avbpubkey",
6472 private_key: "testkey.pem",
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 stl: "none",
6478 shared_libs: ["libbar"],
6479 system_shared_libs: [],
6480 apex_available: ["com.sdv.myapex"],
6481 }
6482
6483 cc_library {
6484 name: "libbar",
6485 stl: "none",
6486 shared_libs: ["libbaz"],
6487 system_shared_libs: [],
6488 apex_available: ["com.sdv.myapex"],
6489 }
6490
6491 cc_library {
6492 name: "libbaz",
6493 stl: "none",
6494 system_shared_libs: [],
6495 }`,
6496 android.FixtureMergeMockFs(android.MockFS{
6497 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6498 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006499}
Jiyong Park127b40b2019-09-30 16:04:35 +09006500
Liz Kammer5f108fa2023-05-11 14:33:17 -04006501func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006502 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006503 testApex(t, `
6504 apex {
6505 name: "myapex",
6506 key: "myapex.key",
6507 native_shared_libs: ["libfoo"],
6508 updatable: false,
6509 }
6510
6511 apex_key {
6512 name: "myapex.key",
6513 public_key: "testkey.avbpubkey",
6514 private_key: "testkey.pem",
6515 }
6516
6517 cc_library {
6518 name: "libfoo",
6519 stl: "none",
6520 static_libs: ["libbar"],
6521 system_shared_libs: [],
6522 apex_available: ["myapex"],
6523 }
6524
6525 cc_library {
6526 name: "libbar",
6527 stl: "none",
6528 shared_libs: ["libbaz"],
6529 system_shared_libs: [],
6530 apex_available: ["myapex"],
6531 }
6532
6533 cc_library {
6534 name: "libbaz",
6535 stl: "none",
6536 system_shared_libs: [],
6537 }`)
6538
6539 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 native_shared_libs: ["libfoo"],
6544 updatable: false,
6545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 cc_library {
6554 name: "libfoo",
6555 stl: "none",
6556 static_libs: ["libbar"],
6557 system_shared_libs: [],
6558 apex_available: ["myapex"],
6559 }
6560
6561 cc_library {
6562 name: "libbar",
6563 stl: "none",
6564 system_shared_libs: [],
6565 }`)
6566}
6567
Paul Duffine52e66f2020-03-30 17:54:29 +01006568func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006569 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 testApexError(t, "\"otherapex\" is not a valid module name", `
6571 apex {
6572 name: "myapex",
6573 key: "myapex.key",
6574 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006575 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 apex_key {
6579 name: "myapex.key",
6580 public_key: "testkey.avbpubkey",
6581 private_key: "testkey.pem",
6582 }
6583
6584 cc_library {
6585 name: "libfoo",
6586 stl: "none",
6587 system_shared_libs: [],
6588 apex_available: ["otherapex"],
6589 }`)
6590
Paul Duffine52e66f2020-03-30 17:54:29 +01006591 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006592 apex {
6593 name: "myapex",
6594 key: "myapex.key",
6595 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006596 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006597 }
6598
6599 apex_key {
6600 name: "myapex.key",
6601 public_key: "testkey.avbpubkey",
6602 private_key: "testkey.pem",
6603 }
6604
6605 cc_library {
6606 name: "libfoo",
6607 stl: "none",
6608 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006609 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006610 apex_available: ["myapex"],
6611 }
6612
6613 cc_library {
6614 name: "libbar",
6615 stl: "none",
6616 system_shared_libs: [],
6617 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006618 }
6619
6620 cc_library {
6621 name: "libbaz",
6622 stl: "none",
6623 system_shared_libs: [],
6624 stubs: {
6625 versions: ["10", "20", "30"],
6626 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006627 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006628}
Jiyong Park127b40b2019-09-30 16:04:35 +09006629
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006630func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006631 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006632 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006633 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006634 testApexError(t, "expected an integer between 0-9; got -1", `
6635 apex {
6636 name: "myapex",
6637 key: "myapex.key",
6638 apex_available_name: "com.android.foo",
6639 variant_version: "-1",
6640 updatable: false,
6641 }
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647 `)
6648 })
6649
6650 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006651 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006652 testApexError(t, "expected an integer between 0-9; got 10", `
6653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
6656 apex_available_name: "com.android.foo",
6657 variant_version: "10",
6658 updatable: false,
6659 }
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }
6665 `)
6666 })
6667}
6668
6669func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006670 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006671 context := android.GroupFixturePreparers(
6672 android.PrepareForIntegrationTestWithAndroid,
6673 PrepareForTestWithApexBuildComponents,
6674 android.FixtureMergeMockFs(android.MockFS{
6675 "system/sepolicy/apex/foo-file_contexts": nil,
6676 "system/sepolicy/apex/bar-file_contexts": nil,
6677 }),
6678 )
6679 result := context.RunTestWithBp(t, `
6680 apex {
6681 name: "foo",
6682 key: "myapex.key",
6683 apex_available_name: "com.android.foo",
6684 variant_version: "0",
6685 updatable: false,
6686 }
6687 apex {
6688 name: "bar",
6689 key: "myapex.key",
6690 apex_available_name: "com.android.foo",
6691 variant_version: "3",
6692 updatable: false,
6693 }
6694 apex_key {
6695 name: "myapex.key",
6696 public_key: "testkey.avbpubkey",
6697 private_key: "testkey.pem",
6698 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006699 override_apex {
6700 name: "myoverrideapex",
6701 base: "bar",
6702 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 `)
6704
Jooyung Hana0503a52023-08-23 13:12:50 +09006705 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006706 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006707 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6708 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6709 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6710 }
6711
Jooyung Hana0503a52023-08-23 13:12:50 +09006712 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006713 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6715 barActualDefaultVersion := barManifestRule.Args["default_version"]
6716 if barActualDefaultVersion != barExpectedDefaultVersion {
6717 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6718 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006719
Spandan Das50801e22024-05-13 18:29:45 +00006720 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006721 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6722 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6723 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6724 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006725}
6726
Sam Delmericoca816532023-06-02 14:09:50 -04006727func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006728 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006729 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 -07006730 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006731 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6732 apex {
6733 name: "myapex_sminus",
6734 key: "myapex.key",
6735 apps: ["AppFoo"],
6736 apex_available_name: "myapex",
6737 updatable: false,
6738 }
6739 apex {
6740 name: "myapex",
6741 key: "myapex.key",
6742 apps: ["AppFoo"],
6743 updatable: false,
6744 }
6745 apex_key {
6746 name: "myapex.key",
6747 public_key: "testkey.avbpubkey",
6748 private_key: "testkey.pem",
6749 }
6750 android_app {
6751 name: "AppFoo",
6752 srcs: ["foo/bar/MyClass.java"],
6753 sdk_version: "none",
6754 system_modules: "none",
6755 apex_available: [ "myapex_sminus" ],
6756 }`,
6757 android.FixtureMergeMockFs(android.MockFS{
6758 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6759 }),
6760 )
6761 })
6762
6763 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 -07006764 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006765 testApex(t, `
6766 apex {
6767 name: "myapex_sminus",
6768 key: "myapex.key",
6769 apps: ["AppFoo"],
6770 apex_available_name: "myapex",
6771 updatable: false,
6772 }
6773 apex {
6774 name: "myapex",
6775 key: "myapex.key",
6776 apps: ["AppFoo"],
6777 updatable: false,
6778 }
6779 apex_key {
6780 name: "myapex.key",
6781 public_key: "testkey.avbpubkey",
6782 private_key: "testkey.pem",
6783 }
6784 android_app {
6785 name: "AppFoo",
6786 srcs: ["foo/bar/MyClass.java"],
6787 sdk_version: "none",
6788 system_modules: "none",
6789 apex_available: [ "myapex" ],
6790 }`,
6791 android.FixtureMergeMockFs(android.MockFS{
6792 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6793 }),
6794 )
6795 })
6796
6797 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006798 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006799 testApex(t, `
6800 override_apex {
6801 name: "myoverrideapex_sminus",
6802 base: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFooOverride"],
6805 }
6806 override_apex {
6807 name: "myoverrideapex",
6808 base: "myapex",
6809 key: "myapex.key",
6810 apps: ["AppFooOverride"],
6811 }
6812 apex {
6813 name: "myapex_sminus",
6814 key: "myapex.key",
6815 apps: ["AppFoo"],
6816 apex_available_name: "myapex",
6817 updatable: false,
6818 }
6819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
6822 apps: ["AppFoo"],
6823 updatable: false,
6824 }
6825 apex_key {
6826 name: "myapex.key",
6827 public_key: "testkey.avbpubkey",
6828 private_key: "testkey.pem",
6829 }
6830 android_app {
6831 name: "AppFooOverride",
6832 srcs: ["foo/bar/MyClass.java"],
6833 sdk_version: "none",
6834 system_modules: "none",
6835 apex_available: [ "myapex" ],
6836 }
6837 android_app {
6838 name: "AppFoo",
6839 srcs: ["foo/bar/MyClass.java"],
6840 sdk_version: "none",
6841 system_modules: "none",
6842 apex_available: [ "myapex" ],
6843 }`,
6844 android.FixtureMergeMockFs(android.MockFS{
6845 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6846 }),
6847 )
6848 })
6849}
6850
6851func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006852 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006853 context := android.GroupFixturePreparers(
6854 android.PrepareForIntegrationTestWithAndroid,
6855 PrepareForTestWithApexBuildComponents,
6856 java.PrepareForTestWithDexpreopt,
6857 android.FixtureMergeMockFs(android.MockFS{
6858 "system/sepolicy/apex/myapex-file_contexts": nil,
6859 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6860 }),
6861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6862 variables.BuildId = proptools.StringPtr("buildid")
6863 }),
6864 )
6865 context.RunTestWithBp(t, `
6866 override_apex {
6867 name: "myoverrideapex_sminus",
6868 base: "myapex_sminus",
6869 }
6870 override_apex {
6871 name: "myoverrideapex",
6872 base: "myapex",
6873 }
6874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 apps: ["AppFoo"],
6878 updatable: false,
6879 }
6880 apex {
6881 name: "myapex_sminus",
6882 apex_available_name: "myapex",
6883 key: "myapex.key",
6884 apps: ["AppFoo_sminus"],
6885 updatable: false,
6886 }
6887 apex_key {
6888 name: "myapex.key",
6889 public_key: "testkey.avbpubkey",
6890 private_key: "testkey.pem",
6891 }
6892 android_app {
6893 name: "AppFoo",
6894 srcs: ["foo/bar/MyClass.java"],
6895 sdk_version: "none",
6896 system_modules: "none",
6897 apex_available: [ "myapex" ],
6898 }
6899 android_app {
6900 name: "AppFoo_sminus",
6901 srcs: ["foo/bar/MyClass.java"],
6902 sdk_version: "none",
6903 min_sdk_version: "29",
6904 system_modules: "none",
6905 apex_available: [ "myapex" ],
6906 }`)
6907}
6908
Jiyong Park89e850a2020-04-07 16:37:39 +09006909func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006910 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006911 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006915 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 }
6918
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "libfoo",
6927 stl: "none",
6928 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006929 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006931 }
6932
6933 cc_library {
6934 name: "libfoo2",
6935 stl: "none",
6936 system_shared_libs: [],
6937 shared_libs: ["libbaz"],
6938 apex_available: ["//apex_available:platform"],
6939 }
6940
6941 cc_library {
6942 name: "libbar",
6943 stl: "none",
6944 system_shared_libs: [],
6945 apex_available: ["myapex"],
6946 }
6947
6948 cc_library {
6949 name: "libbaz",
6950 stl: "none",
6951 system_shared_libs: [],
6952 apex_available: ["myapex"],
6953 stubs: {
6954 versions: ["1"],
6955 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006956 }`)
6957
Jiyong Park89e850a2020-04-07 16:37:39 +09006958 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6959 // because it depends on libbar which isn't available to platform
6960 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6961 if libfoo.NotAvailableForPlatform() != true {
6962 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6963 }
6964
6965 // libfoo2 however can be available to platform because it depends on libbaz which provides
6966 // stubs
6967 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6968 if libfoo2.NotAvailableForPlatform() == true {
6969 t.Errorf("%q should be available to platform", libfoo2.String())
6970 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006971}
Jiyong Parka90ca002019-10-07 15:47:24 +09006972
Paul Duffine52e66f2020-03-30 17:54:29 +01006973func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006974 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006975 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006976 apex {
6977 name: "myapex",
6978 key: "myapex.key",
6979 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006980 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006981 }
6982
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988
6989 cc_library {
6990 name: "libfoo",
6991 stl: "none",
6992 system_shared_libs: [],
6993 apex_available: ["myapex"],
6994 static: {
6995 apex_available: ["//apex_available:platform"],
6996 },
6997 }`)
6998
Jiyong Park89e850a2020-04-07 16:37:39 +09006999 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7000 if libfooShared.NotAvailableForPlatform() != true {
7001 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7002 }
7003 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7004 if libfooStatic.NotAvailableForPlatform() != false {
7005 t.Errorf("%q should be available to platform", libfooStatic.String())
7006 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007007}
7008
Jooyung Han9a419e22024-08-16 17:14:21 +09007009func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007010 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007011
7012 for _, tc := range []struct {
7013 name string
7014 apexAvailable string
7015 expectedError string
7016 }{
7017 {
7018 name: "prefix matches correctly",
7019 apexAvailable: "com.foo.*",
7020 },
7021 {
7022 name: "prefix doesn't match",
7023 apexAvailable: "com.bar.*",
7024 expectedError: `Consider .* "com.foo\.\*"`,
7025 },
7026 {
7027 name: "short prefix",
7028 apexAvailable: "com.*",
7029 expectedError: "requires two or more components",
7030 },
7031 {
7032 name: "wildcard not in the end",
7033 apexAvailable: "com.*.foo",
7034 expectedError: "should end with .*",
7035 },
7036 {
7037 name: "wildcard in the middle",
7038 apexAvailable: "com.foo*.*",
7039 expectedError: "not allowed in the middle",
7040 },
7041 {
7042 name: "hint with prefix pattern",
7043 apexAvailable: "//apex_available:platform",
7044 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7045 },
7046 } {
7047 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007048 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007049 errorHandler := android.FixtureExpectsNoErrors
7050 if tc.expectedError != "" {
7051 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7052 }
7053 context := android.GroupFixturePreparers(
7054 prepareForApexTest,
7055 android.FixtureMergeMockFs(android.MockFS{
7056 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7057 }),
7058 ).ExtendWithErrorHandler(errorHandler)
7059
7060 context.RunTestWithBp(t, `
7061 apex {
7062 name: "com.foo.bar",
7063 key: "myapex.key",
7064 native_shared_libs: ["libfoo"],
7065 updatable: false,
7066 }
7067
7068 apex_key {
7069 name: "myapex.key",
7070 public_key: "testkey.avbpubkey",
7071 private_key: "testkey.pem",
7072 }
7073
7074 cc_library {
7075 name: "libfoo",
7076 stl: "none",
7077 system_shared_libs: [],
7078 apex_available: ["`+tc.apexAvailable+`"],
7079 }`)
7080 })
7081 }
7082 testApexError(t, `Consider adding "com.foo" to`, `
7083 apex {
7084 name: "com.foo", // too short for a partner apex
7085 key: "myapex.key",
7086 native_shared_libs: ["libfoo"],
7087 updatable: false,
7088 }
7089
7090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "libfoo",
7098 stl: "none",
7099 system_shared_libs: [],
7100 }
7101 `)
7102}
7103
Jooyung Hanb9518072024-11-22 14:05:20 +09007104func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7105 t.Parallel()
7106 ctx := testApex(t, `
7107 apex_test {
7108 name: "myapex",
7109 key: "myapex.key",
7110 skip_validations: {
7111 host_apex_verifier: true,
7112 },
7113 updatable: false,
7114 }
7115 apex_key {
7116 name: "myapex.key",
7117 public_key: "testkey.avbpubkey",
7118 private_key: "testkey.pem",
7119 }
7120 `)
7121
7122 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7123 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7124 t.Error("should not run host_apex_verifier")
7125 }
7126}
7127
7128func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7129 t.Parallel()
7130 ctx := testApex(t, `
7131 apex_test {
7132 name: "myapex",
7133 key: "myapex.key",
7134 updatable: false,
7135 }
7136 apex_key {
7137 name: "myapex.key",
7138 public_key: "testkey.avbpubkey",
7139 private_key: "testkey.pem",
7140 }
7141 `)
7142
7143 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7144 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7145 t.Error("should run host_apex_verifier")
7146 }
7147}
7148
Jiyong Park5d790c32019-11-15 18:40:32 +09007149func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007150 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007151 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007152 apex {
7153 name: "myapex",
7154 key: "myapex.key",
7155 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007156 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007157 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007158 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007159 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007160 }
7161
7162 override_apex {
7163 name: "override_myapex",
7164 base: "myapex",
7165 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007166 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007167 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007168 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007169 compile_multilib: "first",
7170 multilib: {
7171 lib32: {
7172 native_shared_libs: ["mylib32"],
7173 },
7174 lib64: {
7175 native_shared_libs: ["mylib64"],
7176 },
7177 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007178 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007179 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007180 key: "mynewapex.key",
7181 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007182 }
7183
7184 apex_key {
7185 name: "myapex.key",
7186 public_key: "testkey.avbpubkey",
7187 private_key: "testkey.pem",
7188 }
7189
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007190 apex_key {
7191 name: "mynewapex.key",
7192 public_key: "testkey2.avbpubkey",
7193 private_key: "testkey2.pem",
7194 }
7195
7196 android_app_certificate {
7197 name: "myapex.certificate",
7198 certificate: "testkey",
7199 }
7200
Jiyong Park5d790c32019-11-15 18:40:32 +09007201 android_app {
7202 name: "app",
7203 srcs: ["foo/bar/MyClass.java"],
7204 package_name: "foo",
7205 sdk_version: "none",
7206 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007207 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007208 }
7209
7210 override_android_app {
7211 name: "override_app",
7212 base: "app",
7213 package_name: "bar",
7214 }
markchien7c803b82021-08-26 22:10:06 +08007215
7216 bpf {
7217 name: "bpf",
7218 srcs: ["bpf.c"],
7219 }
7220
7221 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007222 name: "overrideBpf",
7223 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007224 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007225
7226 prebuilt_etc {
7227 name: "myetc",
7228 src: "myprebuilt",
7229 }
7230
7231 prebuilt_etc {
7232 name: "override_myetc",
7233 src: "override_myprebuilt",
7234 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007235
7236 cc_library {
7237 name: "mylib32",
7238 apex_available: [ "myapex" ],
7239 }
7240
7241 cc_library {
7242 name: "mylib64",
7243 apex_available: [ "myapex" ],
7244 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007245 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007246
Jooyung Hana0503a52023-08-23 13:12:50 +09007247 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007248 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007249 if originalVariant.GetOverriddenBy() != "" {
7250 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7251 }
7252 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7253 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7254 }
7255
Spandan Das50801e22024-05-13 18:29:45 +00007256 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007257 apexRule := module.Rule("apexRule")
7258 copyCmds := apexRule.Args["copy_commands"]
7259
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007260 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7261 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007262
markchien7c803b82021-08-26 22:10:06 +08007263 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007264 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007265
Daniel Norman5a3ce132021-08-26 15:44:43 -07007266 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7267 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7268
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007269 apexBundle := module.Module().(*apexBundle)
7270 name := apexBundle.Name()
7271 if name != "override_myapex" {
7272 t.Errorf("name should be \"override_myapex\", but was %q", name)
7273 }
7274
Baligh Uddin004d7172020-02-19 21:29:28 -08007275 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7276 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7277 }
7278
Jiyong Park20bacab2020-03-03 11:45:41 +09007279 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007280 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007281 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7282
7283 signApkRule := module.Rule("signapk")
7284 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007285
Colin Crossaa255532020-07-03 13:18:24 -07007286 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007287 var builder strings.Builder
7288 data.Custom(&builder, name, "TARGET_", "", data)
7289 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007290 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7291 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007292 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007293 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007294 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007295 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007296 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007297 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007298}
7299
Albert Martineefabcf2022-03-21 20:11:16 +00007300func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007301 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007302 // Override from 29 to 31
7303 minSdkOverride31 := "31"
7304 ctx := testApex(t, `
7305 apex {
7306 name: "myapex",
7307 key: "myapex.key",
7308 native_shared_libs: ["mylib"],
7309 updatable: true,
7310 min_sdk_version: "29"
7311 }
7312
7313 override_apex {
7314 name: "override_myapex",
7315 base: "myapex",
7316 logging_parent: "com.foo.bar",
7317 package_name: "test.overridden.package"
7318 }
7319
7320 apex_key {
7321 name: "myapex.key",
7322 public_key: "testkey.avbpubkey",
7323 private_key: "testkey.pem",
7324 }
7325
7326 cc_library {
7327 name: "mylib",
7328 srcs: ["mylib.cpp"],
7329 runtime_libs: ["libbar"],
7330 system_shared_libs: [],
7331 stl: "none",
7332 apex_available: [ "myapex" ],
7333 min_sdk_version: "apex_inherit"
7334 }
7335
7336 cc_library {
7337 name: "libbar",
7338 srcs: ["mylib.cpp"],
7339 system_shared_libs: [],
7340 stl: "none",
7341 apex_available: [ "myapex" ],
7342 min_sdk_version: "apex_inherit"
7343 }
7344
7345 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7346
Jooyung Hana0503a52023-08-23 13:12:50 +09007347 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007348 copyCmds := apexRule.Args["copy_commands"]
7349
7350 // Ensure that direct non-stubs dep is always included
7351 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7352
7353 // Ensure that runtime_libs dep in included
7354 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7355
7356 // Ensure libraries target overridden min_sdk_version value
7357 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7358}
7359
7360func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007361 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007362 // Attempt to override from 31 to 29, should be a NOOP
7363 minSdkOverride29 := "29"
7364 ctx := testApex(t, `
7365 apex {
7366 name: "myapex",
7367 key: "myapex.key",
7368 native_shared_libs: ["mylib"],
7369 updatable: true,
7370 min_sdk_version: "31"
7371 }
7372
7373 override_apex {
7374 name: "override_myapex",
7375 base: "myapex",
7376 logging_parent: "com.foo.bar",
7377 package_name: "test.overridden.package"
7378 }
7379
7380 apex_key {
7381 name: "myapex.key",
7382 public_key: "testkey.avbpubkey",
7383 private_key: "testkey.pem",
7384 }
7385
7386 cc_library {
7387 name: "mylib",
7388 srcs: ["mylib.cpp"],
7389 runtime_libs: ["libbar"],
7390 system_shared_libs: [],
7391 stl: "none",
7392 apex_available: [ "myapex" ],
7393 min_sdk_version: "apex_inherit"
7394 }
7395
7396 cc_library {
7397 name: "libbar",
7398 srcs: ["mylib.cpp"],
7399 system_shared_libs: [],
7400 stl: "none",
7401 apex_available: [ "myapex" ],
7402 min_sdk_version: "apex_inherit"
7403 }
7404
7405 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7406
Jooyung Hana0503a52023-08-23 13:12:50 +09007407 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007408 copyCmds := apexRule.Args["copy_commands"]
7409
7410 // Ensure that direct non-stubs dep is always included
7411 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7412
7413 // Ensure that runtime_libs dep in included
7414 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7415
7416 // Ensure libraries target the original min_sdk_version value rather than the overridden
7417 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7418}
7419
Jooyung Han214bf372019-11-12 13:03:50 +09007420func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007421 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007422 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007423 apex {
7424 name: "myapex",
7425 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007426 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007427 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007428 }
7429
7430 apex_key {
7431 name: "myapex.key",
7432 public_key: "testkey.avbpubkey",
7433 private_key: "testkey.pem",
7434 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007435
7436 cc_library {
7437 name: "mylib",
7438 srcs: ["mylib.cpp"],
7439 stl: "libc++",
7440 system_shared_libs: [],
7441 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007442 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007443 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007444 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007445
Jooyung Hana0503a52023-08-23 13:12:50 +09007446 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007447 args := module.Rule("apexRule").Args
7448 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007449 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007450
7451 // The copies of the libraries in the apex should have one more dependency than
7452 // the ones outside the apex, namely the unwinder. Ideally we should check
7453 // the dependency names directly here but for some reason the names are blank in
7454 // this test.
7455 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007456 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007457 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7458 if len(apexImplicits) != len(nonApexImplicits)+1 {
7459 t.Errorf("%q missing unwinder dep", lib)
7460 }
7461 }
Jooyung Han214bf372019-11-12 13:03:50 +09007462}
7463
Paul Duffine05480a2021-03-08 15:07:14 +00007464var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007465 "api/current.txt": nil,
7466 "api/removed.txt": nil,
7467 "api/system-current.txt": nil,
7468 "api/system-removed.txt": nil,
7469 "api/test-current.txt": nil,
7470 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007471
Anton Hanssondff2c782020-12-21 17:10:01 +00007472 "100/public/api/foo.txt": nil,
7473 "100/public/api/foo-removed.txt": nil,
7474 "100/system/api/foo.txt": nil,
7475 "100/system/api/foo-removed.txt": nil,
7476
Paul Duffineedc5d52020-06-12 17:46:39 +01007477 // For java_sdk_library_import
7478 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007479}
7480
Jooyung Han58f26ab2019-12-18 15:34:32 +09007481func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007482 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007483 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007484 apex {
7485 name: "myapex",
7486 key: "myapex.key",
7487 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007488 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007489 }
7490
7491 apex_key {
7492 name: "myapex.key",
7493 public_key: "testkey.avbpubkey",
7494 private_key: "testkey.pem",
7495 }
7496
7497 java_sdk_library {
7498 name: "foo",
7499 srcs: ["a.java"],
7500 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007501 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007502 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007503
7504 prebuilt_apis {
7505 name: "sdk",
7506 api_dirs: ["100"],
7507 }
Paul Duffin9b879592020-05-26 13:21:35 +01007508 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007509
7510 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007511 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007512 "javalib/foo.jar",
7513 "etc/permissions/foo.xml",
7514 })
7515 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007516 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7517 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7518 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007519}
7520
Spandan Das3ee19692024-06-19 04:47:40 +00007521func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007522 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007523 ctx := testApex(t, `
7524 override_apex {
7525 name: "mycompanyapex",
7526 base: "myapex",
7527 }
7528 apex {
7529 name: "myapex",
7530 key: "myapex.key",
7531 java_libs: ["foo"],
7532 updatable: false,
7533 }
7534
7535 apex_key {
7536 name: "myapex.key",
7537 public_key: "testkey.avbpubkey",
7538 private_key: "testkey.pem",
7539 }
7540
7541 java_sdk_library {
7542 name: "foo",
7543 srcs: ["a.java"],
7544 api_packages: ["foo"],
7545 apex_available: [ "myapex" ],
7546 }
7547
7548 prebuilt_apis {
7549 name: "sdk",
7550 api_dirs: ["100"],
7551 }
7552 `, withFiles(filesForSdkLibrary))
7553
7554 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7555 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7556 // (com.android.foo), the filepath should not contain override apex name.
7557 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7558 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7559 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7560}
7561
Paul Duffin9b879592020-05-26 13:21:35 +01007562func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007563 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007564 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007565 apex {
7566 name: "myapex",
7567 key: "myapex.key",
7568 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007569 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007570 }
7571
7572 apex_key {
7573 name: "myapex.key",
7574 public_key: "testkey.avbpubkey",
7575 private_key: "testkey.pem",
7576 }
7577
7578 java_sdk_library {
7579 name: "foo",
7580 srcs: ["a.java"],
7581 api_packages: ["foo"],
7582 apex_available: ["myapex"],
7583 sdk_version: "none",
7584 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007585 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007586 }
7587
7588 java_library {
7589 name: "bar",
7590 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007591 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007592 apex_available: ["myapex"],
7593 sdk_version: "none",
7594 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007595 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007596 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007597
7598 prebuilt_apis {
7599 name: "sdk",
7600 api_dirs: ["100"],
7601 }
Paul Duffin9b879592020-05-26 13:21:35 +01007602 `, withFiles(filesForSdkLibrary))
7603
7604 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007605 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007606 "javalib/bar.jar",
7607 "javalib/foo.jar",
7608 "etc/permissions/foo.xml",
7609 })
7610
7611 // The bar library should depend on the implementation jar.
7612 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007613 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007614 t.Errorf("expected %q, found %#q", expected, actual)
7615 }
7616}
7617
7618func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007619 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007620 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007621 apex {
7622 name: "myapex",
7623 key: "myapex.key",
7624 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007625 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007626 }
7627
7628 apex_key {
7629 name: "myapex.key",
7630 public_key: "testkey.avbpubkey",
7631 private_key: "testkey.pem",
7632 }
7633
7634 java_sdk_library {
7635 name: "foo",
7636 srcs: ["a.java"],
7637 api_packages: ["foo"],
7638 apex_available: ["myapex"],
7639 sdk_version: "none",
7640 system_modules: "none",
7641 }
7642
7643 java_library {
7644 name: "bar",
7645 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007646 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007647 sdk_version: "none",
7648 system_modules: "none",
7649 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007650
7651 prebuilt_apis {
7652 name: "sdk",
7653 api_dirs: ["100"],
7654 }
Paul Duffin9b879592020-05-26 13:21:35 +01007655 `, withFiles(filesForSdkLibrary))
7656
7657 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007658 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007659 "javalib/foo.jar",
7660 "etc/permissions/foo.xml",
7661 })
7662
7663 // The bar library should depend on the stubs jar.
7664 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007665 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007666 t.Errorf("expected %q, found %#q", expected, actual)
7667 }
7668}
7669
Paul Duffineedc5d52020-06-12 17:46:39 +01007670func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007671 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007672 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007673 prebuilt_apis {
7674 name: "sdk",
7675 api_dirs: ["100"],
7676 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007677 withFiles(map[string][]byte{
7678 "apex/a.java": nil,
7679 "apex/apex_manifest.json": nil,
7680 "apex/Android.bp": []byte(`
7681 package {
7682 default_visibility: ["//visibility:private"],
7683 }
7684
7685 apex {
7686 name: "myapex",
7687 key: "myapex.key",
7688 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007689 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 }
7691
7692 apex_key {
7693 name: "myapex.key",
7694 public_key: "testkey.avbpubkey",
7695 private_key: "testkey.pem",
7696 }
7697
7698 java_library {
7699 name: "bar",
7700 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007701 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007702 apex_available: ["myapex"],
7703 sdk_version: "none",
7704 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007705 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007706 }
7707`),
7708 "source/a.java": nil,
7709 "source/api/current.txt": nil,
7710 "source/api/removed.txt": nil,
7711 "source/Android.bp": []byte(`
7712 package {
7713 default_visibility: ["//visibility:private"],
7714 }
7715
7716 java_sdk_library {
7717 name: "foo",
7718 visibility: ["//apex"],
7719 srcs: ["a.java"],
7720 api_packages: ["foo"],
7721 apex_available: ["myapex"],
7722 sdk_version: "none",
7723 system_modules: "none",
7724 public: {
7725 enabled: true,
7726 },
Colin Crosse4f34882024-11-14 12:26:00 -08007727 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007728 }
7729`),
7730 "prebuilt/a.jar": nil,
7731 "prebuilt/Android.bp": []byte(`
7732 package {
7733 default_visibility: ["//visibility:private"],
7734 }
7735
7736 java_sdk_library_import {
7737 name: "foo",
7738 visibility: ["//apex", "//source"],
7739 apex_available: ["myapex"],
7740 prefer: true,
7741 public: {
7742 jars: ["a.jar"],
7743 },
Colin Crosse4f34882024-11-14 12:26:00 -08007744 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007745 }
7746`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007747 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007748 )
7749
7750 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007751 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007752 "javalib/bar.jar",
7753 "javalib/foo.jar",
7754 "etc/permissions/foo.xml",
7755 })
7756
7757 // The bar library should depend on the implementation jar.
7758 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007759 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007760 t.Errorf("expected %q, found %#q", expected, actual)
7761 }
7762}
7763
7764func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007765 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007766 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7767 apex {
7768 name: "myapex",
7769 key: "myapex.key",
7770 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007771 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007772 }
7773
7774 apex_key {
7775 name: "myapex.key",
7776 public_key: "testkey.avbpubkey",
7777 private_key: "testkey.pem",
7778 }
7779
7780 java_sdk_library_import {
7781 name: "foo",
7782 apex_available: ["myapex"],
7783 prefer: true,
7784 public: {
7785 jars: ["a.jar"],
7786 },
7787 }
7788
7789 `, withFiles(filesForSdkLibrary))
7790}
7791
atrost6e126252020-01-27 17:01:16 +00007792func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007793 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007794 result := android.GroupFixturePreparers(
7795 prepareForApexTest,
7796 java.PrepareForTestWithPlatformCompatConfig,
7797 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007798 apex {
7799 name: "myapex",
7800 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007801 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007802 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007803 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007804 }
7805
7806 apex_key {
7807 name: "myapex.key",
7808 public_key: "testkey.avbpubkey",
7809 private_key: "testkey.pem",
7810 }
7811
7812 platform_compat_config {
7813 name: "myjar-platform-compat-config",
7814 src: ":myjar",
7815 }
7816
7817 java_library {
7818 name: "myjar",
7819 srcs: ["foo/bar/MyClass.java"],
7820 sdk_version: "none",
7821 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007822 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007823 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007824 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007825
7826 // Make sure that a preferred prebuilt does not affect the apex contents.
7827 prebuilt_platform_compat_config {
7828 name: "myjar-platform-compat-config",
7829 metadata: "compat-config/metadata.xml",
7830 prefer: true,
7831 }
atrost6e126252020-01-27 17:01:16 +00007832 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007833 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007834 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007835 "etc/compatconfig/myjar-platform-compat-config.xml",
7836 "javalib/myjar.jar",
7837 })
7838}
7839
Jooyung Han862c0d62022-12-21 10:15:37 +09007840func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007841 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007842 android.GroupFixturePreparers(
7843 android.PrepareForTestWithAndroidBuildComponents,
7844 PrepareForTestWithApexBuildComponents,
7845 prepareForTestWithMyapex,
7846 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7847 ).
7848 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7849 RunTestWithBp(t, `
7850 apex {
7851 name: "myapex",
7852 key: "myapex.key",
7853 prebuilts: ["foo", "bar"],
7854 updatable: false,
7855 }
7856
7857 apex_key {
7858 name: "myapex.key",
7859 public_key: "testkey.avbpubkey",
7860 private_key: "testkey.pem",
7861 }
7862
7863 prebuilt_etc {
7864 name: "foo",
7865 src: "myprebuilt",
7866 filename_from_src: true,
7867 }
7868
7869 prebuilt_etc {
7870 name: "bar",
7871 src: "myprebuilt",
7872 filename_from_src: true,
7873 }
7874 `)
7875}
7876
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007877func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007878 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007879 bp := `
7880 apex {
7881 name: "myapex",
7882 key: "myapex.key",
7883 native_shared_libs: ["libfoo"],
7884 updatable: false,
7885 unwanted_transitive_deps: ["libbar"],
7886 }
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: "libfoo",
7896 srcs: ["foo.cpp"],
7897 shared_libs: ["libbar"],
7898 apex_available: ["myapex"],
7899 }
7900
7901 cc_library {
7902 name: "libbar",
7903 srcs: ["bar.cpp"],
7904 apex_available: ["myapex"],
7905 }`
7906 ctx := testApex(t, bp)
7907 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7908 "*/libc++.so",
7909 "*/libfoo.so",
7910 // not libbar.so
7911 })
7912}
7913
Jiyong Park479321d2019-12-16 11:47:12 +09007914func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007915 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007916 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7917 apex {
7918 name: "myapex",
7919 key: "myapex.key",
7920 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007921 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007922 }
7923
7924 apex_key {
7925 name: "myapex.key",
7926 public_key: "testkey.avbpubkey",
7927 private_key: "testkey.pem",
7928 }
7929
7930 java_library {
7931 name: "myjar",
7932 srcs: ["foo/bar/MyClass.java"],
7933 sdk_version: "none",
7934 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007935 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007936 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007937 }
7938 `)
7939}
7940
Jiyong Park7cd10e32020-01-14 09:22:18 +09007941func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007942 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007943 bp := `
7944 apex {
7945 name: "myapex",
7946 key: "myapex.key",
7947 native_shared_libs: ["mylib"],
7948 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007949 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007950 }
7951
Jiyong Park9d677202020-02-19 16:29:35 +09007952 apex {
7953 name: "myapex.updatable",
7954 key: "myapex.key",
7955 native_shared_libs: ["mylib"],
7956 java_libs: ["myjar"],
7957 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007958 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007959 }
7960
Jiyong Park7cd10e32020-01-14 09:22:18 +09007961 apex_key {
7962 name: "myapex.key",
7963 public_key: "testkey.avbpubkey",
7964 private_key: "testkey.pem",
7965 }
7966
7967 cc_library {
7968 name: "mylib",
7969 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007970 shared_libs: [
7971 "myotherlib",
7972 "myotherlib_ext",
7973 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007974 system_shared_libs: [],
7975 stl: "none",
7976 apex_available: [
7977 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007978 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007979 "//apex_available:platform",
7980 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007981 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007982 }
7983
7984 cc_library {
7985 name: "myotherlib",
7986 srcs: ["mylib.cpp"],
7987 system_shared_libs: [],
7988 stl: "none",
7989 apex_available: [
7990 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007991 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007992 "//apex_available:platform",
7993 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007994 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 }
7996
Jiyong Parkce243632023-02-17 18:22:25 +09007997 cc_library {
7998 name: "myotherlib_ext",
7999 srcs: ["mylib.cpp"],
8000 system_shared_libs: [],
8001 system_ext_specific: true,
8002 stl: "none",
8003 apex_available: [
8004 "myapex",
8005 "myapex.updatable",
8006 "//apex_available:platform",
8007 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008008 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008009 }
8010
Jiyong Park7cd10e32020-01-14 09:22:18 +09008011 java_library {
8012 name: "myjar",
8013 srcs: ["foo/bar/MyClass.java"],
8014 sdk_version: "none",
8015 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008016 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008017 apex_available: [
8018 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008019 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008020 "//apex_available:platform",
8021 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008022 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008023 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008024 }
8025
8026 java_library {
8027 name: "myotherjar",
8028 srcs: ["foo/bar/MyClass.java"],
8029 sdk_version: "none",
8030 system_modules: "none",
8031 apex_available: [
8032 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008033 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008034 "//apex_available:platform",
8035 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008036 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008037 }
8038 `
8039
8040 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8041 for _, f := range files {
8042 if f.path == file {
8043 if f.isLink {
8044 t.Errorf("%q is not a real file", file)
8045 }
8046 return
8047 }
8048 }
8049 t.Errorf("%q is not found", file)
8050 }
8051
Jiyong Parkce243632023-02-17 18:22:25 +09008052 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008053 for _, f := range files {
8054 if f.path == file {
8055 if !f.isLink {
8056 t.Errorf("%q is not a symlink", file)
8057 }
Jiyong Parkce243632023-02-17 18:22:25 +09008058 if f.src != target {
8059 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8060 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008061 return
8062 }
8063 }
8064 t.Errorf("%q is not found", file)
8065 }
8066
Jiyong Park9d677202020-02-19 16:29:35 +09008067 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8068 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008069 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008070 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008071 ensureRealfileExists(t, files, "javalib/myjar.jar")
8072 ensureRealfileExists(t, files, "lib64/mylib.so")
8073 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008074 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008075
Jooyung Hana0503a52023-08-23 13:12:50 +09008076 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008077 ensureRealfileExists(t, files, "javalib/myjar.jar")
8078 ensureRealfileExists(t, files, "lib64/mylib.so")
8079 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008080 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008081
8082 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008083 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008084 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008085 ensureRealfileExists(t, files, "javalib/myjar.jar")
8086 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008087 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8088 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008089
Jooyung Hana0503a52023-08-23 13:12:50 +09008090 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008091 ensureRealfileExists(t, files, "javalib/myjar.jar")
8092 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008093 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8094 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008095}
8096
Yo Chiange8128052020-07-23 20:09:18 +08008097func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008098 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008099 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008100 apex {
8101 name: "myapex",
8102 key: "myapex.key",
8103 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008104 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008105 }
8106
8107 apex_key {
8108 name: "myapex.key",
8109 public_key: "testkey.avbpubkey",
8110 private_key: "testkey.pem",
8111 }
8112
8113 cc_library_shared {
8114 name: "mylib",
8115 srcs: ["mylib.cpp"],
8116 shared_libs: ["myotherlib"],
8117 system_shared_libs: [],
8118 stl: "none",
8119 apex_available: [
8120 "myapex",
8121 "//apex_available:platform",
8122 ],
8123 }
8124
8125 cc_prebuilt_library_shared {
8126 name: "myotherlib",
8127 srcs: ["prebuilt.so"],
8128 system_shared_libs: [],
8129 stl: "none",
8130 apex_available: [
8131 "myapex",
8132 "//apex_available:platform",
8133 ],
8134 }
8135 `)
8136
Jooyung Hana0503a52023-08-23 13:12:50 +09008137 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008138 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008139 var builder strings.Builder
8140 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8141 androidMk := builder.String()
8142 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008143 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008144 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8145 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8146 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008147 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008148}
8149
Jooyung Han643adc42020-02-27 13:50:06 +09008150func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008151 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008152 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008153 apex {
8154 name: "myapex",
8155 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008156 binaries: ["mybin"],
8157 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008158 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008159 }
8160
8161 apex_key {
8162 name: "myapex.key",
8163 public_key: "testkey.avbpubkey",
8164 private_key: "testkey.pem",
8165 }
8166
8167 cc_library {
8168 name: "mylib",
8169 srcs: ["mylib.cpp"],
8170 shared_libs: ["mylib2"],
8171 system_shared_libs: [],
8172 stl: "none",
8173 apex_available: [ "myapex" ],
8174 }
8175
8176 cc_library {
8177 name: "mylib2",
8178 srcs: ["mylib.cpp"],
8179 system_shared_libs: [],
8180 stl: "none",
8181 apex_available: [ "myapex" ],
8182 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008183
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008184 // Used as both a JNI library and a regular shared library.
8185 cc_library {
8186 name: "mylib3",
8187 srcs: ["mylib.cpp"],
8188 system_shared_libs: [],
8189 stl: "none",
8190 apex_available: [ "myapex" ],
8191 }
8192
8193 cc_binary {
8194 name: "mybin",
8195 srcs: ["mybin.cpp"],
8196 shared_libs: ["mylib3"],
8197 system_shared_libs: [],
8198 stl: "none",
8199 apex_available: [ "myapex" ],
8200 }
8201
Jiyong Park34d5c332022-02-24 18:02:44 +09008202 rust_ffi_shared {
8203 name: "libfoo.rust",
8204 crate_name: "foo",
8205 srcs: ["foo.rs"],
8206 shared_libs: ["libfoo.shared_from_rust"],
8207 prefer_rlib: true,
8208 apex_available: ["myapex"],
8209 }
8210
8211 cc_library_shared {
8212 name: "libfoo.shared_from_rust",
8213 srcs: ["mylib.cpp"],
8214 system_shared_libs: [],
8215 stl: "none",
8216 stubs: {
8217 versions: ["10", "11", "12"],
8218 },
8219 }
8220
Jooyung Han643adc42020-02-27 13:50:06 +09008221 `)
8222
Jooyung Hana0503a52023-08-23 13:12:50 +09008223 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008224 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008225 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008226 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008227 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008228 "lib64/mylib.so",
8229 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008230 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008231 "lib64/libfoo.rust.so",
8232 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8233 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008234 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008235
8236 // b/220397949
8237 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008238}
8239
Jooyung Han49f67012020-04-17 13:43:10 +09008240func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008241 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008242 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008243 apex {
8244 name: "myapex",
8245 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008246 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008247 }
8248 apex_key {
8249 name: "myapex.key",
8250 public_key: "testkey.avbpubkey",
8251 private_key: "testkey.pem",
8252 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008253 `,
8254 android.FixtureModifyConfig(func(config android.Config) {
8255 delete(config.Targets, android.Android)
8256 config.AndroidCommonTarget = android.Target{}
8257 }),
8258 )
Jooyung Han49f67012020-04-17 13:43:10 +09008259
8260 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8261 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8262 }
8263}
8264
Jiyong Parkbd159612020-02-28 15:22:21 +09008265func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008266 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008267 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008268 apex {
8269 name: "myapex",
8270 key: "myapex.key",
8271 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008272 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008273 }
8274
8275 apex_key {
8276 name: "myapex.key",
8277 public_key: "testkey.avbpubkey",
8278 private_key: "testkey.pem",
8279 }
8280
8281 android_app {
8282 name: "AppFoo",
8283 srcs: ["foo/bar/MyClass.java"],
8284 sdk_version: "none",
8285 system_modules: "none",
8286 apex_available: [ "myapex" ],
8287 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008288 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008289
Jooyung Hana0503a52023-08-23 13:12:50 +09008290 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008291 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008292
8293 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008294 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 +09008295}
8296
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008297func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008298 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008299 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008300 apex {
8301 name: "myapex",
8302 key: "myapex.key",
8303 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008304 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008305 }
8306
8307 apex_key {
8308 name: "myapex.key",
8309 public_key: "testkey.avbpubkey",
8310 private_key: "testkey.pem",
8311 }
8312
8313 android_app_set {
8314 name: "AppSet",
8315 set: "AppSet.apks",
8316 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008317 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008318 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008319 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008320 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8321 s := mod.Rule("apexRule").Args["copy_commands"]
8322 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008323 if len(copyCmds) != 4 {
8324 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008325 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008326 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8327 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008328 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8329 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008330
8331 // Ensure that canned_fs_config has an entry for the app set zip file
8332 generateFsRule := mod.Rule("generateFsConfig")
8333 cmd := generateFsRule.RuleParams.Command
8334 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008335}
8336
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008337func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008338 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008339 apex_set {
8340 name: "myapex",
8341 filename: "foo_v2.apex",
8342 sanitized: {
8343 none: { set: "myapex.apks", },
8344 hwaddress: { set: "myapex.hwasan.apks", },
8345 },
Paul Duffin24704672021-04-06 16:09:30 +01008346 }
8347 `
8348 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008349
Paul Duffin24704672021-04-06 16:09:30 +01008350 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008351 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008352
Spandan Das9d6e2092024-09-21 02:50:00 +00008353 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008354 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008355
Paul Duffin24704672021-04-06 16:09:30 +01008356 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8357
8358 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008359 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8360 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008361
8362 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008363}
8364
Pranav Guptaeba03b02022-09-27 00:27:08 +00008365func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008366 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008367 ctx := testApex(t, `
8368 apex_set {
8369 name: "myapex",
8370 set: ":myapex_apks_file",
8371 }
8372
8373 filegroup {
8374 name: "myapex_apks_file",
8375 srcs: ["myapex.apks"],
8376 }
8377 `)
8378
Spandan Das9d6e2092024-09-21 02:50:00 +00008379 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008380
8381 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008382 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008383 extractedApex := m.Output(extractorOutput)
8384
8385 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8386}
8387
Paul Duffin89f570a2021-06-16 01:42:33 +01008388func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008389 t.Helper()
8390
Paul Duffin55607122021-03-30 23:32:51 +01008391 fs := android.MockFS{
8392 "a.java": nil,
8393 "a.jar": nil,
8394 "apex_manifest.json": nil,
8395 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008396 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008397 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8398 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8399 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008400 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008401 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008402
Paul Duffin55607122021-03-30 23:32:51 +01008403 errorHandler := android.FixtureExpectsNoErrors
8404 if errmsg != "" {
8405 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008406 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008407
Paul Duffin55607122021-03-30 23:32:51 +01008408 result := android.GroupFixturePreparers(
8409 cc.PrepareForTestWithCcDefaultModules,
8410 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008411 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008412 java.PrepareForTestWithJavaSdkLibraryFiles,
8413 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008414 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008415 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008416 android.FixtureModifyMockFS(func(fs android.MockFS) {
8417 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8418 insert := ""
8419 for _, fragment := range fragments {
8420 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8421 }
8422 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8423 platform_bootclasspath {
8424 name: "platform-bootclasspath",
8425 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008426 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008427 %s
8428 ],
8429 }
8430 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008431 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008432 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008433 // Dexpreopt for boot jars requires the ART boot image profile.
8434 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8435 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008436 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008437 ).
8438 ExtendWithErrorHandler(errorHandler).
8439 RunTestWithBp(t, bp)
8440
8441 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008442}
8443
Jooyung Han548640b2020-04-27 12:10:30 +09008444func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008445 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008446 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8447 apex {
8448 name: "myapex",
8449 key: "myapex.key",
8450 updatable: true,
8451 }
8452
8453 apex_key {
8454 name: "myapex.key",
8455 public_key: "testkey.avbpubkey",
8456 private_key: "testkey.pem",
8457 }
8458 `)
8459}
8460
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008461func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008462 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008463 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8464 apex {
8465 name: "myapex",
8466 key: "myapex.key",
8467 }
8468
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }
8474 `)
8475}
8476
satayevb98371c2021-06-15 16:49:50 +01008477func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008478 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008479 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8480 apex {
8481 name: "myapex",
8482 key: "myapex.key",
8483 systemserverclasspath_fragments: [
8484 "mysystemserverclasspathfragment",
8485 ],
8486 min_sdk_version: "29",
8487 updatable: true,
8488 }
8489
8490 apex_key {
8491 name: "myapex.key",
8492 public_key: "testkey.avbpubkey",
8493 private_key: "testkey.pem",
8494 }
8495
8496 java_library {
8497 name: "foo",
8498 srcs: ["b.java"],
8499 min_sdk_version: "29",
8500 installable: true,
8501 apex_available: [
8502 "myapex",
8503 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008504 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008505 }
8506
8507 systemserverclasspath_fragment {
8508 name: "mysystemserverclasspathfragment",
8509 generate_classpaths_proto: false,
8510 contents: [
8511 "foo",
8512 ],
8513 apex_available: [
8514 "myapex",
8515 ],
8516 }
satayevabcd5972021-08-06 17:49:46 +01008517 `,
8518 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8519 )
satayevb98371c2021-06-15 16:49:50 +01008520}
8521
Paul Duffin064b70c2020-11-02 17:32:38 +00008522func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008523 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008524 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008525 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008526 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008527 fragment := java.ApexVariantReference{
8528 Apex: proptools.StringPtr("myapex"),
8529 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8530 }
8531
Paul Duffin064b70c2020-11-02 17:32:38 +00008532 testDexpreoptWithApexes(t, `
8533 prebuilt_apex {
8534 name: "myapex" ,
8535 arch: {
8536 arm64: {
8537 src: "myapex-arm64.apex",
8538 },
8539 arm: {
8540 src: "myapex-arm.apex",
8541 },
8542 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008543 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8544 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008545
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 prebuilt_bootclasspath_fragment {
8547 name: "my-bootclasspath-fragment",
8548 contents: ["libfoo"],
8549 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008550 hidden_api: {
8551 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8552 metadata: "my-bootclasspath-fragment/metadata.csv",
8553 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008554 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8555 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8556 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008557 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008558 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008559
Spandan Das52c01a12024-09-20 01:09:48 +00008560 java_sdk_library_import {
8561 name: "libfoo",
8562 prefer: true,
8563 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008564 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008565 },
8566 apex_available: ["myapex"],
8567 shared_library: false,
8568 permitted_packages: ["libfoo"],
8569 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008570 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008571 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008572}
8573
Spandan Dasf14e2542021-11-12 00:01:37 +00008574func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008575 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008576 bp += `
8577 apex_key {
8578 name: "myapex.key",
8579 public_key: "testkey.avbpubkey",
8580 private_key: "testkey.pem",
8581 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008582 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008583 "lib1/src/A.java": nil,
8584 "lib2/src/B.java": nil,
8585 "system/sepolicy/apex/myapex-file_contexts": nil,
8586 }
8587
Paul Duffin45338f02021-03-30 23:07:52 +01008588 errorHandler := android.FixtureExpectsNoErrors
8589 if errmsg != "" {
8590 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008591 }
Colin Crossae8600b2020-10-29 17:09:13 -07008592
Paul Duffin45338f02021-03-30 23:07:52 +01008593 android.GroupFixturePreparers(
8594 android.PrepareForTestWithAndroidBuildComponents,
8595 java.PrepareForTestWithJavaBuildComponents,
8596 PrepareForTestWithApexBuildComponents,
8597 android.PrepareForTestWithNeverallowRules(rules),
8598 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008599 apexBootJars := make([]string, 0, len(bootJars))
8600 for _, apexBootJar := range bootJars {
8601 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008602 }
satayevd604b212021-07-21 14:23:52 +01008603 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008604 }),
8605 fs.AddToFixture(),
8606 ).
8607 ExtendWithErrorHandler(errorHandler).
8608 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008609}
8610
8611func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008612 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008613 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008614 name string
8615 expectedError string
8616 bp string
8617 bootJars []string
8618 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008619 }{
8620
8621 {
8622 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8623 expectedError: "",
8624 bp: `
8625 java_library {
8626 name: "bcp_lib1",
8627 srcs: ["lib1/src/*.java"],
8628 permitted_packages: ["foo.bar"],
8629 apex_available: ["myapex"],
8630 sdk_version: "none",
8631 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008632 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008633 }
8634 java_library {
8635 name: "nonbcp_lib2",
8636 srcs: ["lib2/src/*.java"],
8637 apex_available: ["myapex"],
8638 permitted_packages: ["a.b"],
8639 sdk_version: "none",
8640 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008641 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008642 }
8643 apex {
8644 name: "myapex",
8645 key: "myapex.key",
8646 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008647 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008648 }`,
8649 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008650 bcpPermittedPackages: map[string][]string{
8651 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008652 "foo.bar",
8653 },
8654 },
8655 },
8656 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008657 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008658 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 +01008659 bp: `
8660 java_library {
8661 name: "bcp_lib1",
8662 srcs: ["lib1/src/*.java"],
8663 apex_available: ["myapex"],
8664 permitted_packages: ["foo.bar"],
8665 sdk_version: "none",
8666 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008667 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 }
8669 java_library {
8670 name: "bcp_lib2",
8671 srcs: ["lib2/src/*.java"],
8672 apex_available: ["myapex"],
8673 permitted_packages: ["foo.bar", "bar.baz"],
8674 sdk_version: "none",
8675 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008676 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008677 }
8678 apex {
8679 name: "myapex",
8680 key: "myapex.key",
8681 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008682 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008683 }
8684 `,
8685 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008686 bcpPermittedPackages: map[string][]string{
8687 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008688 "foo.bar",
8689 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008690 "bcp_lib2": []string{
8691 "foo.bar",
8692 },
8693 },
8694 },
8695 {
8696 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8697 expectedError: "",
8698 bp: `
8699 java_library {
8700 name: "bcp_lib_restricted",
8701 srcs: ["lib1/src/*.java"],
8702 apex_available: ["myapex"],
8703 permitted_packages: ["foo.bar"],
8704 sdk_version: "none",
8705 min_sdk_version: "29",
8706 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008707 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008708 }
8709 java_library {
8710 name: "bcp_lib_unrestricted",
8711 srcs: ["lib2/src/*.java"],
8712 apex_available: ["myapex"],
8713 permitted_packages: ["foo.bar", "bar.baz"],
8714 sdk_version: "none",
8715 min_sdk_version: "29",
8716 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008717 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008718 }
8719 apex {
8720 name: "myapex",
8721 key: "myapex.key",
8722 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8723 updatable: true,
8724 min_sdk_version: "29",
8725 }
8726 `,
8727 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8728 bcpPermittedPackages: map[string][]string{
8729 "bcp_lib1_non_updateable": []string{
8730 "foo.bar",
8731 },
8732 // 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 +01008733 },
8734 },
8735 }
8736 for _, tc := range testcases {
8737 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008738 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008739 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8740 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008741 })
8742 }
8743}
8744
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008745// TODO(jungjw): Move this to proptools
8746func intPtr(i int) *int {
8747 return &i
8748}
8749
8750func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008751 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008752 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008753 apex_set {
8754 name: "myapex",
8755 set: "myapex.apks",
8756 filename: "foo_v2.apex",
8757 overrides: ["foo"],
8758 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008759 `,
8760 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8761 variables.Platform_sdk_version = intPtr(30)
8762 }),
8763 android.FixtureModifyConfig(func(config android.Config) {
8764 config.Targets[android.Android] = []android.Target{
8765 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8766 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8767 }
8768 }),
8769 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008770
Spandan Das9d6e2092024-09-21 02:50:00 +00008771 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008772
8773 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008774 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008775 actual := extractedApex.Args["abis"]
8776 expected := "ARMEABI_V7A,ARM64_V8A"
8777 if actual != expected {
8778 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8779 }
8780 actual = extractedApex.Args["sdk-version"]
8781 expected = "30"
8782 if actual != expected {
8783 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8784 }
8785
Paul Duffin6717d882021-06-15 19:09:41 +01008786 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008787 a := m.Module().(*ApexSet)
8788 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008789 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008790 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8791 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8792 }
8793}
8794
Anton Hansson805e0a52022-11-25 14:06:46 +00008795func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008796 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008797 ctx := testApex(t, `
8798 apex_set {
8799 name: "myapex",
8800 set: "myapex.apks",
8801 filename: "foo_v2.apex",
8802 overrides: ["foo"],
8803 }
8804 `,
8805 android.FixtureModifyConfig(func(config android.Config) {
8806 config.Targets[android.Android] = []android.Target{
8807 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8808 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8809 }
8810 }),
8811 )
8812
Spandan Das9d6e2092024-09-21 02:50:00 +00008813 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008814
8815 // Check extract_apks tool parameters. No native bridge arch expected
8816 extractedApex := m.Output("extracted/myapex.apks")
8817 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8818}
8819
Jiyong Park7d95a512020-05-10 15:16:24 +09008820func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008821 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008822 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8823 apex {
8824 name: "myapex",
8825 key: "myapex.key",
8826 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008827 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008828 }
8829
8830 apex_key {
8831 name: "myapex.key",
8832 public_key: "testkey.avbpubkey",
8833 private_key: "testkey.pem",
8834 }
8835
8836 cc_library {
8837 name: "mylib",
8838 srcs: ["mylib.cpp"],
8839 static_libs: ["otherlib"],
8840 system_shared_libs: [],
8841 stl: "none",
8842 apex_available: [ "myapex" ],
8843 }
8844
8845 cc_library {
8846 name: "otherlib",
8847 srcs: ["mylib.cpp"],
8848 system_shared_libs: [],
8849 stl: "none",
8850 stubs: {
8851 versions: ["1", "2", "3"],
8852 },
8853 apex_available: [ "myapex" ],
8854 }
8855 `)
8856}
8857
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008858func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008859 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008860 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008861 apex {
8862 name: "myapex",
8863 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008864 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008865 custom_sign_tool: "sign_myapex",
8866 }
8867
8868 apex_key {
8869 name: "myapex.key",
8870 public_key: "testkey.avbpubkey",
8871 private_key: "testkey.pem",
8872 }
8873 `)
8874
Jooyung Han286957d2023-10-30 16:17:56 +09008875 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008876 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008877 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 +09008878}
8879
8880func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008881 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008882 ctx := testApex(t, `
8883 apex {
8884 name: "myapex",
8885 key: "myapex.key",
8886 updatable: false,
8887 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008888 }
8889
8890 apex_key {
8891 name: "myapex.key",
8892 public_key: "testkey.avbpubkey",
8893 private_key: "testkey.pem",
8894 }
8895
8896 prebuilt_apex {
8897 name: "myapex",
8898 prefer: true,
8899 arch: {
8900 arm64: {
8901 src: "myapex-arm64.apex",
8902 },
8903 arm: {
8904 src: "myapex-arm.apex",
8905 },
8906 },
8907 }
8908
8909 apex_set {
8910 name: "myapex_set",
8911 set: "myapex.apks",
8912 filename: "myapex_set.apex",
8913 overrides: ["myapex"],
8914 }
8915 `)
8916
Colin Crossf61d03d2023-11-02 16:56:39 -07008917 content := android.ContentFromFileRuleForTests(t, ctx,
8918 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008919 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 -07008920 content = android.ContentFromFileRuleForTests(t, ctx,
8921 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008922 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 +09008923}
8924
Jooyung Han938b5932020-06-20 12:47:47 +09008925func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008926 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008927 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008928 apex {
8929 name: "myapex",
8930 key: "myapex.key",
8931 apps: ["app"],
8932 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008933 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008934 }
8935
8936 apex_key {
8937 name: "myapex.key",
8938 public_key: "testkey.avbpubkey",
8939 private_key: "testkey.pem",
8940 }
8941
8942 android_app {
8943 name: "app",
8944 srcs: ["foo/bar/MyClass.java"],
8945 package_name: "foo",
8946 sdk_version: "none",
8947 system_modules: "none",
8948 apex_available: [ "myapex" ],
8949 }
8950 `, withFiles(map[string][]byte{
8951 "sub/Android.bp": []byte(`
8952 override_apex {
8953 name: "override_myapex",
8954 base: "myapex",
8955 apps: ["override_app"],
8956 allowed_files: ":allowed",
8957 }
8958 // Overridable "path" property should be referenced indirectly
8959 filegroup {
8960 name: "allowed",
8961 srcs: ["allowed.txt"],
8962 }
8963 override_android_app {
8964 name: "override_app",
8965 base: "app",
8966 package_name: "bar",
8967 }
8968 `),
8969 }))
8970
Jooyung Hana0503a52023-08-23 13:12:50 +09008971 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008972 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8973 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8974 }
8975
Spandan Das50801e22024-05-13 18:29:45 +00008976 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008977 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8978 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8979 }
8980}
8981
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008982func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008983 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008984 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008985 apex {
8986 name: "myapex",
8987 key: "myapex.key",
8988 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008989 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008990 }
8991
8992 apex_key {
8993 name: "myapex.key",
8994 public_key: "testkey.avbpubkey",
8995 private_key: "testkey.pem",
8996 }
8997
8998 cc_library {
8999 name: "mylib",
9000 srcs: ["mylib.cpp"],
9001 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009002 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009003 },
9004 apex_available: ["myapex"],
9005 }
9006
9007 cc_prebuilt_library_shared {
9008 name: "mylib",
9009 prefer: false,
9010 srcs: ["prebuilt.so"],
9011 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009012 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009013 },
9014 apex_available: ["myapex"],
9015 }
9016 `)
9017}
9018
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009019func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009020 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009021 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009022 apex {
9023 name: "myapex",
9024 key: "myapex.key",
9025 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009026 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009027 }
9028 apex_key {
9029 name: "myapex.key",
9030 public_key: "testkey.avbpubkey",
9031 private_key: "testkey.pem",
9032 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009033 `,
9034 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9035 variables.CompressedApex = proptools.BoolPtr(true)
9036 }),
9037 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009038
Jooyung Hana0503a52023-08-23 13:12:50 +09009039 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009040 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9041
Jooyung Hana0503a52023-08-23 13:12:50 +09009042 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009043 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9044
9045 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009046 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009047 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9048
9049 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009050 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009051 var builder strings.Builder
9052 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9053 androidMk := builder.String()
9054 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9055}
9056
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009057func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9058 t.Parallel()
9059 ctx := testApex(t, `
9060 apex {
9061 name: "myapex",
9062 key: "myapex.key",
9063 compressible: true,
9064 updatable: false,
9065 payload_fs_type: "erofs",
9066 }
9067 apex_key {
9068 name: "myapex.key",
9069 public_key: "testkey.avbpubkey",
9070 private_key: "testkey.pem",
9071 }
9072 `,
9073 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9074 variables.CompressedApex = proptools.BoolPtr(true)
9075 }),
9076 )
9077
9078 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9079 if compressRule.Rule != nil {
9080 t.Error("erofs apex should not be compressed")
9081 }
9082}
9083
Jooyung Han26ec8482024-07-31 15:04:05 +09009084func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009085 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009086 for _, compressionEnabled := range []bool{true, false} {
9087 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009088 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009089 ctx := testApex(t, `
9090 apex_set {
9091 name: "com.company.android.myapex",
9092 apex_name: "com.android.myapex",
9093 set: "company-myapex.apks",
9094 }
9095 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9096 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9097 }),
9098 )
9099
9100 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9101 if compressionEnabled {
9102 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9103 } else {
9104 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9105 }
9106 })
9107 }
9108}
9109
Martin Stjernholm2856c662020-12-02 15:03:42 +00009110func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009111 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009112 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009113 apex {
9114 name: "myapex",
9115 key: "myapex.key",
9116 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009117 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009118 }
9119
9120 apex_key {
9121 name: "myapex.key",
9122 public_key: "testkey.avbpubkey",
9123 private_key: "testkey.pem",
9124 }
9125
9126 cc_library {
9127 name: "mylib",
9128 srcs: ["mylib.cpp"],
9129 apex_available: ["myapex"],
9130 shared_libs: ["otherlib"],
9131 system_shared_libs: [],
9132 }
9133
9134 cc_library {
9135 name: "otherlib",
9136 srcs: ["mylib.cpp"],
9137 stubs: {
9138 versions: ["current"],
9139 },
9140 }
9141
9142 cc_prebuilt_library_shared {
9143 name: "otherlib",
9144 prefer: true,
9145 srcs: ["prebuilt.so"],
9146 stubs: {
9147 versions: ["current"],
9148 },
9149 }
9150 `)
9151
Jooyung Hana0503a52023-08-23 13:12:50 +09009152 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009153 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009154 var builder strings.Builder
9155 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9156 androidMk := builder.String()
9157
9158 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9159 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009160 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009161}
9162
Jiyong Parke3867542020-12-03 17:28:25 +09009163func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009164 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009165 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009166 apex {
9167 name: "myapex",
9168 key: "myapex.key",
9169 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009170 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009171 }
9172
9173 apex_key {
9174 name: "myapex.key",
9175 public_key: "testkey.avbpubkey",
9176 private_key: "testkey.pem",
9177 }
9178
9179 cc_library {
9180 name: "mylib",
9181 srcs: ["mylib.cpp"],
9182 system_shared_libs: [],
9183 stl: "none",
9184 apex_available: ["myapex"],
9185 shared_libs: ["mylib2"],
9186 target: {
9187 apex: {
9188 exclude_shared_libs: ["mylib2"],
9189 },
9190 },
9191 }
9192
9193 cc_library {
9194 name: "mylib2",
9195 srcs: ["mylib.cpp"],
9196 system_shared_libs: [],
9197 stl: "none",
9198 }
9199 `)
9200
9201 // Check if mylib is linked to mylib2 for the non-apex target
9202 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9203 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9204
9205 // Make sure that the link doesn't occur for the apex target
9206 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9207 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9208
9209 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009210 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009211 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9212}
9213
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009214func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009215 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009216 bpBase := `
9217 apex {
9218 name: "myapex",
9219 key: "myapex.key",
9220 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009221 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009222 }
9223 apex_key {
9224 name: "myapex.key",
9225 public_key: "testkey.avbpubkey",
9226 private_key: "testkey.pem",
9227 }
9228 cc_library {
9229 name: "mylib",
9230 srcs: ["mylib.cpp"],
9231 apex_available: ["myapex"],
9232 shared_libs: ["stublib"],
9233 system_shared_libs: [],
9234 }
9235 apex {
9236 name: "otherapex",
9237 enabled: %s,
9238 key: "myapex.key",
9239 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009240 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009241 }
9242 `
9243
9244 stublibSourceBp := `
9245 cc_library {
9246 name: "stublib",
9247 srcs: ["mylib.cpp"],
9248 apex_available: ["otherapex"],
9249 system_shared_libs: [],
9250 stl: "none",
9251 stubs: {
9252 versions: ["1"],
9253 },
9254 }
9255 `
9256
9257 stublibPrebuiltBp := `
9258 cc_prebuilt_library_shared {
9259 name: "stublib",
9260 srcs: ["prebuilt.so"],
9261 apex_available: ["otherapex"],
9262 stubs: {
9263 versions: ["1"],
9264 },
9265 %s
9266 }
9267 `
9268
9269 tests := []struct {
9270 name string
9271 stublibBp string
9272 usePrebuilt bool
9273 modNames []string // Modules to collect AndroidMkEntries for
9274 otherApexEnabled []string
9275 }{
9276 {
9277 name: "only_source",
9278 stublibBp: stublibSourceBp,
9279 usePrebuilt: false,
9280 modNames: []string{"stublib"},
9281 otherApexEnabled: []string{"true", "false"},
9282 },
9283 {
9284 name: "source_preferred",
9285 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9286 usePrebuilt: false,
9287 modNames: []string{"stublib", "prebuilt_stublib"},
9288 otherApexEnabled: []string{"true", "false"},
9289 },
9290 {
9291 name: "prebuilt_preferred",
9292 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9293 usePrebuilt: true,
9294 modNames: []string{"stublib", "prebuilt_stublib"},
9295 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9296 },
9297 {
9298 name: "only_prebuilt",
9299 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9300 usePrebuilt: true,
9301 modNames: []string{"stublib"},
9302 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9303 },
9304 }
9305
9306 for _, test := range tests {
9307 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009308 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009309 for _, otherApexEnabled := range test.otherApexEnabled {
9310 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009311 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009312 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009313
9314 type modAndMkEntries struct {
9315 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009316 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009317 }
9318 entries := []*modAndMkEntries{}
9319
9320 // Gather shared lib modules that are installable
9321 for _, modName := range test.modNames {
9322 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9323 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9324 continue
9325 }
9326 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009327 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009328 continue
9329 }
Yu Liue70976d2024-10-15 20:45:35 +00009330 info := android.AndroidMkInfoForTest(t, ctx, mod)
9331 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9332 ents = append(ents, info.ExtraInfo...)
9333 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009334 if ent.Disabled {
9335 continue
9336 }
9337 entries = append(entries, &modAndMkEntries{
9338 mod: mod,
9339 mkEntries: ent,
9340 })
9341 }
9342 }
9343 }
9344
9345 var entry *modAndMkEntries = nil
9346 for _, ent := range entries {
9347 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9348 if entry != nil {
9349 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9350 } else {
9351 entry = ent
9352 }
9353 }
9354 }
9355
9356 if entry == nil {
9357 t.Errorf("AndroidMk entry for \"stublib\" missing")
9358 } else {
9359 isPrebuilt := entry.mod.Prebuilt() != nil
9360 if isPrebuilt != test.usePrebuilt {
9361 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9362 }
9363 if !entry.mod.IsStubs() {
9364 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9365 }
9366 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9367 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9368 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009369 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009370 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009371 if !android.InList(expected, cflags) {
9372 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9373 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009374 }
9375 })
9376 }
9377 })
9378 }
9379}
9380
Colin Crossc33e5212021-05-25 18:16:02 -07009381func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009382 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009383 bp := `
9384 apex {
9385 name: "myapex",
9386 key: "myapex.key",
9387 java_libs: ["mylib"],
9388 bootclasspath_fragments: ["mybootclasspathfragment"],
9389 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9390 updatable: false,
9391 }
9392
9393 apex_key {
9394 name: "myapex.key",
9395 public_key: "testkey.avbpubkey",
9396 private_key: "testkey.pem",
9397 }
9398
9399 java_library {
9400 name: "mylib",
9401 srcs: ["mylib.java"],
9402 apex_available: ["myapex"],
9403 compile_dex: true,
9404 }
9405
9406 bootclasspath_fragment {
9407 name: "mybootclasspathfragment",
9408 contents: ["mybootclasspathlib"],
9409 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009410 hidden_api: {
9411 split_packages: ["*"],
9412 },
Colin Crossc33e5212021-05-25 18:16:02 -07009413 }
9414
9415 java_library {
9416 name: "mybootclasspathlib",
9417 srcs: ["mybootclasspathlib.java"],
9418 apex_available: ["myapex"],
9419 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009420 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009421 }
9422
9423 systemserverclasspath_fragment {
9424 name: "mysystemserverclasspathfragment",
9425 contents: ["mysystemserverclasspathlib"],
9426 apex_available: ["myapex"],
9427 }
9428
9429 java_library {
9430 name: "mysystemserverclasspathlib",
9431 srcs: ["mysystemserverclasspathlib.java"],
9432 apex_available: ["myapex"],
9433 compile_dex: true,
9434 }
9435 `
9436
9437 result := android.GroupFixturePreparers(
9438 PrepareForTestWithApexBuildComponents,
9439 prepareForTestWithMyapex,
9440 java.PrepareForTestWithJavaDefaultModules,
9441 android.PrepareForTestWithAndroidBuildComponents,
9442 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009443 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9444 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009445 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009446 ).RunTest(t)
9447
9448 // Make sure jacoco ran on both mylib and mybootclasspathlib
9449 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9450 t.Errorf("Failed to find jacoco rule for mylib")
9451 }
9452 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9453 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9454 }
9455 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9456 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9457 }
9458}
9459
Jiyong Park192600a2021-08-03 07:52:17 +00009460func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009461 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009462 testApexError(t, `executable mybin is static`, `
9463 apex {
9464 name: "myapex",
9465 key: "myapex.key",
9466 binaries: ["mybin"],
9467 min_sdk_version: "29",
9468 }
9469
9470 apex_key {
9471 name: "myapex.key",
9472 public_key: "testkey.avbpubkey",
9473 private_key: "testkey.pem",
9474 }
9475
9476 cc_binary {
9477 name: "mybin",
9478 srcs: ["mylib.cpp"],
9479 relative_install_path: "foo/bar",
9480 static_executable: true,
9481 system_shared_libs: [],
9482 stl: "none",
9483 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009484 min_sdk_version: "29",
9485 }
9486 `)
9487
9488 testApexError(t, `executable mybin.rust is static`, `
9489 apex {
9490 name: "myapex",
9491 key: "myapex.key",
9492 binaries: ["mybin.rust"],
9493 min_sdk_version: "29",
9494 }
9495
9496 apex_key {
9497 name: "myapex.key",
9498 public_key: "testkey.avbpubkey",
9499 private_key: "testkey.pem",
9500 }
9501
9502 rust_binary {
9503 name: "mybin.rust",
9504 srcs: ["foo.rs"],
9505 static_executable: true,
9506 apex_available: ["myapex"],
9507 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009508 }
9509 `)
9510}
9511
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009512func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009513 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009514 ctx := testApex(t, `
9515 apex {
9516 name: "myapex",
9517 key: "myapex.key",
9518 updatable: false,
9519 java_libs: ["foo"],
9520 }
9521
9522 apex_key {
9523 name: "myapex.key",
9524 public_key: "testkey.avbpubkey",
9525 private_key: "testkey.pem",
9526 }
9527
9528 java_library {
9529 name: "foo",
9530 srcs: ["foo.java"],
9531 apex_available: ["myapex"],
9532 installable: true,
9533 }
9534 `,
9535 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9536 )
9537
Jooyung Hana0503a52023-08-23 13:12:50 +09009538 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009539 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9540 var builder strings.Builder
9541 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9542 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009543 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 +00009544}
9545
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009546func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009547 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009548 ctx := testApex(t, `
9549 apex {
9550 name: "myapex",
9551 key: "myapex.key",
9552 updatable: false,
9553 java_libs: ["foo"],
9554 required: ["otherapex"],
9555 }
9556
9557 apex {
9558 name: "otherapex",
9559 key: "myapex.key",
9560 updatable: false,
9561 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009562 }
9563
9564 apex_key {
9565 name: "myapex.key",
9566 public_key: "testkey.avbpubkey",
9567 private_key: "testkey.pem",
9568 }
9569
9570 java_library {
9571 name: "foo",
9572 srcs: ["foo.java"],
9573 apex_available: ["myapex", "otherapex"],
9574 installable: true,
9575 }
9576 `)
9577
Jooyung Hana0503a52023-08-23 13:12:50 +09009578 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009579 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9580 var builder strings.Builder
9581 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9582 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009583 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009584}
9585
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009586func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009587 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009588 ctx := testApex(t, `
9589 apex {
9590 name: "myapex",
9591 key: "myapex.key",
9592 updatable: false,
9593 }
9594
9595 apex_key {
9596 name: "myapex.key",
9597 public_key: "testkey.avbpubkey",
9598 private_key: "testkey.pem",
9599 }
9600 `)
9601
Jooyung Hana0503a52023-08-23 13:12:50 +09009602 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009603 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009604 data := android.AndroidMkDataForTest(t, ctx, bundle)
9605 var builder strings.Builder
9606 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9607 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009608 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009609}
9610
Jooyung Hana6d36672022-02-24 13:58:07 +09009611func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009612 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009613 for _, tc := range []struct {
9614 name string
9615 ref string
9616 expected_data []string
9617 }{
9618 {
9619 name: "test_using_output",
9620 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009621 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009622 },
9623 {
9624 name: "test_using_apex",
9625 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009626 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009627 },
9628 } {
9629 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009630 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009631 ctx := testApex(t, `
9632 apex {
9633 name: "myapex",
9634 key: "myapex.key",
9635 compressible: true,
9636 updatable: false,
9637 }
9638
9639 apex_key {
9640 name: "myapex.key",
9641 public_key: "testkey.avbpubkey",
9642 private_key: "testkey.pem",
9643 }
9644
9645 java_test {
9646 name: "`+tc.name+`",
9647 srcs: ["a.java"],
9648 data: ["`+tc.ref+`"],
9649 }
9650 `,
9651 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9652 variables.CompressedApex = proptools.BoolPtr(true)
9653 }))
9654 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9655 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9656 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9657 })
9658 }
9659}
9660
satayev758968a2021-12-06 11:42:40 +00009661func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009662 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009663 preparer := android.GroupFixturePreparers(
9664 PrepareForTestWithApexBuildComponents,
9665 prepareForTestWithMyapex,
9666 java.PrepareForTestWithJavaSdkLibraryFiles,
9667 java.PrepareForTestWithJavaDefaultModules,
9668 android.PrepareForTestWithAndroidBuildComponents,
9669 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9670 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9671 )
9672
9673 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9674 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009675 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009676 preparer.RunTestWithBp(t, `
9677 apex {
9678 name: "myapex",
9679 key: "myapex.key",
9680 bootclasspath_fragments: ["mybootclasspathfragment"],
9681 min_sdk_version: "30",
9682 updatable: false,
9683 }
9684
9685 apex_key {
9686 name: "myapex.key",
9687 public_key: "testkey.avbpubkey",
9688 private_key: "testkey.pem",
9689 }
9690
9691 bootclasspath_fragment {
9692 name: "mybootclasspathfragment",
9693 contents: ["mybootclasspathlib"],
9694 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009695 hidden_api: {
9696 split_packages: ["*"],
9697 },
satayev758968a2021-12-06 11:42:40 +00009698 }
9699
9700 java_sdk_library {
9701 name: "mybootclasspathlib",
9702 srcs: ["mybootclasspathlib.java"],
9703 apex_available: ["myapex"],
9704 compile_dex: true,
9705 unsafe_ignore_missing_latest_api: true,
9706 min_sdk_version: "31",
9707 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009708 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009709 }
9710
9711 java_library {
9712 name: "util",
9713 srcs: ["a.java"],
9714 apex_available: ["myapex"],
9715 min_sdk_version: "31",
9716 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009717 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009718 }
9719
9720 java_library {
9721 name: "another_util",
9722 srcs: ["a.java"],
9723 min_sdk_version: "31",
9724 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009725 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009726 }
9727 `)
9728 })
9729
9730 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9731 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009732 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009733 preparer.RunTestWithBp(t, `
9734 apex {
9735 name: "myapex",
9736 key: "myapex.key",
9737 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9738 min_sdk_version: "30",
9739 updatable: false,
9740 }
9741
9742 apex_key {
9743 name: "myapex.key",
9744 public_key: "testkey.avbpubkey",
9745 private_key: "testkey.pem",
9746 }
9747
9748 systemserverclasspath_fragment {
9749 name: "mysystemserverclasspathfragment",
9750 contents: ["mysystemserverclasspathlib"],
9751 apex_available: ["myapex"],
9752 }
9753
9754 java_sdk_library {
9755 name: "mysystemserverclasspathlib",
9756 srcs: ["mysystemserverclasspathlib.java"],
9757 apex_available: ["myapex"],
9758 compile_dex: true,
9759 min_sdk_version: "32",
9760 unsafe_ignore_missing_latest_api: true,
9761 static_libs: ["util"],
9762 }
9763
9764 java_library {
9765 name: "util",
9766 srcs: ["a.java"],
9767 apex_available: ["myapex"],
9768 min_sdk_version: "31",
9769 static_libs: ["another_util"],
9770 }
9771
9772 java_library {
9773 name: "another_util",
9774 srcs: ["a.java"],
9775 min_sdk_version: "31",
9776 apex_available: ["myapex"],
9777 }
9778 `)
9779 })
9780
9781 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009782 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009783 preparer.
satayev758968a2021-12-06 11:42:40 +00009784 RunTestWithBp(t, `
9785 apex {
9786 name: "myapex",
9787 key: "myapex.key",
9788 bootclasspath_fragments: ["mybootclasspathfragment"],
9789 min_sdk_version: "30",
9790 updatable: false,
9791 }
9792
9793 apex_key {
9794 name: "myapex.key",
9795 public_key: "testkey.avbpubkey",
9796 private_key: "testkey.pem",
9797 }
9798
9799 bootclasspath_fragment {
9800 name: "mybootclasspathfragment",
9801 contents: ["mybootclasspathlib"],
9802 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009803 hidden_api: {
9804 split_packages: ["*"],
9805 },
satayev758968a2021-12-06 11:42:40 +00009806 }
9807
9808 java_sdk_library {
9809 name: "mybootclasspathlib",
9810 srcs: ["mybootclasspathlib.java"],
9811 apex_available: ["myapex"],
9812 compile_dex: true,
9813 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009814 sdk_version: "current",
9815 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009816 }
9817 `)
9818 })
9819
9820 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009821 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009822 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9823 RunTestWithBp(t, `
9824 apex {
9825 name: "myapex",
9826 key: "myapex.key",
9827 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9828 min_sdk_version: "30",
9829 updatable: false,
9830 }
9831
9832 apex_key {
9833 name: "myapex.key",
9834 public_key: "testkey.avbpubkey",
9835 private_key: "testkey.pem",
9836 }
9837
9838 systemserverclasspath_fragment {
9839 name: "mysystemserverclasspathfragment",
9840 contents: ["mysystemserverclasspathlib"],
9841 apex_available: ["myapex"],
9842 }
9843
9844 java_sdk_library {
9845 name: "mysystemserverclasspathlib",
9846 srcs: ["mysystemserverclasspathlib.java"],
9847 apex_available: ["myapex"],
9848 compile_dex: true,
9849 unsafe_ignore_missing_latest_api: true,
9850 }
9851 `)
9852 })
9853}
9854
Jiakai Zhang6decef92022-01-12 17:56:19 +00009855// Verifies that the APEX depends on all the Make modules in the list.
9856func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9857 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9858 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009859 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009860 }
9861}
9862
9863// Verifies that the APEX does not depend on any of the Make modules in the list.
9864func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9865 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9866 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009867 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009868 }
9869}
9870
Cole Faust24e25c02024-01-19 14:12:17 -08009871func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009872 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009873 bpTemplate := `
9874 apex {
9875 name: "myapex",
9876 key: "myapex.key",
9877 java_libs: ["myjavalib"],
9878 updatable: %v,
9879 min_sdk_version: "29",
9880 }
9881 apex_key {
9882 name: "myapex.key",
9883 }
9884 java_library {
9885 name: "myjavalib",
9886 srcs: ["MyClass.java"],
9887 apex_available: [ "myapex" ],
9888 lint: {
9889 strict_updatability_linting: %v,
9890 %s
9891 },
9892 sdk_version: "current",
9893 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009894 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009895 }
9896 `
9897 fs := android.MockFS{
9898 "lint-baseline.xml": nil,
9899 }
9900
9901 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009902 testCaseName string
9903 apexUpdatable bool
9904 javaStrictUpdtabilityLint bool
9905 lintFileExists bool
9906 disallowedFlagExpectedOnApex bool
9907 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009908 }{
9909 {
Colin Cross87427352024-09-25 15:41:19 -07009910 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9911 apexUpdatable: true,
9912 javaStrictUpdtabilityLint: true,
9913 lintFileExists: false,
9914 disallowedFlagExpectedOnApex: false,
9915 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009916 },
9917 {
Colin Cross87427352024-09-25 15:41:19 -07009918 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9919 apexUpdatable: false,
9920 javaStrictUpdtabilityLint: false,
9921 lintFileExists: true,
9922 disallowedFlagExpectedOnApex: false,
9923 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009924 },
9925 {
Colin Cross87427352024-09-25 15:41:19 -07009926 testCaseName: "non-updatable apex respects strict updatability of javalib",
9927 apexUpdatable: false,
9928 javaStrictUpdtabilityLint: true,
9929 lintFileExists: true,
9930 disallowedFlagExpectedOnApex: false,
9931 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009932 },
9933 {
Colin Cross87427352024-09-25 15:41:19 -07009934 testCaseName: "updatable apex checks strict updatability of javalib",
9935 apexUpdatable: true,
9936 javaStrictUpdtabilityLint: false,
9937 lintFileExists: true,
9938 disallowedFlagExpectedOnApex: true,
9939 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009940 },
9941 }
9942
9943 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009944 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009945 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009946 fixtures := []android.FixturePreparer{}
9947 baselineProperty := ""
9948 if testCase.lintFileExists {
9949 fixtures = append(fixtures, fs.AddToFixture())
9950 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9951 }
9952 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009953
Colin Cross87427352024-09-25 15:41:19 -07009954 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009955
Colin Cross87427352024-09-25 15:41:19 -07009956 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9957 if expectStrictUpdatability {
9958 if m.Rule == nil {
9959 t.Errorf("expected strict updatability check rule on %s", name)
9960 } else {
9961 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9962 m.RuleParams.Command, "--disallowed_issues NewApi")
9963 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9964 m.Inputs.Strings(), "lint-baseline.xml")
9965 }
9966 } else {
9967 if m.Rule != nil {
9968 t.Errorf("expected no strict updatability check rule on %s", name)
9969 }
9970 }
9971 }
9972
9973 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9974 apex := result.ModuleForTests("myapex", "android_common_myapex")
9975 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9976 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9977
9978 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9979 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9980 })
Cole Faust24e25c02024-01-19 14:12:17 -08009981 }
9982}
9983
Cole Faust24e25c02024-01-19 14:12:17 -08009984// checks transtive deps of an apex coming from bootclasspath_fragment
9985func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009986 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009987 bp := `
9988 apex {
9989 name: "myapex",
9990 key: "myapex.key",
9991 bootclasspath_fragments: ["mybootclasspathfragment"],
9992 updatable: true,
9993 min_sdk_version: "29",
9994 }
9995 apex_key {
9996 name: "myapex.key",
9997 }
9998 bootclasspath_fragment {
9999 name: "mybootclasspathfragment",
10000 contents: ["myjavalib"],
10001 apex_available: ["myapex"],
10002 hidden_api: {
10003 split_packages: ["*"],
10004 },
10005 }
10006 java_library {
10007 name: "myjavalib",
10008 srcs: ["MyClass.java"],
10009 apex_available: [ "myapex" ],
10010 sdk_version: "current",
10011 min_sdk_version: "29",
10012 compile_dex: true,
10013 lint: {
10014 baseline_filename: "lint-baseline.xml",
10015 }
10016 }
10017 `
10018 fs := android.MockFS{
10019 "lint-baseline.xml": nil,
10020 }
10021
10022 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010023 apex := result.ModuleForTests("myapex", "android_common_myapex")
10024 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10025 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10026 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10027 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10028 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010029}
Spandan Das66773252022-01-15 00:23:18 +000010030
Jihoon Kang784c0052024-06-25 22:15:39 +000010031func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010032 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010033 bp := `
10034 apex {
10035 name: "myapex",
10036 key: "myapex.key",
10037 bootclasspath_fragments: ["mybootclasspathfragment"],
10038 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010039 java_libs: [
10040 "jacocoagent",
10041 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010042 }
10043 apex_key {
10044 name: "myapex.key",
10045 }
10046 bootclasspath_fragment {
10047 name: "mybootclasspathfragment",
10048 contents: ["foo"],
10049 apex_available: ["myapex"],
10050 hidden_api: {
10051 split_packages: ["*"],
10052 },
10053 }
10054 java_sdk_library {
10055 name: "foo",
10056 srcs: ["MyClass.java"],
10057 apex_available: [ "myapex" ],
10058 sdk_version: "current",
10059 min_sdk_version: "29",
10060 compile_dex: true,
10061 }
10062 `
10063 fs := android.MockFS{
10064 "lint-baseline.xml": nil,
10065 }
10066
10067 result := android.GroupFixturePreparers(
10068 prepareForApexTest,
10069 java.PrepareForTestWithJavaSdkLibraryFiles,
10070 java.PrepareForTestWithJacocoInstrumentation,
10071 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010072 android.FixtureMergeMockFs(fs),
10073 ).RunTestWithBp(t, bp)
10074
10075 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10076 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10077 android.AssertStringDoesContain(t,
10078 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10079 lintReportInputs, "foo.impl")
10080}
10081
Spandan Das42e89502022-05-06 22:12:55 +000010082// updatable apexes should propagate updatable=true to its apps
10083func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010084 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010085 bp := `
10086 apex {
10087 name: "myapex",
10088 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010089 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010090 apps: [
10091 "myapp",
10092 ],
10093 min_sdk_version: "30",
10094 }
10095 apex_key {
10096 name: "myapex.key",
10097 }
10098 android_app {
10099 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010100 apex_available: [
10101 "myapex",
10102 ],
10103 sdk_version: "current",
10104 min_sdk_version: "30",
10105 }
10106 `
Colin Cross99939e92024-10-01 16:02:46 -070010107 _ = android.GroupFixturePreparers(
10108 prepareForApexTest,
10109 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10110 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010111}
10112
Jingwen Chendea7a642023-03-28 11:30:50 +000010113func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010114 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010115 ctx := testApex(t, `
10116 apex {
10117 name: "myapex",
10118 key: "myapex.key",
10119 updatable: false,
10120 }
10121
10122 apex_key {
10123 name: "myapex.key",
10124 public_key: "testkey.avbpubkey",
10125 private_key: "testkey.pem",
10126 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010127 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010128 generateFsRule := mod.Rule("generateFsConfig")
10129 cmd := generateFsRule.RuleParams.Command
10130
10131 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10132}
10133
10134func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010135 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010136 ctx := testApex(t, `
10137 apex {
10138 name: "myapex",
10139 key: "myapex.key",
10140 canned_fs_config: "my_config",
10141 updatable: false,
10142 }
10143
10144 apex_key {
10145 name: "myapex.key",
10146 public_key: "testkey.avbpubkey",
10147 private_key: "testkey.pem",
10148 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010149 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010150 generateFsRule := mod.Rule("generateFsConfig")
10151 cmd := generateFsRule.RuleParams.Command
10152
10153 // Ensure that canned_fs_config has "cat my_config" at the end
10154 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10155}
Spandan Das20fce2d2023-04-12 17:21:39 +000010156
10157func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010158 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010159 testCases := []struct {
10160 desc string
10161 hasStubs bool
10162 apexAvailable string
10163 expectedError string
10164 }{
10165 {
10166 desc: "non-stub library can have multiple apex_available",
10167 hasStubs: false,
10168 apexAvailable: `["myapex", "otherapex"]`,
10169 },
10170 {
10171 desc: "stub library should not be available to anyapex",
10172 hasStubs: true,
10173 apexAvailable: `["//apex_available:anyapex"]`,
10174 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10175 },
10176 {
10177 desc: "stub library should not be available to multiple apexes",
10178 hasStubs: true,
10179 apexAvailable: `["myapex", "otherapex"]`,
10180 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10181 },
10182 {
10183 desc: "stub library can be available to a core apex and a test apex",
10184 hasStubs: true,
10185 apexAvailable: `["myapex", "test_myapex"]`,
10186 },
10187 }
10188 bpTemplate := `
10189 cc_library {
10190 name: "libfoo",
10191 %v
10192 apex_available: %v,
10193 }
10194 apex {
10195 name: "myapex",
10196 key: "apex.key",
10197 updatable: false,
10198 native_shared_libs: ["libfoo"],
10199 }
10200 apex {
10201 name: "otherapex",
10202 key: "apex.key",
10203 updatable: false,
10204 }
10205 apex_test {
10206 name: "test_myapex",
10207 key: "apex.key",
10208 updatable: false,
10209 native_shared_libs: ["libfoo"],
10210 }
10211 apex_key {
10212 name: "apex.key",
10213 }
10214 `
10215 for _, tc := range testCases {
10216 stubs := ""
10217 if tc.hasStubs {
10218 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10219 }
10220 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10221 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10222 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10223 })
10224 if tc.expectedError == "" {
10225 testApex(t, bp, mockFsFixturePreparer)
10226 } else {
10227 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10228 }
10229 }
10230}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010231
10232func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010233 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010234 context := android.GroupFixturePreparers(
10235 android.PrepareForIntegrationTestWithAndroid,
10236 cc.PrepareForIntegrationTestWithCc,
10237 PrepareForTestWithApexBuildComponents,
10238 prepareForTestWithMyapex,
10239 filesystem.PrepareForTestWithFilesystemBuildComponents,
10240 )
10241 result := context.RunTestWithBp(t, `
10242 android_system_image {
10243 name: "myfilesystem",
10244 deps: [
10245 "libfoo",
10246 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010247 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010248 gen_linker_config: true,
10249 linker_config_srcs: ["linker.config.json"],
10250 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010251 }
10252
10253 cc_library {
10254 name: "libfoo",
10255 shared_libs: [
10256 "libbar",
10257 ],
10258 stl: "none",
10259 }
10260
10261 cc_library {
10262 name: "libbar",
10263 stl: "none",
10264 apex_available: ["myapex"],
10265 }
10266
10267 apex {
10268 name: "myapex",
10269 native_shared_libs: ["libbar"],
10270 key: "myapex.key",
10271 updatable: false,
10272 }
10273
10274 apex_key {
10275 name: "myapex.key",
10276 public_key: "testkey.avbpubkey",
10277 private_key: "testkey.pem",
10278 }
10279 `)
10280
Cole Faust3b806d32024-03-11 15:15:03 -070010281 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010282 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10283 inputs.Strings(),
10284 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10285}
Yu Liueae7b362023-11-16 17:05:47 -080010286
10287var apex_default_bp = `
10288 apex_key {
10289 name: "myapex.key",
10290 public_key: "testkey.avbpubkey",
10291 private_key: "testkey.pem",
10292 }
10293
10294 filegroup {
10295 name: "myapex.manifest",
10296 srcs: ["apex_manifest.json"],
10297 }
10298
10299 filegroup {
10300 name: "myapex.androidmanifest",
10301 srcs: ["AndroidManifest.xml"],
10302 }
10303`
10304
10305func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010306 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010307 ctx := testApex(t, apex_default_bp+`
10308 apex {
10309 name: "myapex",
10310 manifest: ":myapex.manifest",
10311 androidManifest: ":myapex.androidmanifest",
10312 key: "myapex.key",
10313 java_libs: [
10314 "my_java_library_foo",
10315 "my_java_library_bar",
10316 ],
10317 updatable: false,
10318 }
10319
10320 java_library {
10321 name: "my_java_library_foo",
10322 srcs: ["foo/bar/MyClass.java"],
10323 sdk_version: "none",
10324 system_modules: "none",
10325 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010326 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010327 "myapex",
10328 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010329 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010330 }
10331
10332 java_library {
10333 name: "my_java_library_bar",
10334 srcs: ["foo/bar/MyClass.java"],
10335 sdk_version: "none",
10336 system_modules: "none",
10337 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010338 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010339 "myapex",
10340 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010341 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010342 }
10343
10344 aconfig_declarations {
10345 name: "my_aconfig_declarations_foo",
10346 package: "com.example.package",
10347 container: "myapex",
10348 srcs: ["foo.aconfig"],
10349 }
10350
10351 java_aconfig_library {
10352 name: "my_java_aconfig_library_foo",
10353 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010354 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010355 "myapex",
10356 ],
10357 }
10358
10359 aconfig_declarations {
10360 name: "my_aconfig_declarations_bar",
10361 package: "com.example.package",
10362 container: "myapex",
10363 srcs: ["bar.aconfig"],
10364 }
10365
10366 java_aconfig_library {
10367 name: "my_java_aconfig_library_bar",
10368 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010369 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010370 "myapex",
10371 ],
10372 }
10373 `)
10374
10375 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10376 s := mod.Rule("apexRule").Args["copy_commands"]
10377 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010378 if len(copyCmds) != 14 {
10379 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010380 }
10381
Jooyung Hana3fddf42024-09-03 13:22:21 +090010382 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10383 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10384 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10385 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010386 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010387
Yu Liubba555e2024-02-17 00:36:42 +000010388 inputs := []string{
10389 "my_aconfig_declarations_foo/intermediate.pb",
10390 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010391 }
Yu Liubba555e2024-02-17 00:36:42 +000010392 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10393 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10394 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10395 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010396 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010397}
10398
10399func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010400 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010401 ctx := testApex(t, apex_default_bp+`
10402 apex {
10403 name: "myapex",
10404 manifest: ":myapex.manifest",
10405 androidManifest: ":myapex.androidmanifest",
10406 key: "myapex.key",
10407 java_libs: [
10408 "my_java_library_foo",
10409 ],
10410 native_shared_libs: [
10411 "my_cc_library_bar",
10412 ],
10413 binaries: [
10414 "my_cc_binary_baz",
10415 ],
10416 updatable: false,
10417 }
10418
10419 java_library {
10420 name: "my_java_library_foo",
10421 srcs: ["foo/bar/MyClass.java"],
10422 sdk_version: "none",
10423 system_modules: "none",
10424 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010425 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010426 "myapex",
10427 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010428 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010429 }
10430
10431 cc_library {
10432 name: "my_cc_library_bar",
10433 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010434 static_libs: [
10435 "my_cc_aconfig_library_bar",
10436 "my_cc_aconfig_library_baz",
10437 ],
Yu Liueae7b362023-11-16 17:05:47 -080010438 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010439 "myapex",
10440 ],
10441 }
10442
10443 cc_binary {
10444 name: "my_cc_binary_baz",
10445 srcs: ["foo/bar/MyClass.cc"],
10446 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010447 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010448 "myapex",
10449 ],
10450 }
10451
10452 aconfig_declarations {
10453 name: "my_aconfig_declarations_foo",
10454 package: "com.example.package",
10455 container: "myapex",
10456 srcs: ["foo.aconfig"],
10457 }
10458
10459 java_aconfig_library {
10460 name: "my_java_aconfig_library_foo",
10461 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010462 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010463 "myapex",
10464 ],
10465 }
10466
10467 aconfig_declarations {
10468 name: "my_aconfig_declarations_bar",
10469 package: "com.example.package",
10470 container: "myapex",
10471 srcs: ["bar.aconfig"],
10472 }
10473
10474 cc_aconfig_library {
10475 name: "my_cc_aconfig_library_bar",
10476 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010477 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010478 "myapex",
10479 ],
10480 }
10481
10482 aconfig_declarations {
10483 name: "my_aconfig_declarations_baz",
10484 package: "com.example.package",
10485 container: "myapex",
10486 srcs: ["baz.aconfig"],
10487 }
10488
10489 cc_aconfig_library {
10490 name: "my_cc_aconfig_library_baz",
10491 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010492 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010493 "myapex",
10494 ],
10495 }
10496
10497 cc_library {
10498 name: "server_configurable_flags",
10499 srcs: ["server_configurable_flags.cc"],
10500 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010501 cc_library {
10502 name: "libbase",
10503 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010504 apex_available: [
10505 "myapex",
10506 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010507 }
10508 cc_library {
10509 name: "libaconfig_storage_read_api_cc",
10510 srcs: ["libaconfig_storage_read_api_cc.cc"],
10511 }
Yu Liueae7b362023-11-16 17:05:47 -080010512 `)
10513
10514 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10515 s := mod.Rule("apexRule").Args["copy_commands"]
10516 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010517 if len(copyCmds) != 18 {
10518 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010519 }
10520
Jooyung Hana3fddf42024-09-03 13:22:21 +090010521 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10522 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10523 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10524 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010525 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010526
Yu Liubba555e2024-02-17 00:36:42 +000010527 inputs := []string{
10528 "my_aconfig_declarations_foo/intermediate.pb",
10529 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10530 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010531 }
Yu Liubba555e2024-02-17 00:36:42 +000010532 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10533 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10534 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10535 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010536 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010537}
10538
Yu Liucec0e412023-11-30 16:45:50 -080010539func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010540 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010541 ctx := testApex(t, apex_default_bp+`
10542 apex {
10543 name: "myapex",
10544 manifest: ":myapex.manifest",
10545 androidManifest: ":myapex.androidmanifest",
10546 key: "myapex.key",
10547 native_shared_libs: [
10548 "libmy_rust_library",
10549 ],
10550 binaries: [
10551 "my_rust_binary",
10552 ],
10553 rust_dyn_libs: [
10554 "libmy_rust_dylib",
10555 ],
10556 updatable: false,
10557 }
10558
10559 rust_library {
10560 name: "libflags_rust", // test mock
10561 crate_name: "flags_rust",
10562 srcs: ["lib.rs"],
10563 apex_available: [
10564 "myapex",
10565 ],
10566 }
10567
10568 rust_library {
10569 name: "liblazy_static", // test mock
10570 crate_name: "lazy_static",
10571 srcs: ["src/lib.rs"],
10572 apex_available: [
10573 "myapex",
10574 ],
10575 }
10576
Ted Bauer02d475c2024-03-27 20:56:26 +000010577 rust_library {
10578 name: "libaconfig_storage_read_api", // test mock
10579 crate_name: "aconfig_storage_read_api",
10580 srcs: ["src/lib.rs"],
10581 apex_available: [
10582 "myapex",
10583 ],
10584 }
10585
Ted Bauer6ef40db2024-03-29 14:04:10 +000010586 rust_library {
10587 name: "liblogger", // test mock
10588 crate_name: "logger",
10589 srcs: ["src/lib.rs"],
10590 apex_available: [
10591 "myapex",
10592 ],
10593 }
10594
10595 rust_library {
10596 name: "liblog_rust", // test mock
10597 crate_name: "log_rust",
10598 srcs: ["src/lib.rs"],
10599 apex_available: [
10600 "myapex",
10601 ],
10602 }
10603
Yu Liucec0e412023-11-30 16:45:50 -080010604 rust_ffi_shared {
10605 name: "libmy_rust_library",
10606 srcs: ["src/lib.rs"],
10607 rustlibs: ["libmy_rust_aconfig_library_foo"],
10608 crate_name: "my_rust_library",
10609 apex_available: [
10610 "myapex",
10611 ],
10612 }
10613
10614 rust_library_dylib {
10615 name: "libmy_rust_dylib",
10616 srcs: ["foo/bar/MyClass.rs"],
10617 rustlibs: ["libmy_rust_aconfig_library_bar"],
10618 crate_name: "my_rust_dylib",
10619 apex_available: [
10620 "myapex",
10621 ],
10622 }
10623
10624 rust_binary {
10625 name: "my_rust_binary",
10626 srcs: ["foo/bar/MyClass.rs"],
10627 rustlibs: [
10628 "libmy_rust_aconfig_library_baz",
10629 "libmy_rust_dylib",
10630 ],
10631 apex_available: [
10632 "myapex",
10633 ],
10634 }
10635
10636 aconfig_declarations {
10637 name: "my_aconfig_declarations_foo",
10638 package: "com.example.package",
10639 container: "myapex",
10640 srcs: ["foo.aconfig"],
10641 }
10642
10643 aconfig_declarations {
10644 name: "my_aconfig_declarations_bar",
10645 package: "com.example.package",
10646 container: "myapex",
10647 srcs: ["bar.aconfig"],
10648 }
10649
10650 aconfig_declarations {
10651 name: "my_aconfig_declarations_baz",
10652 package: "com.example.package",
10653 container: "myapex",
10654 srcs: ["baz.aconfig"],
10655 }
10656
10657 rust_aconfig_library {
10658 name: "libmy_rust_aconfig_library_foo",
10659 aconfig_declarations: "my_aconfig_declarations_foo",
10660 crate_name: "my_rust_aconfig_library_foo",
10661 apex_available: [
10662 "myapex",
10663 ],
10664 }
10665
10666 rust_aconfig_library {
10667 name: "libmy_rust_aconfig_library_bar",
10668 aconfig_declarations: "my_aconfig_declarations_bar",
10669 crate_name: "my_rust_aconfig_library_bar",
10670 apex_available: [
10671 "myapex",
10672 ],
10673 }
10674
10675 rust_aconfig_library {
10676 name: "libmy_rust_aconfig_library_baz",
10677 aconfig_declarations: "my_aconfig_declarations_baz",
10678 crate_name: "my_rust_aconfig_library_baz",
10679 apex_available: [
10680 "myapex",
10681 ],
10682 }
10683 `)
10684
10685 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10686 s := mod.Rule("apexRule").Args["copy_commands"]
10687 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010688 if len(copyCmds) != 38 {
10689 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010690 }
10691
Jooyung Hana3fddf42024-09-03 13:22:21 +090010692 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10693 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10694 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10695 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010696 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010697
Yu Liubba555e2024-02-17 00:36:42 +000010698 inputs := []string{
10699 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010700 "my_aconfig_declarations_bar/intermediate.pb",
10701 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010702 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10703 }
10704 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10705 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10706 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10707 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010708 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010709}
10710
10711func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10712 aconfigRule := mod.Description(desc)
10713 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010714 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010715 if len(aconfigArgs) != len(inputs) {
10716 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010717 }
Yu Liucec0e412023-11-30 16:45:50 -080010718
Yu Liubba555e2024-02-17 00:36:42 +000010719 ensureEquals(t, container, aconfigRule.Args["container"])
10720 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10721
10722 buildParams := aconfigRule.BuildParams
10723 for _, input := range inputs {
10724 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10725 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010726 }
Yu Liubba555e2024-02-17 00:36:42 +000010727
10728 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010729}
10730
Yu Liueae7b362023-11-16 17:05:47 -080010731func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010732 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010733 ctx := testApex(t, apex_default_bp+`
10734 apex {
10735 name: "myapex",
10736 manifest: ":myapex.manifest",
10737 androidManifest: ":myapex.androidmanifest",
10738 key: "myapex.key",
10739 java_libs: [
10740 "my_java_library_foo",
10741 "other_java_library_bar",
10742 ],
10743 updatable: false,
10744 }
10745
10746 java_library {
10747 name: "my_java_library_foo",
10748 srcs: ["foo/bar/MyClass.java"],
10749 sdk_version: "none",
10750 system_modules: "none",
10751 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010752 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010753 "myapex",
10754 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010755 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010756 }
10757
10758 java_library {
10759 name: "other_java_library_bar",
10760 srcs: ["foo/bar/MyClass.java"],
10761 sdk_version: "none",
10762 system_modules: "none",
10763 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010764 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010765 "myapex",
10766 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010767 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010768 }
10769
10770 aconfig_declarations {
10771 name: "my_aconfig_declarations_foo",
10772 package: "com.example.package",
10773 container: "myapex",
10774 srcs: ["foo.aconfig"],
10775 }
10776
10777 java_aconfig_library {
10778 name: "my_java_aconfig_library_foo",
10779 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010780 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010781 "myapex",
10782 ],
10783 }
10784
10785 aconfig_declarations {
10786 name: "other_aconfig_declarations_bar",
10787 package: "com.example.package",
10788 container: "otherapex",
10789 srcs: ["bar.aconfig"],
10790 }
10791
10792 java_aconfig_library {
10793 name: "other_java_aconfig_library_bar",
10794 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010795 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010796 "myapex",
10797 ],
10798 }
10799 `)
10800
10801 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10802 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10803 s := " " + combineAconfigRule.Args["cache_files"]
10804 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10805 if len(aconfigArgs) != 1 {
10806 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10807 }
10808 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10809
10810 buildParams := combineAconfigRule.BuildParams
10811 if len(buildParams.Inputs) != 1 {
10812 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10813 }
10814 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10815 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10816}
10817
10818func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010819 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010820 ctx := testApex(t, apex_default_bp+`
10821 apex {
10822 name: "myapex",
10823 manifest: ":myapex.manifest",
10824 androidManifest: ":myapex.androidmanifest",
10825 key: "myapex.key",
10826 java_libs: [
10827 "my_java_library_foo",
10828 "my_java_library_bar",
10829 ],
10830 updatable: false,
10831 }
10832
10833 java_library {
10834 name: "my_java_library_foo",
10835 srcs: ["foo/bar/MyClass.java"],
10836 sdk_version: "none",
10837 system_modules: "none",
10838 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010839 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010840 "myapex",
10841 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010842 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010843 }
10844
10845 java_library {
10846 name: "my_java_library_bar",
10847 srcs: ["foo/bar/MyClass.java"],
10848 sdk_version: "none",
10849 system_modules: "none",
10850 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010851 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010852 "myapex",
10853 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010854 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010855 }
10856
10857 aconfig_declarations {
10858 name: "my_aconfig_declarations_foo",
10859 package: "com.example.package",
10860 container: "myapex",
10861 srcs: ["foo.aconfig"],
10862 }
10863
10864 java_aconfig_library {
10865 name: "my_java_aconfig_library_foo",
10866 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010867 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010868 "myapex",
10869 ],
10870 }
10871
10872 java_aconfig_library {
10873 name: "my_java_aconfig_library_bar",
10874 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010875 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010876 "myapex",
10877 ],
10878 }
10879 `)
10880
10881 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10882 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10883 s := " " + combineAconfigRule.Args["cache_files"]
10884 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10885 if len(aconfigArgs) != 1 {
10886 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10887 }
10888 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10889
10890 buildParams := combineAconfigRule.BuildParams
10891 if len(buildParams.Inputs) != 1 {
10892 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10893 }
10894 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10895 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10896}
Spandan Das5be63332023-12-13 00:06:32 +000010897
10898// Test that the boot jars come from the _selected_ apex prebuilt
10899// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10900func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010901 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010902 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10903 t.Helper()
10904 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10905 foundLibfooJar := false
10906 base := stem + ".jar"
10907 for _, output := range s.AllOutputs() {
10908 if filepath.Base(output) == base {
10909 foundLibfooJar = true
10910 buildRule := s.Output(output)
10911 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10912 }
10913 }
10914 if !foundLibfooJar {
10915 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10916 }
10917 }
10918
Spandan Das64c9e0c2023-12-20 20:13:34 +000010919 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10920 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10921 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10922 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10923 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10924 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)
10925 }
10926
10927 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10928 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10929 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10930 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10931 }
10932
Spandan Das5be63332023-12-13 00:06:32 +000010933 bp := `
10934 // Source APEX.
10935
10936 java_library {
10937 name: "framework-foo",
10938 srcs: ["foo.java"],
10939 installable: true,
10940 apex_available: [
10941 "com.android.foo",
10942 ],
10943 }
10944
10945 bootclasspath_fragment {
10946 name: "foo-bootclasspath-fragment",
10947 contents: ["framework-foo"],
10948 apex_available: [
10949 "com.android.foo",
10950 ],
10951 hidden_api: {
10952 split_packages: ["*"],
10953 },
10954 }
10955
10956 apex_key {
10957 name: "com.android.foo.key",
10958 public_key: "com.android.foo.avbpubkey",
10959 private_key: "com.android.foo.pem",
10960 }
10961
10962 apex {
10963 name: "com.android.foo",
10964 key: "com.android.foo.key",
10965 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10966 updatable: false,
10967 }
10968
10969 // Prebuilt APEX.
10970
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010971 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010972 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010973 public: {
10974 jars: ["foo.jar"],
10975 },
Spandan Das5be63332023-12-13 00:06:32 +000010976 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010977 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010978 }
10979
10980 prebuilt_bootclasspath_fragment {
10981 name: "foo-bootclasspath-fragment",
10982 contents: ["framework-foo"],
10983 hidden_api: {
10984 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10985 metadata: "my-bootclasspath-fragment/metadata.csv",
10986 index: "my-bootclasspath-fragment/index.csv",
10987 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10988 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10989 },
10990 apex_available: [
10991 "com.android.foo",
10992 ],
10993 }
10994
10995 prebuilt_apex {
10996 name: "com.android.foo",
10997 apex_name: "com.android.foo",
10998 src: "com.android.foo-arm.apex",
10999 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11000 }
11001
11002 // Another Prebuilt ART APEX
11003 prebuilt_apex {
11004 name: "com.android.foo.v2",
11005 apex_name: "com.android.foo", // Used to determine the API domain
11006 src: "com.android.foo-arm.apex",
11007 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11008 }
11009
11010 // APEX contribution modules
11011
11012 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011013 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011014 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011015 contents: ["com.android.foo"],
11016 }
11017
11018 apex_contributions {
11019 name: "foo.prebuilt.contributions",
11020 api_domain: "com.android.foo",
11021 contents: ["prebuilt_com.android.foo"],
11022 }
11023
11024 apex_contributions {
11025 name: "foo.prebuilt.v2.contributions",
11026 api_domain: "com.android.foo",
11027 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011028 }
11029 `
11030
11031 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011032 desc string
11033 selectedApexContributions string
11034 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011035 }{
11036 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011037 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11038 selectedApexContributions: "foo.source.contributions",
11039 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011040 },
11041 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011042 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11043 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011044 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 +000011045 },
11046 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011047 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11048 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011049 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 +000011050 },
11051 }
11052
11053 fragment := java.ApexVariantReference{
11054 Apex: proptools.StringPtr("com.android.foo"),
11055 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11056 }
11057
11058 for _, tc := range testCases {
11059 preparer := android.GroupFixturePreparers(
11060 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11061 android.FixtureMergeMockFs(map[string][]byte{
11062 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11063 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011064 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11065 // file creation.
11066 java.FixtureConfigureBootJars("platform:foo"),
11067 android.FixtureModifyMockFS(func(fs android.MockFS) {
11068 fs["platform/Android.bp"] = []byte(`
11069 java_library {
11070 name: "foo",
11071 srcs: ["Test.java"],
11072 compile_dex: true,
11073 }
11074 `)
11075 fs["platform/Test.java"] = nil
11076 }),
11077
Colin Crossa66b4632024-08-08 15:50:47 -070011078 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011079 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011080 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011081 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011082 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11083 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011084 }
11085}
Spandan Das3576e762024-01-03 18:57:03 +000011086
11087// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11088// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11089func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011090 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011091 // for a mainline module family, check that only the flagged soong module is visible to make
11092 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11093 variation := func(moduleName string) string {
11094 ret := "android_common_com.android.foo"
11095 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011096 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011097 }
11098 return ret
11099 }
11100
11101 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11102 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11103
11104 for _, hiddenModuleName := range hiddenModuleNames {
11105 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11106 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11107
11108 }
11109 }
11110
11111 bp := `
11112 apex_key {
11113 name: "com.android.foo.key",
11114 public_key: "com.android.foo.avbpubkey",
11115 private_key: "com.android.foo.pem",
11116 }
11117
11118 // AOSP source apex
11119 apex {
11120 name: "com.android.foo",
11121 key: "com.android.foo.key",
11122 updatable: false,
11123 }
11124
11125 // Google source apex
11126 override_apex {
11127 name: "com.google.android.foo",
11128 base: "com.android.foo",
11129 key: "com.android.foo.key",
11130 }
11131
11132 // Prebuilt Google APEX.
11133
11134 prebuilt_apex {
11135 name: "com.google.android.foo",
11136 apex_name: "com.android.foo",
11137 src: "com.android.foo-arm.apex",
11138 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11139 }
11140
11141 // Another Prebuilt Google APEX
11142 prebuilt_apex {
11143 name: "com.google.android.foo.v2",
11144 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011145 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011146 src: "com.android.foo-arm.apex",
11147 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11148 }
11149
11150 // APEX contribution modules
11151
11152 apex_contributions {
11153 name: "foo.source.contributions",
11154 api_domain: "com.android.foo",
11155 contents: ["com.google.android.foo"],
11156 }
11157
11158 apex_contributions {
11159 name: "foo.prebuilt.contributions",
11160 api_domain: "com.android.foo",
11161 contents: ["prebuilt_com.google.android.foo"],
11162 }
11163
11164 apex_contributions {
11165 name: "foo.prebuilt.v2.contributions",
11166 api_domain: "com.android.foo",
11167 contents: ["prebuilt_com.google.android.foo.v2"],
11168 }
11169
11170 // This is an incompatible module because it selects multiple versions of the same mainline module
11171 apex_contributions {
11172 name: "foo.prebuilt.duplicate.contributions",
11173 api_domain: "com.android.foo",
11174 contents: [
11175 "prebuilt_com.google.android.foo",
11176 "prebuilt_com.google.android.foo.v2",
11177 ],
11178 }
11179 `
11180
11181 testCases := []struct {
11182 desc string
11183 selectedApexContributions string
11184 expectedVisibleModuleName string
11185 expectedHiddenModuleNames []string
11186 expectedError string
11187 }{
11188 {
11189 desc: "Source apex is selected, prebuilts should be hidden from make",
11190 selectedApexContributions: "foo.source.contributions",
11191 expectedVisibleModuleName: "com.google.android.foo",
11192 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11193 },
11194 {
11195 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11196 selectedApexContributions: "foo.prebuilt.contributions",
11197 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11198 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11199 },
11200 {
11201 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11202 selectedApexContributions: "foo.prebuilt.v2.contributions",
11203 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11204 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11205 },
11206 {
11207 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11208 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11209 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11210 },
11211 }
11212
11213 for _, tc := range testCases {
11214 preparer := android.GroupFixturePreparers(
11215 android.FixtureMergeMockFs(map[string][]byte{
11216 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11217 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011218 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011219 )
11220 if tc.expectedError != "" {
11221 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11222 testApex(t, bp, preparer)
11223 return
11224 }
11225 ctx := testApex(t, bp, preparer)
11226
Spandan Das3576e762024-01-03 18:57:03 +000011227 // Check that
11228 // 1. The contents of the selected apex_contributions are visible to make
11229 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11230 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11231 }
11232}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011233
Spandan Das85bd4622024-08-01 00:51:20 +000011234// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11235func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011236 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011237 // for a mainline module family, check that only the flagged soong module is visible to make
11238 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11239 variation := func(moduleName string) string {
11240 ret := "android_common_com.android.adservices"
11241 if moduleName == "com.google.android.foo" {
11242 ret = "android_common_com.google.android.foo_com.google.android.foo"
11243 }
11244 return ret
11245 }
11246
11247 for _, visibleModuleName := range visibleModuleNames {
11248 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11249 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11250 }
11251
11252 for _, hiddenModuleName := range hiddenModuleNames {
11253 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11254 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11255
11256 }
11257 }
11258
11259 bp := `
11260 apex_key {
11261 name: "com.android.adservices.key",
11262 public_key: "com.android.adservices.avbpubkey",
11263 private_key: "com.android.adservices.pem",
11264 }
11265
11266 // AOSP source apex
11267 apex {
11268 name: "com.android.adservices",
11269 key: "com.android.adservices.key",
11270 updatable: false,
11271 }
11272
11273 // Prebuilt Google APEX.
11274
11275 prebuilt_apex {
11276 name: "com.google.android.adservices",
11277 apex_name: "com.android.adservices",
11278 src: "com.android.foo-arm.apex",
11279 }
11280
11281 // Another Prebuilt Google APEX
11282 prebuilt_apex {
11283 name: "com.google.android.adservices.v2",
11284 apex_name: "com.android.adservices",
11285 src: "com.android.foo-arm.apex",
11286 }
11287
11288 // APEX contribution modules
11289
11290
11291 apex_contributions {
11292 name: "adservices.prebuilt.contributions",
11293 api_domain: "com.android.adservices",
11294 contents: ["prebuilt_com.google.android.adservices"],
11295 }
11296
11297 apex_contributions {
11298 name: "adservices.prebuilt.v2.contributions",
11299 api_domain: "com.android.adservices",
11300 contents: ["prebuilt_com.google.android.adservices.v2"],
11301 }
11302 `
11303
11304 testCases := []struct {
11305 desc string
11306 selectedApexContributions string
11307 expectedVisibleModuleNames []string
11308 expectedHiddenModuleNames []string
11309 }{
11310 {
11311 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11312 selectedApexContributions: "",
11313 expectedVisibleModuleNames: []string{"com.android.adservices"},
11314 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11315 },
11316 {
11317 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11318 selectedApexContributions: "adservices.prebuilt.contributions",
11319 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11320 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11321 },
11322 {
11323 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11324 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11325 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11326 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11327 },
11328 }
11329
11330 for _, tc := range testCases {
11331 preparer := android.GroupFixturePreparers(
11332 android.FixtureMergeMockFs(map[string][]byte{
11333 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11334 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011335 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011336 )
11337 ctx := testApex(t, bp, preparer)
11338
11339 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11340 }
11341}
11342
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011343func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011344 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011345 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11346 for _, moduleName := range moduleNames {
11347 ret += fmt.Sprintf(`
11348 aconfig_declarations {
11349 name: "%[1]s",
11350 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011351 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011352 srcs: [
11353 "%[1]s.aconfig",
11354 ],
11355 }
11356 java_aconfig_library {
11357 name: "%[1]s-lib",
11358 aconfig_declarations: "%[1]s",
11359 }
11360 `, moduleName)
11361 }
11362 return ret
11363 }
11364
11365 result := android.GroupFixturePreparers(
11366 prepareForApexTest,
11367 java.PrepareForTestWithJavaSdkLibraryFiles,
11368 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011369 ).RunTestWithBp(t, `
11370 java_library {
11371 name: "baz-java-lib",
11372 static_libs: [
11373 "baz-lib",
11374 ],
11375 }
11376 filegroup {
11377 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011378 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011379 ":qux-lib{.generated_srcjars}",
11380 ],
11381 }
11382 filegroup {
11383 name: "qux-another-filegroup",
11384 srcs: [
11385 ":qux-filegroup",
11386 ],
11387 }
11388 java_library {
11389 name: "quux-java-lib",
11390 srcs: [
11391 "a.java",
11392 ],
11393 libs: [
11394 "quux-lib",
11395 ],
11396 }
11397 java_sdk_library {
11398 name: "foo",
11399 srcs: [
11400 ":qux-another-filegroup",
11401 ],
11402 api_packages: ["foo"],
11403 system: {
11404 enabled: true,
11405 },
11406 module_lib: {
11407 enabled: true,
11408 },
11409 test: {
11410 enabled: true,
11411 },
11412 static_libs: [
11413 "bar-lib",
11414 ],
11415 libs: [
11416 "baz-java-lib",
11417 "quux-java-lib",
11418 ],
11419 aconfig_declarations: [
11420 "bar",
11421 ],
11422 }
11423 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11424
11425 m := result.ModuleForTests("foo.stubs.source", "android_common")
11426 outDir := "out/soong/.intermediates"
11427
11428 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11429 // textproto files
11430 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11431
11432 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11433 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11434 // to aconfig.
11435 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11436 "passed as an input",
11437 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11438
11439 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11440 // to metalava as classpath. Thus the cache file provided by the associated
11441 // aconfig_declarations module "baz" should be passed to aconfig.
11442 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11443 "java_aconfig_library passed as an input",
11444 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11445
11446 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11447 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11448 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11449 "input",
11450 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11451
11452 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11453 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11454 // aconfig_declarations module "quux" should not be passed to aconfig.
11455 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11456 "depend on java_aconfig_library not passed as an input",
11457 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11458}
Cole Faust7c991b42024-05-15 11:17:55 -070011459
11460func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011461 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011462 ctx := testApex(t, `
11463 apex {
11464 name: "myapex",
11465 key: "myapex.key",
11466 prebuilts: ["myetc", "myetc2"],
11467 min_sdk_version: "29",
11468 }
11469 apex_key {
11470 name: "myapex.key",
11471 public_key: "testkey.avbpubkey",
11472 private_key: "testkey.pem",
11473 }
11474
11475 prebuilt_etc {
11476 name: "myetc",
11477 src: "myprebuilt",
11478 filename: "myfilename",
11479 }
11480 prebuilt_etc {
11481 name: "myetc2",
11482 sub_dir: "mysubdir",
11483 src: "myprebuilt",
11484 filename: "myfilename",
11485 }
11486 `, withFiles(android.MockFS{
11487 "packages/modules/common/build/allowed_deps.txt": nil,
11488 }))
11489
11490 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11491 data := android.AndroidMkDataForTest(t, ctx, ab)
11492 var builder strings.Builder
11493 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11494 androidMk := builder.String()
11495
11496 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11497 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11498}
Spandan Das50801e22024-05-13 18:29:45 +000011499
11500func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011501 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011502 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11503 args := module.Rule("apexRule").Args
11504 optFlags := args["opt_flags"]
11505 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11506 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11507 }
11508 }
11509
11510 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11511 t.Helper()
11512 found := false
11513 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11514 if dep == wantDep {
11515 found = true
11516 }
11517 })
11518 if !found {
11519 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11520 }
11521 }
11522
11523 ctx := testApex(t, `
11524 apex {
11525 name: "com.android.apex30",
11526 min_sdk_version: "30",
11527 key: "apex30.key",
11528 java_libs: ["javalib"],
11529 }
11530
11531 java_library {
11532 name: "javalib",
11533 srcs: ["A.java"],
11534 apex_available: ["com.android.apex30"],
11535 min_sdk_version: "30",
11536 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011537 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011538 }
11539
11540 override_apex {
11541 name: "com.mycompany.android.apex30",
11542 base: "com.android.apex30",
11543 }
11544
11545 override_apex {
11546 name: "com.mycompany.android.apex31",
11547 base: "com.android.apex30",
11548 min_sdk_version: "31",
11549 }
11550
11551 apex_key {
11552 name: "apex30.key",
11553 public_key: "testkey.avbpubkey",
11554 private_key: "testkey.pem",
11555 }
11556
11557 `, android.FixtureMergeMockFs(android.MockFS{
11558 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11559 }),
11560 )
11561
11562 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11563 checkMinSdkVersion(t, baseModule, "30")
11564
11565 // Override module, but uses same min_sdk_version
11566 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11567 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11568 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11569 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11570
11571 // Override module, uses different min_sdk_version
11572 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11573 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11574 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11575 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11576}
Spandan Das0b28fa02024-05-28 23:40:17 +000011577
11578func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011579 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011580 context := android.GroupFixturePreparers(
11581 android.PrepareForIntegrationTestWithAndroid,
11582 PrepareForTestWithApexBuildComponents,
11583 android.FixtureMergeMockFs(android.MockFS{
11584 "system/sepolicy/apex/foo-file_contexts": nil,
11585 }),
11586 )
11587 res := context.RunTestWithBp(t, `
11588 apex {
11589 name: "foo",
11590 key: "myapex.key",
11591 apex_available_name: "com.android.foo",
11592 variant_version: "0",
11593 updatable: false,
11594 }
11595 apex_key {
11596 name: "myapex.key",
11597 public_key: "testkey.avbpubkey",
11598 private_key: "testkey.pem",
11599 }
11600 prebuilt_apex {
11601 name: "foo",
11602 src: "foo.apex",
11603 prefer: true,
11604 }
11605 override_apex {
11606 name: "myoverrideapex",
11607 base: "foo",
11608 }
11609 `)
11610
11611 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11612}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011613
11614func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011615 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011616 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`, `
11617 apex {
11618 name: "myapex",
11619 key: "myapex.key",
11620 updatable: true,
11621 min_sdk_version: "current",
11622 }
11623
11624 apex_key {
11625 name: "myapex.key",
11626 public_key: "testkey.avbpubkey",
11627 private_key: "testkey.pem",
11628 }
11629 `)
11630}
Spandan Das2f68f192024-07-22 19:25:50 +000011631
11632func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011633 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011634 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11635 result := android.GroupFixturePreparers(
11636 prepareForApexTest,
11637 android.PrepareForTestWithAndroidMk,
11638 android.PrepareForTestWithMakevars,
11639 android.FixtureMergeMockFs(fs),
11640 ).RunTest(t)
11641
11642 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011643 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011644
11645 installRules := result.InstallMakeRulesForTesting(t)
11646
11647 var installedlibRule *android.InstallMakeRule
11648 for i, rule := range installRules {
11649 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11650 if installedlibRule != nil {
11651 t.Errorf("Duplicate install rules for %s", rule.Target)
11652 }
11653 installedlibRule = &installRules[i]
11654 }
11655 }
11656 if installedlibRule == nil {
11657 t.Errorf("No install rule found for installedlib")
11658 return
11659 }
11660
11661 if expectLibfooOnSystemLib {
11662 android.AssertStringListContains(t,
11663 "installedlib doesn't have install dependency on libfoo impl",
11664 installedlibRule.OrderOnlyDeps,
11665 "out/target/product/test_device/system/lib/libfoo.so")
11666 } else {
11667 android.AssertStringListDoesNotContain(t,
11668 "installedlib has install dependency on libfoo stub",
11669 installedlibRule.Deps,
11670 "out/target/product/test_device/system/lib/libfoo.so")
11671 android.AssertStringListDoesNotContain(t,
11672 "installedlib has order-only install dependency on libfoo stub",
11673 installedlibRule.OrderOnlyDeps,
11674 "out/target/product/test_device/system/lib/libfoo.so")
11675 }
11676 }
11677
11678 prebuiltLibfooBp := []byte(`
11679 cc_prebuilt_library {
11680 name: "libfoo",
11681 prefer: true,
11682 srcs: ["libfoo.so"],
11683 stubs: {
11684 versions: ["1"],
11685 },
11686 apex_available: ["apexfoo"],
11687 }
11688 `)
11689
11690 apexfooBp := []byte(`
11691 apex {
11692 name: "apexfoo",
11693 key: "apexfoo.key",
11694 native_shared_libs: ["libfoo"],
11695 updatable: false,
11696 compile_multilib: "both",
11697 }
11698 apex_key {
11699 name: "apexfoo.key",
11700 public_key: "testkey.avbpubkey",
11701 private_key: "testkey.pem",
11702 }
11703 `)
11704
11705 installedlibBp := []byte(`
11706 cc_library {
11707 name: "installedlib",
11708 shared_libs: ["libfoo"],
11709 }
11710 `)
11711
11712 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011713 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011714 testFunc(
11715 t,
11716 /*expectLibfooOnSystemLib=*/ false,
11717 android.MockFS{
11718 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11719 "apexfoo/Android.bp": apexfooBp,
11720 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11721 "Android.bp": installedlibBp,
11722 },
11723 )
11724 })
11725
11726 disabledSourceLibfooBp := []byte(`
11727 cc_library {
11728 name: "libfoo",
11729 enabled: false,
11730 stubs: {
11731 versions: ["1"],
11732 },
11733 apex_available: ["apexfoo"],
11734 }
11735 `)
11736
11737 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011738 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011739 testFunc(
11740 t,
11741 /*expectLibfooOnSystemLib=*/ false,
11742 android.MockFS{
11743 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11744 "impl/Android.bp": disabledSourceLibfooBp,
11745 "apexfoo/Android.bp": apexfooBp,
11746 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11747 "Android.bp": installedlibBp,
11748 },
11749 )
11750 })
11751}
Jihoon Kange246bb72024-09-18 22:26:22 +000011752
11753func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011754 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011755 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11756 // in libs of android_app and java_library does not lead to class loader context device/host
11757 // path mismatch errors.
11758 android.GroupFixturePreparers(
11759 prepareForApexTest,
11760 android.PrepareForIntegrationTestWithAndroid,
11761 PrepareForTestWithApexBuildComponents,
11762 android.FixtureModifyEnv(func(env map[string]string) {
11763 env["DISABLE_CONTAINER_CHECK"] = "true"
11764 }),
11765 withFiles(filesForSdkLibrary),
11766 android.FixtureMergeMockFs(android.MockFS{
11767 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11768 }),
11769 ).RunTestWithBp(t, `
11770 apex {
11771 name: "com.android.foo30",
11772 key: "myapex.key",
11773 updatable: true,
11774 bootclasspath_fragments: [
11775 "foo-bootclasspath-fragment",
11776 ],
11777 java_libs: [
11778 "bar",
11779 ],
11780 apps: [
11781 "bar-app",
11782 ],
11783 min_sdk_version: "30",
11784 }
11785 apex_key {
11786 name: "myapex.key",
11787 public_key: "testkey.avbpubkey",
11788 private_key: "testkey.pem",
11789 }
11790 bootclasspath_fragment {
11791 name: "foo-bootclasspath-fragment",
11792 contents: [
11793 "framework-foo",
11794 ],
11795 apex_available: [
11796 "com.android.foo30",
11797 ],
11798 hidden_api: {
11799 split_packages: ["*"]
11800 },
11801 }
11802
11803 java_sdk_library {
11804 name: "framework-foo",
11805 srcs: [
11806 "A.java"
11807 ],
11808 unsafe_ignore_missing_latest_api: true,
11809 apex_available: [
11810 "com.android.foo30",
11811 ],
11812 compile_dex: true,
11813 sdk_version: "core_current",
11814 shared_library: false,
11815 }
11816
11817 java_library {
11818 name: "bar",
11819 srcs: [
11820 "A.java"
11821 ],
11822 libs: [
11823 "framework-foo.impl",
11824 ],
11825 apex_available: [
11826 "com.android.foo30",
11827 ],
11828 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011829 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011830 }
11831
11832 java_library {
11833 name: "baz",
11834 srcs: [
11835 "A.java"
11836 ],
11837 libs: [
11838 "bar",
11839 ],
11840 sdk_version: "core_current",
11841 }
11842
11843 android_app {
11844 name: "bar-app",
11845 srcs: [
11846 "A.java"
11847 ],
11848 libs: [
11849 "baz",
11850 "framework-foo.impl",
11851 ],
11852 apex_available: [
11853 "com.android.foo30",
11854 ],
11855 sdk_version: "core_current",
11856 min_sdk_version: "30",
11857 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011858 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011859 }
11860 `)
11861}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011862
11863// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11864func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011865 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011866 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11867 apex {
11868 name: "myapex",
11869 key: "myapex.key",
11870 systemserverclasspath_fragments: [
11871 "mysystemserverclasspathfragment",
11872 ],
11873 min_sdk_version: "29",
11874 updatable: true,
11875 system_ext_specific: true,
11876 }
11877
11878 apex_key {
11879 name: "myapex.key",
11880 public_key: "testkey.avbpubkey",
11881 private_key: "testkey.pem",
11882 }
11883
11884 java_library {
11885 name: "foo",
11886 srcs: ["b.java"],
11887 min_sdk_version: "29",
11888 installable: true,
11889 apex_available: [
11890 "myapex",
11891 ],
11892 sdk_version: "current",
11893 }
11894
11895 systemserverclasspath_fragment {
11896 name: "mysystemserverclasspathfragment",
11897 contents: [
11898 "foo",
11899 ],
11900 apex_available: [
11901 "myapex",
11902 ],
11903 }
11904 `,
11905 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11906 )
11907}
Spandan Das72d86c62024-10-15 19:27:41 +000011908
11909// partitions should not package the artifacts that are included inside the apex.
11910func TestFilesystemWithApexDeps(t *testing.T) {
11911 t.Parallel()
11912 result := testApex(t, `
11913 android_filesystem {
11914 name: "myfilesystem",
11915 deps: ["myapex"],
11916 }
11917 apex {
11918 name: "myapex",
11919 key: "myapex.key",
11920 binaries: ["binfoo"],
11921 native_shared_libs: ["libfoo"],
11922 apps: ["appfoo"],
11923 updatable: false,
11924 }
11925 apex_key {
11926 name: "myapex.key",
11927 }
11928 cc_binary {
11929 name: "binfoo",
11930 apex_available: ["myapex"],
11931 }
11932 cc_library {
11933 name: "libfoo",
11934 apex_available: ["myapex"],
11935 }
11936 android_app {
11937 name: "appfoo",
11938 sdk_version: "current",
11939 apex_available: ["myapex"],
11940 }
11941 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11942
11943 partition := result.ModuleForTests("myfilesystem", "android_common")
11944 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11945 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11946}
Colin Crossb614cd42024-10-11 12:52:21 -070011947
11948func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11949 t.Parallel()
11950
11951 extractDepenencyPathFromErrors := func(errs []error) []string {
11952 i := slices.IndexFunc(errs, func(err error) bool {
11953 return strings.Contains(err.Error(), "dependency path:")
11954 })
11955 if i < 0 {
11956 return nil
11957 }
11958 var dependencyPath []string
11959 for _, err := range errs[i+1:] {
11960 s := err.Error()
11961 lastSpace := strings.LastIndexByte(s, ' ')
11962 if lastSpace >= 0 {
11963 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11964 }
11965 }
11966 return dependencyPath
11967 }
11968
11969 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11970 return func(t *testing.T, result *android.TestResult) {
11971 t.Helper()
11972 if len(result.Errs) == 0 {
11973 t.Fatalf("expected errors")
11974 }
11975 t.Log("found errors:")
11976 for _, err := range result.Errs {
11977 t.Log(err)
11978 }
11979 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11980 t.Fatalf("expected error %q, got %q", w, g)
11981 }
11982 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11983 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11984 t.Errorf("expected dependency path %q, got %q", w, g)
11985 }
11986 }
11987 }
11988
11989 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11990 return func(bp *bpmodify.Blueprint) {
11991 m := bp.ModulesByName(module)
11992 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11993 if err != nil {
11994 panic(err)
11995 }
11996 props.AddStringToList(lib)
11997 }
11998 }
11999
12000 bpTemplate := `
12001 apex {
12002 name: "myapex",
12003 key: "myapex.key",
12004 native_shared_libs: ["mylib"],
12005 rust_dyn_libs: ["libmyrust"],
12006 binaries: ["mybin", "myrustbin"],
12007 jni_libs: ["libjni"],
12008 apps: ["myapp"],
12009 updatable: false,
12010 }
12011
12012 apex {
12013 name: "otherapex",
12014 key: "myapex.key",
12015 native_shared_libs: ["libotherapex"],
12016 updatable: false,
12017 }
12018
12019 apex_key {
12020 name: "myapex.key",
12021 public_key: "testkey.avbpubkey",
12022 private_key: "testkey.pem",
12023 }
12024
12025 cc_library {
12026 name: "mylib",
12027 srcs: ["foo.cpp"],
12028 apex_available: ["myapex"],
12029 }
12030
12031 cc_binary {
12032 name: "mybin",
12033 srcs: ["foo.cpp"],
12034 apex_available: ["myapex"],
12035 }
12036
12037 rust_library {
12038 name: "libmyrust",
12039 crate_name: "myrust",
12040 srcs: ["src/lib.rs"],
12041 rustlibs: ["libmyrust_transitive_dylib"],
12042 rlibs: ["libmyrust_transitive_rlib"],
12043 apex_available: ["myapex"],
12044 }
12045
12046 rust_library{
12047 name: "libmyrust_transitive_dylib",
12048 crate_name: "myrust_transitive_dylib",
12049 srcs: ["src/lib.rs"],
12050 apex_available: ["myapex"],
12051 }
12052
12053 rust_library {
12054 name: "libmyrust_transitive_rlib",
12055 crate_name: "myrust_transitive_rlib",
12056 srcs: ["src/lib.rs"],
12057 apex_available: ["myapex"],
12058 }
12059
12060 rust_binary {
12061 name: "myrustbin",
12062 srcs: ["src/main.rs"],
12063 apex_available: ["myapex"],
12064 }
12065
12066 cc_library {
12067 name: "libbar",
12068 sdk_version: "current",
12069 srcs: ["bar.cpp"],
12070 apex_available: ["myapex"],
12071 stl: "none",
12072 }
12073
12074 android_app {
12075 name: "myapp",
12076 jni_libs: ["libembeddedjni"],
12077 use_embedded_native_libs: true,
12078 sdk_version: "current",
12079 apex_available: ["myapex"],
12080 }
12081
12082 cc_library {
12083 name: "libembeddedjni",
12084 sdk_version: "current",
12085 srcs: ["bar.cpp"],
12086 apex_available: ["myapex"],
12087 stl: "none",
12088 }
12089
12090 cc_library {
12091 name: "libjni",
12092 sdk_version: "current",
12093 srcs: ["bar.cpp"],
12094 apex_available: ["myapex"],
12095 stl: "none",
12096 }
12097
12098 cc_library {
12099 name: "libotherapex",
12100 sdk_version: "current",
12101 srcs: ["otherapex.cpp"],
12102 apex_available: ["otherapex"],
12103 stubs: {
12104 symbol_file: "libotherapex.map.txt",
12105 versions: ["1", "2", "3"],
12106 },
12107 stl: "none",
12108 }
12109
12110 cc_library {
12111 name: "libplatform",
12112 sdk_version: "current",
12113 srcs: ["libplatform.cpp"],
12114 stubs: {
12115 symbol_file: "libplatform.map.txt",
12116 versions: ["1", "2", "3"],
12117 },
12118 stl: "none",
12119 system_shared_libs: [],
12120 }
12121 `
12122
12123 testCases := []struct {
12124 name string
12125 bpModifier func(bp *bpmodify.Blueprint)
12126 dependencyPath []string
12127 }{
12128 {
12129 name: "library dependency in other apex",
12130 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12131 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12132 },
12133 {
12134 name: "transitive library dependency in other apex",
12135 bpModifier: func(bp *bpmodify.Blueprint) {
12136 addToSharedLibs("mylib", "libbar")(bp)
12137 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12138 },
12139 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12140 },
12141 {
12142 name: "library dependency in platform",
12143 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12144 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12145 },
12146 {
12147 name: "jni library dependency in other apex",
12148 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12149 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12150 },
12151 {
12152 name: "transitive jni library dependency in other apex",
12153 bpModifier: func(bp *bpmodify.Blueprint) {
12154 addToSharedLibs("libjni", "libbar")(bp)
12155 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12156 },
12157 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12158 },
12159 {
12160 name: "jni library dependency in platform",
12161 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12162 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12163 },
12164 {
12165 name: "transitive jni library dependency in platform",
12166 bpModifier: func(bp *bpmodify.Blueprint) {
12167 addToSharedLibs("libjni", "libbar")(bp)
12168 addToSharedLibs("libbar", "libplatform#impl")(bp)
12169 },
12170 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12171 },
12172 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12173 // JNI libraries even if they came from another apex.
12174 //{
12175 // name: "app jni library dependency in other apex",
12176 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12177 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12178 //},
12179 //{
12180 // name: "transitive app jni library dependency in other apex",
12181 // bpModifier: func(bp *bpmodify.Blueprint) {
12182 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12183 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12184 // },
12185 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12186 //},
12187 //{
12188 // name: "app jni library dependency in platform",
12189 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12190 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12191 //},
12192 //{
12193 // name: "transitive app jni library dependency in platform",
12194 // bpModifier: func(bp *bpmodify.Blueprint) {
12195 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12196 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12197 // },
12198 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12199 //},
12200 {
12201 name: "binary dependency in other apex",
12202 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12203 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12204 },
12205 {
12206 name: "transitive binary dependency in other apex",
12207 bpModifier: func(bp *bpmodify.Blueprint) {
12208 addToSharedLibs("mybin", "libbar")(bp)
12209 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12210 },
12211 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12212 },
12213 {
12214 name: "binary dependency in platform",
12215 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12216 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12217 },
12218 {
12219 name: "transitive binary dependency in platform",
12220 bpModifier: func(bp *bpmodify.Blueprint) {
12221 addToSharedLibs("mybin", "libbar")(bp)
12222 addToSharedLibs("libbar", "libplatform#impl")(bp)
12223 },
12224 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12225 },
12226
12227 {
12228 name: "rust library dependency in other apex",
12229 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12230 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12231 },
12232 {
12233 name: "transitive rust library dependency in other apex",
12234 bpModifier: func(bp *bpmodify.Blueprint) {
12235 addToSharedLibs("libmyrust", "libbar")(bp)
12236 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12237 },
12238 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12239 },
12240 {
12241 name: "rust library dependency in platform",
12242 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12243 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12244 },
12245 {
12246 name: "transitive rust library dependency in platform",
12247 bpModifier: func(bp *bpmodify.Blueprint) {
12248 addToSharedLibs("libmyrust", "libbar")(bp)
12249 addToSharedLibs("libbar", "libplatform#impl")(bp)
12250 },
12251 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12252 },
12253 {
12254 name: "transitive rust library dylib dependency in other apex",
12255 bpModifier: func(bp *bpmodify.Blueprint) {
12256 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12257 },
12258 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12259 },
12260 {
12261 name: "transitive rust library dylib dependency in platform",
12262 bpModifier: func(bp *bpmodify.Blueprint) {
12263 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12264 },
12265 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12266 },
12267 {
12268 name: "transitive rust library rlib dependency in other apex",
12269 bpModifier: func(bp *bpmodify.Blueprint) {
12270 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12271 },
12272 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12273 },
12274 {
12275 name: "transitive rust library rlib dependency in platform",
12276 bpModifier: func(bp *bpmodify.Blueprint) {
12277 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12278 },
12279 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12280 },
12281 {
12282 name: "rust binary dependency in other apex",
12283 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12284 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12285 },
12286 {
12287 name: "transitive rust binary dependency in other apex",
12288 bpModifier: func(bp *bpmodify.Blueprint) {
12289 addToSharedLibs("myrustbin", "libbar")(bp)
12290 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12291 },
12292 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12293 },
12294 {
12295 name: "rust binary dependency in platform",
12296 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12297 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12298 },
12299 {
12300 name: "transitive rust binary dependency in platform",
12301 bpModifier: func(bp *bpmodify.Blueprint) {
12302 addToSharedLibs("myrustbin", "libbar")(bp)
12303 addToSharedLibs("libbar", "libplatform#impl")(bp)
12304 },
12305 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12306 },
12307 }
12308
12309 for _, testCase := range testCases {
12310 t.Run(testCase.name, func(t *testing.T) {
12311 t.Parallel()
12312 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12313 if err != nil {
12314 t.Fatal(err)
12315 }
12316 if testCase.bpModifier != nil {
12317 func() {
12318 defer func() {
12319 if r := recover(); r != nil {
12320 t.Fatalf("panic in bpModifier: %v", r)
12321 }
12322 }()
12323 testCase.bpModifier(bp)
12324 }()
12325 }
12326 android.GroupFixturePreparers(
12327 android.PrepareForTestWithAndroidBuildComponents,
12328 cc.PrepareForTestWithCcBuildComponents,
12329 java.PrepareForTestWithDexpreopt,
12330 rust.PrepareForTestWithRustDefaultModules,
12331 PrepareForTestWithApexBuildComponents,
12332 prepareForTestWithMyapex,
12333 prepareForTestWithOtherapex,
12334 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12335 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12336 }),
12337 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12338 RunTestWithBp(t, bp.String())
12339 })
12340 }
12341}